using Syntriax.Engine.Core; namespace Syntriax.Engine.StateMachine; public abstract class StateBehaviourBase : Behaviour, IState { public event IState.StateUpdateEventHandler? OnStateUpdate = null; public event IState.StateTransitionedFromEventHandler? OnStateTransitionedFrom = null; public event IState.StateTransitionedToEventHandler? OnStateTransitionedTo = null; public abstract event IState.StateTransitionReadyEventHandler? OnStateTransitionReady; public abstract string Name { get; } protected virtual void OnUpdateState() { } public void Update() { OnUpdateState(); OnStateUpdate?.InvokeSafe(this); } protected virtual void OnTransitionedToState(IState from) { } public void TransitionTo(IState from) { OnTransitionedToState(from); OnStateTransitionedTo?.InvokeSafe(this, from); } protected virtual void OnTransitionedFromState(IState to) { } public void TransitionFrom(IState to) { OnTransitionedFromState(to); OnStateTransitionedFrom?.InvokeSafe(this, to); } public abstract IState? GetNextState(); }