Spelunx Cavern SDK
 
Loading...
Searching...
No Matches
FiniteStateMachine.cs
Go to the documentation of this file.
1using System.Collections.Generic;
2using UnityEngine;
3
4public abstract class State : ScriptableObject
5{
6 public abstract string GetName();
7 public virtual void OnEnter(FiniteStateMachine fsm, GameObject target) { }
8 public virtual void OnUpdate(FiniteStateMachine fsm, GameObject target) { }
9 public virtual void OnLateUpdate(FiniteStateMachine fsm, GameObject target) { }
10 public virtual void OnExit(FiniteStateMachine fsm, GameObject target) { }
11}
12
13public class FiniteStateMachine : MonoBehaviour
14{
15 [SerializeField] private State[] states = new State[0];
16 [SerializeField] private string initialState = "";
17
18 private Dictionary<string, State> runtimeStates = new Dictionary<string, State>();
19 private string currentState = "";
20 private string nextState = "";
21
22 public void Awake()
23 {
24 // Make a copy of each state so that each instance of FiniteStateMachine's data is independent.
25 nextState = initialState;
26 for (int i = 0; i < states.Length; ++i)
27 {
28 State state = Instantiate(states[i]);
29 runtimeStates.Add(state.GetName(), Instantiate(state));
30 }
31 }
32
33 public string GetInitialState() { return initialState; }
34 public string GetCurrentState() { return currentState; }
35 public bool HasState(string stateName) { return runtimeStates.ContainsKey(stateName); }
36 public void ChangeState(string nextState) { this.nextState = nextState; }
37
38 private void Update()
39 {
40 // Transit state.
41 if (nextState != currentState)
42 {
43 // Exit current state.
44 if (runtimeStates.ContainsKey(currentState))
45 {
46 runtimeStates[currentState].OnExit(this, gameObject);
47 }
48
49 // Enter next state.
50 currentState = nextState;
51 if (runtimeStates.ContainsKey(currentState))
52 {
53 runtimeStates[currentState].OnEnter(this, gameObject);
54 }
55 }
56
57 // Update current state.
58 if (runtimeStates.ContainsKey(currentState))
59 {
60 runtimeStates[currentState].OnUpdate(this, gameObject);
61 }
62 }
63
64 private void LateUpdate()
65 {
66 // LateUpdate current state.
67 if (runtimeStates.ContainsKey(currentState))
68 {
69 runtimeStates[currentState].OnLateUpdate(this, gameObject);
70 }
71 }
72}
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)