using Cysharp.Threading.Tasks; namespace Framework { // implement a finite state machine class public interface IState { bool exitFinished { get; } void OnEnter(); void OnUpdate(float deltaTime); void OnExit(); } public class StateMachine { private IState _currentState; private IState _previousState; public async UniTask ChangeState(IState newState) { if (_currentState != null) { _currentState.OnExit(); while (!_currentState.exitFinished) { UniTask.NextFrame(); } } _previousState = _currentState; _currentState = newState; _currentState?.OnEnter(); } public void Update(float deltaTime) { if (_currentState != null) { _currentState.OnUpdate(deltaTime); } } public void RevertToPreviousState() { ChangeState(_previousState); } public IState GetCurrentState() { return _currentState; } } }