1using System.Collections.Generic;
4public abstract class State : ScriptableObject
15 [SerializeField]
private State[] states =
new State[0];
16 [SerializeField]
private string initialState =
"";
18 private Dictionary<string, State> runtimeStates =
new Dictionary<string, State>();
19 private string currentState =
"";
20 private string nextState =
"";
25 nextState = initialState;
26 for (
int i = 0; i < states.Length; ++i)
28 State state = Instantiate(states[i]);
29 runtimeStates.Add(state.
GetName(), Instantiate(state));
35 public bool HasState(
string stateName) {
return runtimeStates.ContainsKey(stateName); }
36 public void ChangeState(
string nextState) { this.nextState = nextState; }
41 if (nextState != currentState)
44 if (runtimeStates.ContainsKey(currentState))
46 runtimeStates[currentState].OnExit(
this, gameObject);
50 currentState = nextState;
51 if (runtimeStates.ContainsKey(currentState))
53 runtimeStates[currentState].OnEnter(
this, gameObject);
58 if (runtimeStates.ContainsKey(currentState))
60 runtimeStates[currentState].OnUpdate(
this, gameObject);
64 private void LateUpdate()
67 if (runtimeStates.ContainsKey(currentState))
69 runtimeStates[currentState].OnLateUpdate(
this, gameObject);
void ChangeState(string nextState)
bool HasState(string stateName)
virtual void OnUpdate(FiniteStateMachine fsm, GameObject target)
abstract string GetName()
virtual void OnEnter(FiniteStateMachine fsm, GameObject target)
virtual void OnExit(FiniteStateMachine fsm, GameObject target)
virtual void OnLateUpdate(FiniteStateMachine fsm, GameObject target)