using System; using System.Collections.Generic; using MrWu.Debug; namespace GlobalSever.FSM { /// /// 有限状态机状态 /// /// public abstract class FSMState where T : class { /// /// 状态类型 /// public virtual Type StateType => this.GetType(); public virtual int StateId { get; protected set; } = -1; internal FSMState NextState; internal FSMState LastState; /// /// 持续时间, 单位毫秒 /// public int RunDuratime { get; set; } /// /// 延迟执行任务列表 /// private List _delayedActions = new List(); public FSMState() { } public FSMState(int stateId) { StateId = stateId; } /// /// 有限状态机初始化时调用 /// /// public virtual void OnInit(FSM fsm) { RunDuratime = 0; } /// /// 有限状态机进入时调用 /// /// public virtual void OnEnter(FSM fsm) { Debug.Log($"{StateType.Name} OnEnter"); } /// /// 轮训 /// /// 有限状态机 /// 时间间隔 public virtual void Update(FSM fsm, float interval) { // 处理延迟执行的任务 if (_delayedActions.Count > 0) { for (int i = _delayedActions.Count - 1; i >= 0; i--) { var delayedAction = _delayedActions[i]; delayedAction.RemainingMsTime -= (int)interval; if (delayedAction.RemainingMsTime <= 0) { delayedAction.Action?.Invoke(); _delayedActions.RemoveAt(i); } } } } /// /// 有限状态机离开时调用 /// /// public virtual void OnLeave(FSM fsm) { RunDuratime = 0; ClearDelayedActions(); Debug.Log($"{StateType.Name} OnLevel"); } /// /// 有限状态机销毁时调用 /// /// public virtual void OnDestroy(FSM fsm) { } /// /// 切换到下一个状态 /// public void ChangeNextState(FSM fsm, int delayTime = 0) { if (NextState != null) ChangeState(fsm, NextState.StateType, delayTime); } /// /// 切换状态 /// public void ChangeState(FSM fsm, FSMState state) { ChangeState(fsm, state.StateType); } /// /// 切换状态 /// /// /// public void ChangeState(FSM fsm, int delayTime = 0) where TState : FSMState { ChangeState(fsm, typeof(TState), delayTime); } /// /// 切换状态 /// /// /// public void ChangeState(FSM fsm, Type stateType, int delayTime = 0) { FSM fsmImplement = (FSM)fsm; if (stateType == null) { throw new Exception("State type is invalid."); } if (!typeof(FSMState).IsAssignableFrom(stateType)) { throw new Exception($"State type '{stateType}' is invalid."); } fsmImplement.ChangeState(stateType, delayTime); } /// /// 延迟执行Action /// /// 要执行的Action /// 延迟时间,单位毫秒 public void DelayedExecute(Action action, int delayMs) { if (action == null || delayMs <= 0) return; _delayedActions.Add(new DelayedAction { Action = action, RemainingMsTime = delayMs }); } /// /// 清除所有延迟执行的任务 /// public void ClearDelayedActions() { _delayedActions.Clear(); } } /// /// 延迟执行任务 /// internal class DelayedAction { public Action Action { get; set; } /// /// 剩余时间(ms) /// public int RemainingMsTime { get; set; } } }