BITKit/Packages/Runtime~/Unity/Common/Scripts/StateMachine/MonoStateMachine.cs

68 lines
2.1 KiB
C#
Raw Normal View History

2023-06-05 19:57:17 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace BITKit.StateMachine
{
[System.Serializable]
public abstract class MonoStateMachine<TState> : IStateMachine<TState>, IMonoProxy, IStart, IUpdate
where TState : IState
{
[Header(Constant.Header.Settings)]
public string name;
[Header(Constant.Header.Settings)]
[SerializeField, SerializeReference, SubclassSelector]
TState currentState;
public TState CurrentState
{
get => currentState;
set => currentState = value;
}
[Header(Constant.Header.Components)]
[SerializeReference, SubclassSelector] public List<TState> states = new();
2023-06-29 14:57:11 +08:00
public IDictionary<System.Type, TState> StateDictonary { get; } = new Dictionary<Type, TState>();
2023-06-05 19:57:17 +08:00
public IStateMachine<TState> StateMachine => this as IStateMachine<TState>;
TState tempState;
public virtual void OnStart()
{
foreach (var state in states)
{
//state.TransitionState = InternalTransitionState;
state.Initialize();
StateDictonary.Add(state.GetType(), state);
}
if (states.Count > 0)
{
var index = states[0];
StateMachine.TransitionState(index);
}
}
public virtual void ExitState()
{
CurrentState?.OnStateExit(CurrentState, null);
CurrentState = default;
}
public virtual void RecoveryState()
{
if (tempState is not null)
{
StateMachine.TransitionState(tempState);
}
else
{
StateMachine.TransitionState(states[0]);
}
}
public virtual void OnUpdate(float deltaTime)
{
CurrentState?.OnStateUpdate();
}
void InternalTransitionState(IState state)
{
if (state is TState tState)
{
StateMachine.TransitionState(tState);
}
}
}
}