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; }
}
}