using System; using System.Collections.Generic; using UnityEngine; namespace XFFSM { /// /// 状态节点 /// public class FSMStateNode { #region 字段 /// /// 状态数据 /// public FSMStateNodeData data; internal RuntimeFSMControllerInstance instance; private List states = new List(); internal string lastState; internal string nextState; /// /// 是否正在执行中 /// internal bool isRuning = false; internal bool isFirstEnter = true; [Tooltip("当前状态名称Hash,可通过方法Animator.StringToHash()转换!")] public int nameHash; #endregion #region 方法 internal FSMStateNode(FSMStateNodeData data,RuntimeFSMControllerInstance instance) { this.data = data; this.instance = instance; nameHash = Animator.StringToHash(data.name); states.Clear(); foreach (var item in this.data.StateScripts) { Type type = AssemblyTools.GetType(item.className); FSMState state = null; if (type != null) state = Activator.CreateInstance(type) as FSMState; if (state != null) { state.controller = instance.FSMController; state.userData = instance.FSMController.userData; state.currentStateInfo = this; states.Add(state); } } } internal void OnEnter() { isRuning = true; foreach (var item in this.states) { item.lastState = lastState; item.nextState = nextState; if (isFirstEnter) item.OnCreate(); // 调用 OnCreate 的方法 item.OnEnter(); } isFirstEnter = false; } internal void OnExit() { foreach (var item in this.states) { item.lastState = lastState; item.nextState = nextState; item.OnExit(); } isRuning = false; } internal void OnUpdate() { foreach (var item in this.states) { item.OnUpdate(); } } internal void OnFixedUpdate() { foreach (var item in this.states) { item.OnFixedUpdate(); } } internal void OnLateUpdate() { foreach (var item in this.states) { item.OnLateUpdate(); } } #endregion } }