-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathStateMachine.cs
More file actions
98 lines (81 loc) · 3.11 KB
/
StateMachine.cs
File metadata and controls
98 lines (81 loc) · 3.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using System;
using System.Collections.Generic;
namespace SFI.GameStates
{
public class StateMachine
{
private List<StateTransition> _stateTransitions = new List<StateTransition>();
private List<StateTransition> _anyStateTransitions = new List<StateTransition>();
public event Action<IState> OnStateChanged;
private IState _currentState;
public object CurrentState => _currentState;
public IState PreviousState;
public IState manuallySetState;
public StateTransition manuallySetTransition;
public void AddAnyTransition(IState to, Func<bool> condition)
{
var stateTransition = new StateTransition(null, to, condition);
_anyStateTransitions.Add(stateTransition);
}
public StateTransition AddTransition(IState from, IState to, Func<bool> condition)
{
var stateTransition = new StateTransition(from, to, condition);
_stateTransitions.Add(stateTransition);
return stateTransition;
}
public void SetState(IState state)
{
if (_currentState == state) return;
//if it doesn't exist, do nothing. else exit
_currentState?.OnExit();
_currentState = state;
// Debug.Log($"Changed to {state}");
// Debug.LogError($"Changed to {state}");
_currentState.OnEnter();
OnStateChanged?.Invoke(_currentState);
PreviousState = _currentState;
}
public void Tick()
{
StateTransition transition = CheckForTransition();
if (transition != null)
{
SetState(transition.To);
}
_currentState.Tick();
}
public void ManuallySetState(IState stateToTransitionTo)
{
if (stateToTransitionTo == _currentState) return;
for (int i = 0; i < _stateTransitions.Count; i++)
{
if (_stateTransitions[i].From == _currentState)
{
manuallySetState = stateToTransitionTo;
manuallySetTransition = AddTransition(_currentState, stateToTransitionTo, ()=> this.manuallySetState!=null && this.manuallySetTransition!=null);
break;
}
}
}
public StateTransition CheckForTransition()
{
foreach (var transition in _anyStateTransitions)
{
if (transition.Condition())
return transition;
}
foreach (var transition in _stateTransitions)
{
if (transition.From == _currentState && transition.Condition())
{
return transition;
}
}
return null;
}
public IState GetStartingTransition()
{
return _stateTransitions[0].From;
}
}
}