using System; using System.Collections; using System.Collections.Generic; using BITKit.StateMachine; using UnityEngine; namespace BITKit { public abstract class StateBasedMonoBehaviour : MonoBehaviour, IStateMachine where T : IState { [SerializeField] private MonoStateMachine stateMachine; protected Transform Transform => _transform ? _transform : _transform = transform; private Transform _transform; public bool Enabled { get => stateMachine.Enabled; set => stateMachine.Enabled = value; } public T CurrentState { get => stateMachine.CurrentState; set => stateMachine.CurrentState = value; } public event Action OnStateChanged { add => stateMachine.OnStateChanged += value; remove => stateMachine.OnStateChanged -= value; } public event Action OnStateRegistered; public event Action OnStateUnRegistered; public IDictionary StateDictionary => stateMachine.StateDictionary; public virtual void Initialize() { stateMachine.Initialize(); } public virtual void UpdateState(float deltaTime) { stateMachine.UpdateState(deltaTime); } public virtual void DisposeState() { stateMachine.DisposeState(); } public virtual void TransitionState() where State : T { stateMachine.TransitionState(); } public virtual void TransitionState(T state) { stateMachine.TransitionState(state); } public virtual void Register(T newState) => StateMachineUtils.Register(this,newState); public virtual void UnRegister(T newState)=>StateMachineUtils.UnRegister(this,newState); void IStateMachine.InvokeOnStateRegistered(T state) { OnStateRegistered?.Invoke(state); } void IStateMachine.InvokeOnStateUnRegistered(T state) { OnStateUnRegistered?.Invoke(state); } } }