using System.Collections.Generic; using Cysharp.Threading.Tasks; using UnityEngine; namespace Stary.Evo { public interface IFsmSystemAsync { FSMIStateAsync CurState { get; set; } void AddState(FSMIStateAsync state); void RemoveState(FSMIStateAsync state); UniTask SetCurState(string name); UniTask SetCurState(string name, object param); UniTask SetCurState(string name, T param); UniTask SetCurState(string name, T1 param1, T2 param2); FSMIStateAsync GetStateWithName(string name); HashMap States { get; set; } } public class FsmSystemAsync : IFsmSystemAsync { public FSMIStateAsync CurState { get; set; } public HashMap States { get; set; } public FsmSystemAsync() { States = new HashMap(); AddState(new DefaultStateAsync(this)); } public void AddState(FSMIStateAsync state) { Debug.Log(state.Name); if (!States.ContainsKey(state.Name)) { States.Add(state.Name, state); } else { Debug.LogErrorFormat("States状态机容器里已存在名字为--【{0}】--的状态", state.Name.ToString()); } } public void RemoveState(FSMIStateAsync state) { if (States.ContainsKey(state.Name)) { States.Remove(state.Name); } else { Debug.LogErrorFormat("States状态机容器里不存在名字为--【{0}】--的状态", state.Name.ToString()); } } /// /// 普通状态切换,适用于无参 /// /// public async UniTask SetCurState(string name) { if (CurState != null) await CurState.OnExitAsync(); FSMIStateAsync state = GetStateWithName(name); CurState = state; CurState.OnEnterAsync(); } /// /// 异步状态切换,适用于有参 /// /// /// /// public async UniTask SetCurState(string name, object param) { if (CurState != null) { await CurState.OnExitAsync(); } FSMIStateAsync state = GetStateWithName(name); CurState = state; await CurState.OnEnterAsync(param); } /// /// 异步状态切换,适用于有参 /// /// /// /// public async UniTask SetCurState(string name, T param) { if (CurState != null) { await CurState.OnExitAsync(); } FSMIStateAsync state = GetStateWithName(name); CurState = state; await CurState.OnEnterAsync(param); } /// /// 异步状态切换,适用于有参 /// /// /// /// /// /// public async UniTask SetCurState(string name, T1 param1, T2 param2) { if (CurState != null) { await CurState.OnExitAsync(); } FSMIStateAsync state = GetStateWithName(name); CurState = state; await CurState.OnEnterAsync(param1, param2); } public FSMIStateAsync GetStateWithName(string name) { if (States.ContainsKey(name)) { return States[name]; } return null; } } }