/* 文件名:StateMachineClass.nut 路径:User/Object/StateMachine/StateMachineClass.nut 创建日期:2024-11-29 23:14 文件用途:状态机 */ class FiniteStateMachineClass { //状态 State = -1; //状态时间 StateTime = 0; //状态注册组 StateFuncArr = null; //条件注册组 ConditionStateArr = null; constructor() { //初始化 StateFuncArr = {}; //初始化 ConditionStateArr = {}; } //状态检查 function OnCheck(gState) { if ("OnCheck" in StateFuncArr[gState]) { local Flag = StateFuncArr[gState].OnCheck(); if (Flag) return Flag; else return false; } else return true; } //状态进入 function OnStart() { if ("OnStart" in StateFuncArr[State]) StateFuncArr[State].OnStart(); } //状态退出 function OnEnd() { if ("OnEnd" in StateFuncArr[State]) StateFuncArr[State].OnEnd(); } //状态中全帧 function OnProc(dt) { if ("OnProc" in StateFuncArr[State]) StateFuncArr[State].OnProc(dt, StateTime); } //状态中144 function OnProcFrom144(MillisecondsDuration) { if ("OnProcCon" in StateFuncArr[State]) StateFuncArr[State].OnProcCon(MillisecondsDuration); foreach(Key, Func in ConditionStateArr) { if (Func()) ChangeState(Key); } } //注册普通状态 function RegisterStaticState(StateIndex, T) { StateFuncArr.rawset(StateIndex, T); } //注册条件状态 function RegisterConditionState(StateIndex, Func) { ConditionStateArr.rawset(StateIndex, Func); } //更改状态 function ChangeState(StateIndex) { //判断有这个状态才执行 if (StateIndex in StateFuncArr) { //如果有检查 先调用检查 local Flag = OnCheck(StateIndex); //如果Flag成立 if (Flag) { //如果自身状态不等于-1 if (State != -1) { //调用状态退出 OnEnd(); } //更新状态 State = StateIndex; //重置状态时间 StateTime = 0; //调用状态进入 OnStart(); return true; } else return false; } else return false; } //Ani播放KeyFlag function ChangeAniKeyFlag(Index) { if ("OnAniKeyFlag" in StateFuncArr[State]) StateFuncArr[State].OnAniKeyFlag(Index); } //Ani播放完成回调 function ChangeAniEndFlag() { if ("OnAniEndFlag" in StateFuncArr[State]) StateFuncArr[State].OnAniEndFlag(); } //攻击到目标的回调 function ChangeOnAttack(Damager) { if ("OnAttack" in StateFuncArr[State]) StateFuncArr[State].OnAttack(Damager); } //状态机持续执行函数 144帧 function OnUpdateFrom144(MillisecondsDuration) { //如果自身状态不等于-1 if (State != -1) { //状态中144 OnProcFrom144(MillisecondsDuration); } } //状态机持续执行函数 function OnUpdate(dt) { StateTime += dt; //如果自身状态不等于-1 if (State != -1) { //状态中 OnProc(dt); } } }