Created
January 16, 2019 07:01
-
-
Save KzoNag/1f90d6dbd682c22e676da5af95b2b434 to your computer and use it in GitHub Desktop.
Unityで使う簡単なステートマシン的な実装
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
using System.Linq; | |
using System.Collections; | |
using System.Collections.Generic; | |
public class StateMachine | |
{ | |
public abstract class BaseState | |
{ | |
public virtual void OnRegister (MonoBehaviour behaviour) { } | |
public virtual void OnStateEnter (MonoBehaviour behaviour) { } | |
public virtual void OnStateExit (MonoBehaviour behaviour) { } | |
public virtual bool OnStateUpdate (MonoBehaviour behaviour) { return true; } | |
} | |
public delegate string StateExitHandler (string exitStateName, BaseState exitState); | |
private Dictionary<string, BaseState> stateMap = new Dictionary<string, BaseState> (); | |
private MonoBehaviour behaviour; | |
public string CurrentStateName { get; private set; } | |
public BaseState CurrentState { get; private set; } | |
public StateExitHandler OnStateExit; | |
public StateMachine (MonoBehaviour behaviour) | |
{ | |
this.behaviour = behaviour; | |
} | |
public bool RegisterState (string stateName, BaseState state) | |
{ | |
if (string.IsNullOrEmpty (stateName) || stateMap.ContainsKey (stateName) || state == null) | |
{ | |
return false; | |
} | |
stateMap [stateName] = state; | |
state.OnRegister (behaviour); | |
return true; | |
} | |
public bool Start (string firstStateName) | |
{ | |
if (!stateMap.ContainsKey (firstStateName)) | |
{ | |
return false; | |
} | |
EnterState (firstStateName); | |
return true; | |
} | |
public void Update () | |
{ | |
if (CurrentState == null) { return; } | |
bool exit = CurrentState.OnStateUpdate (behaviour); | |
if (exit) | |
{ | |
string nextStateName = ExitState (); | |
EnterState (nextStateName); | |
} | |
} | |
private void EnterState (string stateName) | |
{ | |
if (!string.IsNullOrEmpty(stateName) && stateMap.ContainsKey (stateName)) | |
{ | |
CurrentStateName = stateName; | |
CurrentState = stateMap [stateName]; | |
CurrentState.OnStateEnter (behaviour); | |
} | |
} | |
private string ExitState () | |
{ | |
string nextStateName = null; | |
if (CurrentState != null) | |
{ | |
CurrentState.OnStateExit (behaviour); | |
nextStateName = OnStateExit (CurrentStateName, CurrentState); | |
CurrentState = null; | |
CurrentStateName = null; | |
} | |
return nextStateName; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment