All delegate events are refactored to use the Event<TSender> and Event<TSender, TArgument> for performance issues regarding delegate events creating garbage, also this gives us better control on event invocation since C# Delegates did also create unnecessary garbage during Delegate.DynamicInvoke
51 lines
1.5 KiB
C#
51 lines
1.5 KiB
C#
using Syntriax.Engine.Core;
|
|
|
|
namespace Syntriax.Engine.Systems.StateMachine;
|
|
|
|
public abstract class StateBehaviourBase : Behaviour, IState
|
|
{
|
|
public Event<IState> OnStateUpdate { get; } = new();
|
|
public Event<IState, IState.StateTransitionedFromArguments> OnStateTransitionedFrom { get; } = new();
|
|
public Event<IState, IState.StateTransitionedToArguments> OnStateTransitionedTo { get; } = new();
|
|
public Event<IState, IState.StateTransitionReadyArguments> OnStateTransitionReady { get; } = new();
|
|
public Event<INameable, INameable.NameChangedArguments> OnNameChanged { get; } = new();
|
|
|
|
private string _name = string.Empty;
|
|
public string Name
|
|
{
|
|
get => _name;
|
|
set
|
|
{
|
|
if (_name.CompareTo(value) == 0)
|
|
return;
|
|
|
|
string previousName = _name;
|
|
_name = value;
|
|
OnNameChanged?.Invoke(this, new(previousName));
|
|
}
|
|
}
|
|
|
|
protected virtual void OnUpdateState() { }
|
|
public void Update()
|
|
{
|
|
OnUpdateState();
|
|
OnStateUpdate?.Invoke(this);
|
|
}
|
|
|
|
protected virtual void OnTransitionedToState(IState from) { }
|
|
public void TransitionTo(IState from)
|
|
{
|
|
OnTransitionedToState(from);
|
|
OnStateTransitionedTo?.Invoke(this, new(from));
|
|
}
|
|
|
|
protected virtual void OnTransitionedFromState(IState to) { }
|
|
public void TransitionFrom(IState to)
|
|
{
|
|
OnTransitionedFromState(to);
|
|
OnStateTransitionedFrom?.Invoke(this, new(to));
|
|
}
|
|
|
|
public abstract IState? GetNextState();
|
|
}
|