51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using Engine.Core;
 | 
						|
 | 
						|
namespace 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();
 | 
						|
}
 |