50 lines
1.2 KiB
C#
50 lines
1.2 KiB
C#
using Syntriax.Engine.Core;
|
|
|
|
namespace Syntriax.Engine.StateMachine;
|
|
|
|
public class StateMachine : Behaviour
|
|
{
|
|
public event StateChangedEventHandler? OnStateChanged = null;
|
|
|
|
private IState _state = new State();
|
|
public IState State
|
|
{
|
|
get => _state;
|
|
set
|
|
{
|
|
if (_state == value)
|
|
return;
|
|
|
|
IState previousState = _state;
|
|
previousState.OnStateTransitionReady -= OnStateTransitionReady;
|
|
|
|
_state = value;
|
|
previousState.TransitionFrom(value);
|
|
value.TransitionTo(_state);
|
|
OnStateChanged?.Invoke(this, previousState, value);
|
|
|
|
value.OnStateTransitionReady += OnStateTransitionReady;
|
|
}
|
|
}
|
|
|
|
private void OnStateTransitionReady(IState sender, IState toState)
|
|
{
|
|
State = toState;
|
|
while (State.GetNextState() is IState nextState)
|
|
State = nextState;
|
|
}
|
|
|
|
protected override void OnUpdate()
|
|
{
|
|
if (State is null)
|
|
return;
|
|
|
|
while (State.GetNextState() is IState nextState)
|
|
State = nextState;
|
|
|
|
State.Update();
|
|
}
|
|
|
|
public delegate void StateChangedEventHandler(StateMachine sender, IState previousState, IState newState);
|
|
}
|