From b0559ec6be0407855cedadf4287732451e4cc3fe Mon Sep 17 00:00:00 2001 From: ALEXTANG <574809918@qq.com> Date: Mon, 3 Apr 2023 14:49:38 +0800 Subject: [PATCH] FsmComponent FsmComponent --- .../Editor/Inspector/FsmComponentInspector.cs | 43 ++ .../Inspector/FsmComponentInspector.cs.meta | 3 + Assets/TEngine/Runtime/GameFramework/Fsm.meta | 3 + .../TEngine/Runtime/GameFramework/Fsm/Fsm.cs | 555 ++++++++++++++++++ .../Runtime/GameFramework/Fsm/Fsm.cs.meta | 3 + .../Runtime/GameFramework/Fsm/FsmBase.cs | 106 ++++ .../Runtime/GameFramework/Fsm/FsmBase.cs.meta | 3 + .../Runtime/GameFramework/Fsm/FsmComponent.cs | 259 ++++++++ .../GameFramework/Fsm/FsmComponent.cs.meta | 3 + .../Runtime/GameFramework/Fsm/FsmManager.cs | 404 +++++++++++++ .../GameFramework/Fsm/FsmManager.cs.meta | 3 + .../Runtime/GameFramework/Fsm/FsmState.cs | 103 ++++ .../GameFramework/Fsm/FsmState.cs.meta | 3 + .../TEngine/Runtime/GameFramework/Fsm/IFsm.cs | 158 +++++ .../Runtime/GameFramework/Fsm/IFsm.cs.meta | 3 + .../Runtime/GameFramework/Fsm/IFsmManager.cs | 174 ++++++ .../GameFramework/Fsm/IFsmManager.cs.meta | 3 + 17 files changed, 1829 insertions(+) create mode 100644 Assets/TEngine/Editor/Inspector/FsmComponentInspector.cs create mode 100644 Assets/TEngine/Editor/Inspector/FsmComponentInspector.cs.meta create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm.meta create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm/Fsm.cs create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm/Fsm.cs.meta create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm/FsmBase.cs create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm/FsmBase.cs.meta create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm/FsmComponent.cs create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm/FsmComponent.cs.meta create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm/FsmManager.cs create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm/FsmManager.cs.meta create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm/FsmState.cs create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm/FsmState.cs.meta create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm/IFsm.cs create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm/IFsm.cs.meta create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm/IFsmManager.cs create mode 100644 Assets/TEngine/Runtime/GameFramework/Fsm/IFsmManager.cs.meta diff --git a/Assets/TEngine/Editor/Inspector/FsmComponentInspector.cs b/Assets/TEngine/Editor/Inspector/FsmComponentInspector.cs new file mode 100644 index 00000000..32c18ca0 --- /dev/null +++ b/Assets/TEngine/Editor/Inspector/FsmComponentInspector.cs @@ -0,0 +1,43 @@ +using UnityEditor; + +namespace TEngine.Editor.Inspector +{ + [CustomEditor(typeof(FsmComponent))] + internal sealed class FsmComponentInspector : GameFrameworkInspector + { + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + + if (!EditorApplication.isPlaying) + { + EditorGUILayout.HelpBox("Available during runtime only.", MessageType.Info); + return; + } + + FsmComponent t = (FsmComponent)target; + + if (IsPrefabInHierarchy(t.gameObject)) + { + EditorGUILayout.LabelField("FSM Count", t.Count.ToString()); + + FsmBase[] fsms = t.GetAllFsms(); + foreach (FsmBase fsm in fsms) + { + DrawFsm(fsm); + } + } + + Repaint(); + } + + private void OnEnable() + { + } + + private void DrawFsm(FsmBase fsm) + { + EditorGUILayout.LabelField(fsm.FullName, fsm.IsRunning ? Utility.Text.Format("{0}, {1:F1} s", fsm.CurrentStateName, fsm.CurrentStateTime) : (fsm.IsDestroyed ? "Destroyed" : "Not Running")); + } + } +} diff --git a/Assets/TEngine/Editor/Inspector/FsmComponentInspector.cs.meta b/Assets/TEngine/Editor/Inspector/FsmComponentInspector.cs.meta new file mode 100644 index 00000000..a8dec657 --- /dev/null +++ b/Assets/TEngine/Editor/Inspector/FsmComponentInspector.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1c11a8085df74853a698b707f9d5d87f +timeCreated: 1680504546 \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm.meta b/Assets/TEngine/Runtime/GameFramework/Fsm.meta new file mode 100644 index 00000000..9b5291c0 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6e93f024b1a142e2bd1afe53ad9c2941 +timeCreated: 1680503869 \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm/Fsm.cs b/Assets/TEngine/Runtime/GameFramework/Fsm/Fsm.cs new file mode 100644 index 00000000..d81634ce --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm/Fsm.cs @@ -0,0 +1,555 @@ +using System; +using System.Collections.Generic; + +namespace TEngine +{ + /// + /// 有限状态机。 + /// + /// 有限状态机持有者类型。 + internal sealed class Fsm : FsmBase, IMemory, IFsm where T : class + { + private T m_Owner; + private readonly Dictionary> m_States; + private Dictionary m_Datas; + private FsmState m_CurrentState; + private float m_CurrentStateTime; + private bool m_IsDestroyed; + + /// + /// 初始化有限状态机的新实例。 + /// + public Fsm() + { + m_Owner = null; + m_States = new Dictionary>(); + m_Datas = null; + m_CurrentState = null; + m_CurrentStateTime = 0f; + m_IsDestroyed = true; + } + + /// + /// 获取有限状态机持有者。 + /// + public T Owner + { + get + { + return m_Owner; + } + } + + /// + /// 获取有限状态机持有者类型。 + /// + public override Type OwnerType + { + get + { + return typeof(T); + } + } + + /// + /// 获取有限状态机中状态的数量。 + /// + public override int FsmStateCount + { + get + { + return m_States.Count; + } + } + + /// + /// 获取有限状态机是否正在运行。 + /// + public override bool IsRunning + { + get + { + return m_CurrentState != null; + } + } + + /// + /// 获取有限状态机是否被销毁。 + /// + public override bool IsDestroyed + { + get + { + return m_IsDestroyed; + } + } + + /// + /// 获取当前有限状态机状态。 + /// + public FsmState CurrentState + { + get + { + return m_CurrentState; + } + } + + /// + /// 获取当前有限状态机状态名称。 + /// + public override string CurrentStateName + { + get + { + return m_CurrentState != null ? m_CurrentState.GetType().FullName : null; + } + } + + /// + /// 获取当前有限状态机状态持续时间。 + /// + public override float CurrentStateTime + { + get + { + return m_CurrentStateTime; + } + } + + /// + /// 创建有限状态机。 + /// + /// 有限状态机名称。 + /// 有限状态机持有者。 + /// 有限状态机状态集合。 + /// 创建的有限状态机。 + public static Fsm Create(string name, T owner, params FsmState[] states) + { + if (owner == null) + { + throw new GameFrameworkException("FSM owner is invalid."); + } + + if (states == null || states.Length < 1) + { + throw new GameFrameworkException("FSM states is invalid."); + } + + Fsm fsm = MemoryPool.Acquire>(); + fsm.Name = name; + fsm.m_Owner = owner; + fsm.m_IsDestroyed = false; + foreach (FsmState state in states) + { + if (state == null) + { + throw new GameFrameworkException("FSM states is invalid."); + } + + Type stateType = state.GetType(); + if (fsm.m_States.ContainsKey(stateType)) + { + throw new GameFrameworkException(Utility.Text.Format("FSM '{0}' state '{1}' is already exist.", new TypeNamePair(typeof(T), name), stateType.FullName)); + } + + fsm.m_States.Add(stateType, state); + state.OnInit(fsm); + } + + return fsm; + } + + /// + /// 创建有限状态机。 + /// + /// 有限状态机名称。 + /// 有限状态机持有者。 + /// 有限状态机状态集合。 + /// 创建的有限状态机。 + public static Fsm Create(string name, T owner, List> states) + { + if (owner == null) + { + throw new GameFrameworkException("FSM owner is invalid."); + } + + if (states == null || states.Count < 1) + { + throw new GameFrameworkException("FSM states is invalid."); + } + + Fsm fsm = MemoryPool.Acquire>(); + fsm.Name = name; + fsm.m_Owner = owner; + fsm.m_IsDestroyed = false; + foreach (FsmState state in states) + { + if (state == null) + { + throw new GameFrameworkException("FSM states is invalid."); + } + + Type stateType = state.GetType(); + if (fsm.m_States.ContainsKey(stateType)) + { + throw new GameFrameworkException(Utility.Text.Format("FSM '{0}' state '{1}' is already exist.", new TypeNamePair(typeof(T), name), stateType.FullName)); + } + + fsm.m_States.Add(stateType, state); + state.OnInit(fsm); + } + + return fsm; + } + + /// + /// 清理有限状态机。 + /// + public void Clear() + { + if (m_CurrentState != null) + { + m_CurrentState.OnLeave(this, true); + } + + foreach (KeyValuePair> state in m_States) + { + state.Value.OnDestroy(this); + } + + Name = null; + m_Owner = null; + m_States.Clear(); + + m_Datas.Clear(); + + m_CurrentState = null; + m_CurrentStateTime = 0f; + m_IsDestroyed = true; + } + + /// + /// 开始有限状态机。 + /// + /// 要开始的有限状态机状态类型。 + public void Start() where TState : FsmState + { + if (IsRunning) + { + throw new GameFrameworkException("FSM is running, can not start again."); + } + + FsmState state = GetState(); + if (state == null) + { + throw new GameFrameworkException(Utility.Text.Format("FSM '{0}' can not start state '{1}' which is not exist.", new TypeNamePair(typeof(T), Name), typeof(TState).FullName)); + } + + m_CurrentStateTime = 0f; + m_CurrentState = state; + m_CurrentState.OnEnter(this); + } + + /// + /// 开始有限状态机。 + /// + /// 要开始的有限状态机状态类型。 + public void Start(Type stateType) + { + if (IsRunning) + { + throw new GameFrameworkException("FSM is running, can not start again."); + } + + if (stateType == null) + { + throw new GameFrameworkException("State type is invalid."); + } + + if (!typeof(FsmState).IsAssignableFrom(stateType)) + { + throw new GameFrameworkException(Utility.Text.Format("State type '{0}' is invalid.", stateType.FullName)); + } + + FsmState state = GetState(stateType); + if (state == null) + { + throw new GameFrameworkException(Utility.Text.Format("FSM '{0}' can not start state '{1}' which is not exist.", new TypeNamePair(typeof(T), Name), stateType.FullName)); + } + + m_CurrentStateTime = 0f; + m_CurrentState = state; + m_CurrentState.OnEnter(this); + } + + /// + /// 是否存在有限状态机状态。 + /// + /// 要检查的有限状态机状态类型。 + /// 是否存在有限状态机状态。 + public bool HasState() where TState : FsmState + { + return m_States.ContainsKey(typeof(TState)); + } + + /// + /// 是否存在有限状态机状态。 + /// + /// 要检查的有限状态机状态类型。 + /// 是否存在有限状态机状态。 + public bool HasState(Type stateType) + { + if (stateType == null) + { + throw new GameFrameworkException("State type is invalid."); + } + + if (!typeof(FsmState).IsAssignableFrom(stateType)) + { + throw new GameFrameworkException(Utility.Text.Format("State type '{0}' is invalid.", stateType.FullName)); + } + + return m_States.ContainsKey(stateType); + } + + /// + /// 获取有限状态机状态。 + /// + /// 要获取的有限状态机状态类型。 + /// 要获取的有限状态机状态。 + public TState GetState() where TState : FsmState + { + FsmState state = null; + if (m_States.TryGetValue(typeof(TState), out state)) + { + return (TState)state; + } + + return null; + } + + /// + /// 获取有限状态机状态。 + /// + /// 要获取的有限状态机状态类型。 + /// 要获取的有限状态机状态。 + public FsmState GetState(Type stateType) + { + if (stateType == null) + { + throw new GameFrameworkException("State type is invalid."); + } + + if (!typeof(FsmState).IsAssignableFrom(stateType)) + { + throw new GameFrameworkException(Utility.Text.Format("State type '{0}' is invalid.", stateType.FullName)); + } + + FsmState state = null; + if (m_States.TryGetValue(stateType, out state)) + { + return state; + } + + return null; + } + + /// + /// 获取有限状态机的所有状态。 + /// + /// 有限状态机的所有状态。 + public FsmState[] GetAllStates() + { + int index = 0; + FsmState[] results = new FsmState[m_States.Count]; + foreach (KeyValuePair> state in m_States) + { + results[index++] = state.Value; + } + + return results; + } + + /// + /// 获取有限状态机的所有状态。 + /// + /// 有限状态机的所有状态。 + public void GetAllStates(List> results) + { + if (results == null) + { + throw new GameFrameworkException("Results is invalid."); + } + + results.Clear(); + foreach (KeyValuePair> state in m_States) + { + results.Add(state.Value); + } + } + + /// + /// 是否存在有限状态机数据。 + /// + /// 有限状态机数据名称。 + /// 有限状态机数据是否存在。 + public bool HasData(string name) + { + if (string.IsNullOrEmpty(name)) + { + throw new GameFrameworkException("Data name is invalid."); + } + + if (m_Datas == null) + { + return false; + } + + return m_Datas.ContainsKey(name); + } + + /// + /// 获取有限状态机数据。 + /// + /// 要获取的有限状态机数据的类型。 + /// 有限状态机数据名称。 + /// 要获取的有限状态机数据。 + public TData GetData(string name) + { + return (TData)GetData(name); + } + + /// + /// 获取有限状态机数据。 + /// + /// 有限状态机数据名称。 + /// 要获取的有限状态机数据。 + public object GetData(string name) + { + if (string.IsNullOrEmpty(name)) + { + throw new GameFrameworkException("Data name is invalid."); + } + + if (m_Datas == null) + { + return null; + } + + if (m_Datas.TryGetValue(name, out var data)) + { + return data; + } + + return null; + } + + /// + /// 设置有限状态机数据。 + /// + /// 要设置的有限状态机数据的类型。 + /// 有限状态机数据名称。 + /// 要设置的有限状态机数据。 + public void SetData(string name, TData data) + { + SetData(name, (object)data); + } + + /// + /// 设置有限状态机数据。 + /// + /// 有限状态机数据名称。 + /// 要设置的有限状态机数据。 + public void SetData(string name, object data) + { + if (string.IsNullOrEmpty(name)) + { + throw new GameFrameworkException("Data name is invalid."); + } + + if (m_Datas == null) + { + m_Datas = new Dictionary(StringComparer.Ordinal); + } + + m_Datas[name] = data; + } + + /// + /// 移除有限状态机数据。 + /// + /// 有限状态机数据名称。 + /// 是否移除有限状态机数据成功。 + public bool RemoveData(string name) + { + if (string.IsNullOrEmpty(name)) + { + throw new GameFrameworkException("Data name is invalid."); + } + + if (m_Datas == null) + { + return false; + } + + return m_Datas.Remove(name); + } + + /// + /// 有限状态机轮询。 + /// + /// 逻辑流逝时间,以秒为单位。 + /// 真实流逝时间,以秒为单位。 + internal override void Update(float elapseSeconds, float realElapseSeconds) + { + if (m_CurrentState == null) + { + return; + } + + m_CurrentStateTime += elapseSeconds; + m_CurrentState.OnUpdate(this, elapseSeconds, realElapseSeconds); + } + + /// + /// 关闭并清理有限状态机。 + /// + internal override void Shutdown() + { + MemoryPool.Release(this); + } + + /// + /// 切换当前有限状态机状态。 + /// + /// 要切换到的有限状态机状态类型。 + internal void ChangeState() where TState : FsmState + { + ChangeState(typeof(TState)); + } + + /// + /// 切换当前有限状态机状态。 + /// + /// 要切换到的有限状态机状态类型。 + internal void ChangeState(Type stateType) + { + if (m_CurrentState == null) + { + throw new GameFrameworkException("Current state is invalid."); + } + + FsmState state = GetState(stateType); + if (state == null) + { + throw new GameFrameworkException(Utility.Text.Format("FSM '{0}' can not change state to '{1}' which is not exist.", new TypeNamePair(typeof(T), Name), stateType.FullName)); + } + + m_CurrentState.OnLeave(this, false); + m_CurrentStateTime = 0f; + m_CurrentState = state; + m_CurrentState.OnEnter(this); + } + } +} diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm/Fsm.cs.meta b/Assets/TEngine/Runtime/GameFramework/Fsm/Fsm.cs.meta new file mode 100644 index 00000000..e6441f29 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm/Fsm.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3706fab38c144cd5a30f5b14946e22e5 +timeCreated: 1680503869 \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm/FsmBase.cs b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmBase.cs new file mode 100644 index 00000000..07fe692e --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmBase.cs @@ -0,0 +1,106 @@ +using System; + +namespace TEngine +{ + /// + /// 有限状态机基类。 + /// + public abstract class FsmBase + { + private string m_Name; + + /// + /// 初始化有限状态机基类的新实例。 + /// + public FsmBase() + { + m_Name = string.Empty; + } + + /// + /// 获取有限状态机名称。 + /// + public string Name + { + get + { + return m_Name; + } + protected set + { + m_Name = value ?? string.Empty; + } + } + + /// + /// 获取有限状态机完整名称。 + /// + public string FullName + { + get + { + return new TypeNamePair(OwnerType, m_Name).ToString(); + } + } + + /// + /// 获取有限状态机持有者类型。 + /// + public abstract Type OwnerType + { + get; + } + + /// + /// 获取有限状态机中状态的数量。 + /// + public abstract int FsmStateCount + { + get; + } + + /// + /// 获取有限状态机是否正在运行。 + /// + public abstract bool IsRunning + { + get; + } + + /// + /// 获取有限状态机是否被销毁。 + /// + public abstract bool IsDestroyed + { + get; + } + + /// + /// 获取当前有限状态机状态名称。 + /// + public abstract string CurrentStateName + { + get; + } + + /// + /// 获取当前有限状态机状态持续时间。 + /// + public abstract float CurrentStateTime + { + get; + } + + /// + /// 有限状态机轮询。 + /// + /// 逻辑流逝时间,以秒为单位。 + /// 当前已流逝时间,以秒为单位。 + internal abstract void Update(float elapseSeconds, float realElapseSeconds); + + /// + /// 关闭并清理有限状态机。 + /// + internal abstract void Shutdown(); + } +} diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm/FsmBase.cs.meta b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmBase.cs.meta new file mode 100644 index 00000000..2c0e2b0c --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmBase.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c9096cb538b149d08ca95c78f651c111 +timeCreated: 1680503870 \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm/FsmComponent.cs b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmComponent.cs new file mode 100644 index 00000000..6e5cb0a6 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmComponent.cs @@ -0,0 +1,259 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace TEngine +{ + /// + /// 有限状态机组件。 + /// + [DisallowMultipleComponent] + public sealed class FsmComponent : GameFrameworkComponent + { + private IFsmManager m_FsmManager = null; + + /// + /// 获取有限状态机数量。 + /// + public int Count + { + get + { + return m_FsmManager.Count; + } + } + + /// + /// 游戏框架组件初始化。 + /// + protected override void Awake() + { + base.Awake(); + + m_FsmManager = GameFrameworkEntry.GetModule(); + if (m_FsmManager == null) + { + Log.Fatal("FSM manager is invalid."); + return; + } + } + + private void Start() + { + } + + /// + /// 检查是否存在有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 是否存在有限状态机。 + public bool HasFsm() where T : class + { + return m_FsmManager.HasFsm(); + } + + /// + /// 检查是否存在有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 是否存在有限状态机。 + public bool HasFsm(Type ownerType) + { + return m_FsmManager.HasFsm(ownerType); + } + + /// + /// 检查是否存在有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 是否存在有限状态机。 + public bool HasFsm(string name) where T : class + { + return m_FsmManager.HasFsm(name); + } + + /// + /// 检查是否存在有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 是否存在有限状态机。 + public bool HasFsm(Type ownerType, string name) + { + return m_FsmManager.HasFsm(ownerType, name); + } + + /// + /// 获取有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要获取的有限状态机。 + public IFsm GetFsm() where T : class + { + return m_FsmManager.GetFsm(); + } + + /// + /// 获取有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要获取的有限状态机。 + public FsmBase GetFsm(Type ownerType) + { + return m_FsmManager.GetFsm(ownerType); + } + + /// + /// 获取有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 要获取的有限状态机。 + public IFsm GetFsm(string name) where T : class + { + return m_FsmManager.GetFsm(name); + } + + /// + /// 获取有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 要获取的有限状态机。 + public FsmBase GetFsm(Type ownerType, string name) + { + return m_FsmManager.GetFsm(ownerType, name); + } + + /// + /// 获取所有有限状态机。 + /// + public FsmBase[] GetAllFsms() + { + return m_FsmManager.GetAllFsms(); + } + + /// + /// 获取所有有限状态机。 + /// + /// 所有有限状态机。 + public void GetAllFsms(List results) + { + m_FsmManager.GetAllFsms(results); + } + + /// + /// 创建有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机持有者。 + /// 有限状态机状态集合。 + /// 要创建的有限状态机。 + public IFsm CreateFsm(T owner, params FsmState[] states) where T : class + { + return m_FsmManager.CreateFsm(owner, states); + } + + /// + /// 创建有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 有限状态机持有者。 + /// 有限状态机状态集合。 + /// 要创建的有限状态机。 + public IFsm CreateFsm(string name, T owner, params FsmState[] states) where T : class + { + return m_FsmManager.CreateFsm(name, owner, states); + } + + /// + /// 创建有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机持有者。 + /// 有限状态机状态集合。 + /// 要创建的有限状态机。 + public IFsm CreateFsm(T owner, List> states) where T : class + { + return m_FsmManager.CreateFsm(owner, states); + } + + /// + /// 创建有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 有限状态机持有者。 + /// 有限状态机状态集合。 + /// 要创建的有限状态机。 + public IFsm CreateFsm(string name, T owner, List> states) where T : class + { + return m_FsmManager.CreateFsm(name, owner, states); + } + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 是否销毁有限状态机成功。 + public bool DestroyFsm() where T : class + { + return m_FsmManager.DestroyFsm(); + } + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 是否销毁有限状态机成功。 + public bool DestroyFsm(Type ownerType) + { + return m_FsmManager.DestroyFsm(ownerType); + } + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要销毁的有限状态机名称。 + /// 是否销毁有限状态机成功。 + public bool DestroyFsm(string name) where T : class + { + return m_FsmManager.DestroyFsm(name); + } + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要销毁的有限状态机名称。 + /// 是否销毁有限状态机成功。 + public bool DestroyFsm(Type ownerType, string name) + { + return m_FsmManager.DestroyFsm(ownerType, name); + } + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要销毁的有限状态机。 + /// 是否销毁有限状态机成功。 + public bool DestroyFsm(IFsm fsm) where T : class + { + return m_FsmManager.DestroyFsm(fsm); + } + + /// + /// 销毁有限状态机。 + /// + /// 要销毁的有限状态机。 + /// 是否销毁有限状态机成功。 + public bool DestroyFsm(FsmBase fsm) + { + return m_FsmManager.DestroyFsm(fsm); + } + } +} diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm/FsmComponent.cs.meta b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmComponent.cs.meta new file mode 100644 index 00000000..91eee924 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmComponent.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 351f97b231854e659f0b7af89d8478c6 +timeCreated: 1680504514 \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm/FsmManager.cs b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmManager.cs new file mode 100644 index 00000000..ed34ac9f --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmManager.cs @@ -0,0 +1,404 @@ +using System; +using System.Collections.Generic; + +namespace TEngine +{ + /// + /// 有限状态机管理器。 + /// + internal sealed class FsmManager : GameFrameworkModule, IFsmManager + { + private readonly Dictionary m_Fsms; + private readonly List m_TempFsms; + + /// + /// 初始化有限状态机管理器的新实例。 + /// + public FsmManager() + { + m_Fsms = new Dictionary(); + m_TempFsms = new List(); + } + + /// + /// 获取游戏框架模块优先级。 + /// + /// 优先级较高的模块会优先轮询,并且关闭操作会后进行。 + internal override int Priority + { + get + { + return 1; + } + } + + /// + /// 获取有限状态机数量。 + /// + public int Count + { + get + { + return m_Fsms.Count; + } + } + + /// + /// 有限状态机管理器轮询。 + /// + /// 逻辑流逝时间,以秒为单位。 + /// 真实流逝时间,以秒为单位。 + internal override void Update(float elapseSeconds, float realElapseSeconds) + { + m_TempFsms.Clear(); + if (m_Fsms.Count <= 0) + { + return; + } + + foreach (KeyValuePair fsm in m_Fsms) + { + m_TempFsms.Add(fsm.Value); + } + + foreach (FsmBase fsm in m_TempFsms) + { + if (fsm.IsDestroyed) + { + continue; + } + + fsm.Update(elapseSeconds, realElapseSeconds); + } + } + + /// + /// 关闭并清理有限状态机管理器。 + /// + internal override void Shutdown() + { + foreach (KeyValuePair fsm in m_Fsms) + { + fsm.Value.Shutdown(); + } + + m_Fsms.Clear(); + m_TempFsms.Clear(); + } + + /// + /// 检查是否存在有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 是否存在有限状态机。 + public bool HasFsm() where T : class + { + return InternalHasFsm(new TypeNamePair(typeof(T))); + } + + /// + /// 检查是否存在有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 是否存在有限状态机。 + public bool HasFsm(Type ownerType) + { + if (ownerType == null) + { + throw new GameFrameworkException("Owner type is invalid."); + } + + return InternalHasFsm(new TypeNamePair(ownerType)); + } + + /// + /// 检查是否存在有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 是否存在有限状态机。 + public bool HasFsm(string name) where T : class + { + return InternalHasFsm(new TypeNamePair(typeof(T), name)); + } + + /// + /// 检查是否存在有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 是否存在有限状态机。 + public bool HasFsm(Type ownerType, string name) + { + if (ownerType == null) + { + throw new GameFrameworkException("Owner type is invalid."); + } + + return InternalHasFsm(new TypeNamePair(ownerType, name)); + } + + /// + /// 获取有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要获取的有限状态机。 + public IFsm GetFsm() where T : class + { + return (IFsm)InternalGetFsm(new TypeNamePair(typeof(T))); + } + + /// + /// 获取有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要获取的有限状态机。 + public FsmBase GetFsm(Type ownerType) + { + if (ownerType == null) + { + throw new GameFrameworkException("Owner type is invalid."); + } + + return InternalGetFsm(new TypeNamePair(ownerType)); + } + + /// + /// 获取有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 要获取的有限状态机。 + public IFsm GetFsm(string name) where T : class + { + return (IFsm)InternalGetFsm(new TypeNamePair(typeof(T), name)); + } + + /// + /// 获取有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 要获取的有限状态机。 + public FsmBase GetFsm(Type ownerType, string name) + { + if (ownerType == null) + { + throw new GameFrameworkException("Owner type is invalid."); + } + + return InternalGetFsm(new TypeNamePair(ownerType, name)); + } + + /// + /// 获取所有有限状态机。 + /// + /// 所有有限状态机。 + public FsmBase[] GetAllFsms() + { + int index = 0; + FsmBase[] results = new FsmBase[m_Fsms.Count]; + foreach (KeyValuePair fsm in m_Fsms) + { + results[index++] = fsm.Value; + } + + return results; + } + + /// + /// 获取所有有限状态机。 + /// + /// 所有有限状态机。 + public void GetAllFsms(List results) + { + if (results == null) + { + throw new GameFrameworkException("Results is invalid."); + } + + results.Clear(); + foreach (KeyValuePair fsm in m_Fsms) + { + results.Add(fsm.Value); + } + } + + /// + /// 创建有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机持有者。 + /// 有限状态机状态集合。 + /// 要创建的有限状态机。 + public IFsm CreateFsm(T owner, params FsmState[] states) where T : class + { + return CreateFsm(string.Empty, owner, states); + } + + /// + /// 创建有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 有限状态机持有者。 + /// 有限状态机状态集合。 + /// 要创建的有限状态机。 + public IFsm CreateFsm(string name, T owner, params FsmState[] states) where T : class + { + TypeNamePair typeNamePair = new TypeNamePair(typeof(T), name); + if (HasFsm(name)) + { + throw new GameFrameworkException(Utility.Text.Format("Already exist FSM '{0}'.", typeNamePair)); + } + + Fsm fsm = Fsm.Create(name, owner, states); + m_Fsms.Add(typeNamePair, fsm); + return fsm; + } + + /// + /// 创建有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机持有者。 + /// 有限状态机状态集合。 + /// 要创建的有限状态机。 + public IFsm CreateFsm(T owner, List> states) where T : class + { + return CreateFsm(string.Empty, owner, states); + } + + /// + /// 创建有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 有限状态机持有者。 + /// 有限状态机状态集合。 + /// 要创建的有限状态机。 + public IFsm CreateFsm(string name, T owner, List> states) where T : class + { + TypeNamePair typeNamePair = new TypeNamePair(typeof(T), name); + if (HasFsm(name)) + { + throw new GameFrameworkException(Utility.Text.Format("Already exist FSM '{0}'.", typeNamePair)); + } + + Fsm fsm = Fsm.Create(name, owner, states); + m_Fsms.Add(typeNamePair, fsm); + return fsm; + } + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 是否销毁有限状态机成功。 + public bool DestroyFsm() where T : class + { + return InternalDestroyFsm(new TypeNamePair(typeof(T))); + } + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 是否销毁有限状态机成功。 + public bool DestroyFsm(Type ownerType) + { + if (ownerType == null) + { + throw new GameFrameworkException("Owner type is invalid."); + } + + return InternalDestroyFsm(new TypeNamePair(ownerType)); + } + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要销毁的有限状态机名称。 + /// 是否销毁有限状态机成功。 + public bool DestroyFsm(string name) where T : class + { + return InternalDestroyFsm(new TypeNamePair(typeof(T), name)); + } + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要销毁的有限状态机名称。 + /// 是否销毁有限状态机成功。 + public bool DestroyFsm(Type ownerType, string name) + { + if (ownerType == null) + { + throw new GameFrameworkException("Owner type is invalid."); + } + + return InternalDestroyFsm(new TypeNamePair(ownerType, name)); + } + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要销毁的有限状态机。 + /// 是否销毁有限状态机成功。 + public bool DestroyFsm(IFsm fsm) where T : class + { + if (fsm == null) + { + throw new GameFrameworkException("FSM is invalid."); + } + + return InternalDestroyFsm(new TypeNamePair(typeof(T), fsm.Name)); + } + + /// + /// 销毁有限状态机。 + /// + /// 要销毁的有限状态机。 + /// 是否销毁有限状态机成功。 + public bool DestroyFsm(FsmBase fsm) + { + if (fsm == null) + { + throw new GameFrameworkException("FSM is invalid."); + } + + return InternalDestroyFsm(new TypeNamePair(fsm.OwnerType, fsm.Name)); + } + + private bool InternalHasFsm(TypeNamePair typeNamePair) + { + return m_Fsms.ContainsKey(typeNamePair); + } + + private FsmBase InternalGetFsm(TypeNamePair typeNamePair) + { + FsmBase fsm = null; + if (m_Fsms.TryGetValue(typeNamePair, out fsm)) + { + return fsm; + } + + return null; + } + + private bool InternalDestroyFsm(TypeNamePair typeNamePair) + { + FsmBase fsm = null; + if (m_Fsms.TryGetValue(typeNamePair, out fsm)) + { + fsm.Shutdown(); + return m_Fsms.Remove(typeNamePair); + } + + return false; + } + } +} diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm/FsmManager.cs.meta b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmManager.cs.meta new file mode 100644 index 00000000..4711ad2f --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 839a80bc3c4f454f9718609ca8cded3e +timeCreated: 1680503870 \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm/FsmState.cs b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmState.cs new file mode 100644 index 00000000..1f87e2f5 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmState.cs @@ -0,0 +1,103 @@ +using System; + +namespace TEngine +{ + /// + /// 有限状态机状态基类。 + /// + /// 有限状态机持有者类型。 + public abstract class FsmState where T : class + { + /// + /// 初始化有限状态机状态基类的新实例。 + /// + public FsmState() + { + } + + /// + /// 有限状态机状态初始化时调用。 + /// + /// 有限状态机引用。 + protected internal virtual void OnInit(IFsm fsm) + { + } + + /// + /// 有限状态机状态进入时调用。 + /// + /// 有限状态机引用。 + protected internal virtual void OnEnter(IFsm fsm) + { + } + + /// + /// 有限状态机状态轮询时调用。 + /// + /// 有限状态机引用。 + /// 逻辑流逝时间,以秒为单位。 + /// 真实流逝时间,以秒为单位。 + protected internal virtual void OnUpdate(IFsm fsm, float elapseSeconds, float realElapseSeconds) + { + } + + /// + /// 有限状态机状态离开时调用。 + /// + /// 有限状态机引用。 + /// 是否是关闭有限状态机时触发。 + protected internal virtual void OnLeave(IFsm fsm, bool isShutdown) + { + } + + /// + /// 有限状态机状态销毁时调用。 + /// + /// 有限状态机引用。 + protected internal virtual void OnDestroy(IFsm fsm) + { + } + + /// + /// 切换当前有限状态机状态。 + /// + /// 要切换到的有限状态机状态类型。 + /// 有限状态机引用。 + protected void ChangeState(IFsm fsm) where TState : FsmState + { + Fsm fsmImplement = (Fsm)fsm; + if (fsmImplement == null) + { + throw new GameFrameworkException("FSM is invalid."); + } + + fsmImplement.ChangeState(); + } + + /// + /// 切换当前有限状态机状态。 + /// + /// 有限状态机引用。 + /// 要切换到的有限状态机状态类型。 + protected void ChangeState(IFsm fsm, Type stateType) + { + Fsm fsmImplement = (Fsm)fsm; + if (fsmImplement == null) + { + throw new GameFrameworkException("FSM is invalid."); + } + + if (stateType == null) + { + throw new GameFrameworkException("State type is invalid."); + } + + if (!typeof(FsmState).IsAssignableFrom(stateType)) + { + throw new GameFrameworkException(Utility.Text.Format("State type '{0}' is invalid.", stateType.FullName)); + } + + fsmImplement.ChangeState(stateType); + } + } +} diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm/FsmState.cs.meta b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmState.cs.meta new file mode 100644 index 00000000..25258053 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm/FsmState.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 45ba0a93666a491296ffd4abfaec75e8 +timeCreated: 1680503870 \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm/IFsm.cs b/Assets/TEngine/Runtime/GameFramework/Fsm/IFsm.cs new file mode 100644 index 00000000..7b41e2a0 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm/IFsm.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; + +namespace TEngine +{ + /// + /// 有限状态机接口。 + /// + /// 有限状态机持有者类型。 + public interface IFsm where T : class + { + /// + /// 获取有限状态机名称。 + /// + string Name + { + get; + } + + /// + /// 获取有限状态机完整名称。 + /// + string FullName + { + get; + } + + /// + /// 获取有限状态机持有者。 + /// + T Owner + { + get; + } + + /// + /// 获取有限状态机中状态的数量。 + /// + int FsmStateCount + { + get; + } + + /// + /// 获取有限状态机是否正在运行。 + /// + bool IsRunning + { + get; + } + + /// + /// 获取有限状态机是否被销毁。 + /// + bool IsDestroyed + { + get; + } + + /// + /// 获取当前有限状态机状态。 + /// + FsmState CurrentState + { + get; + } + + /// + /// 获取当前有限状态机状态持续时间。 + /// + float CurrentStateTime + { + get; + } + + /// + /// 开始有限状态机。 + /// + /// 要开始的有限状态机状态类型。 + void Start() where TState : FsmState; + + /// + /// 开始有限状态机。 + /// + /// 要开始的有限状态机状态类型。 + void Start(Type stateType); + + /// + /// 是否存在有限状态机状态。 + /// + /// 要检查的有限状态机状态类型。 + /// 是否存在有限状态机状态。 + bool HasState() where TState : FsmState; + + /// + /// 是否存在有限状态机状态。 + /// + /// 要检查的有限状态机状态类型。 + /// 是否存在有限状态机状态。 + bool HasState(Type stateType); + + /// + /// 获取有限状态机状态。 + /// + /// 要获取的有限状态机状态类型。 + /// 要获取的有限状态机状态。 + TState GetState() where TState : FsmState; + + /// + /// 获取有限状态机状态。 + /// + /// 要获取的有限状态机状态类型。 + /// 要获取的有限状态机状态。 + FsmState GetState(Type stateType); + + /// + /// 获取有限状态机的所有状态。 + /// + /// 有限状态机的所有状态。 + FsmState[] GetAllStates(); + + /// + /// 获取有限状态机的所有状态。 + /// + /// 有限状态机的所有状态。 + void GetAllStates(List> results); + + /// + /// 是否存在有限状态机数据。 + /// + /// 有限状态机数据名称。 + /// 有限状态机数据是否存在。 + bool HasData(string name); + + /// + /// 获取有限状态机数据。 + /// + /// 要获取的有限状态机数据的类型。 + /// 有限状态机数据名称。 + /// 要获取的有限状态机数据。 + TData GetData(string name); + + /// + /// 设置有限状态机数据。 + /// + /// 要设置的有限状态机数据的类型。 + /// 有限状态机数据名称。 + /// 要设置的有限状态机数据。 + void SetData(string name, TData data); + + /// + /// 移除有限状态机数据。 + /// + /// 有限状态机数据名称。 + /// 是否移除有限状态机数据成功。 + bool RemoveData(string name); + } +} diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm/IFsm.cs.meta b/Assets/TEngine/Runtime/GameFramework/Fsm/IFsm.cs.meta new file mode 100644 index 00000000..b0c94df1 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm/IFsm.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 675620bfcf2643e4a58641c33ce1537e +timeCreated: 1680503870 \ No newline at end of file diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm/IFsmManager.cs b/Assets/TEngine/Runtime/GameFramework/Fsm/IFsmManager.cs new file mode 100644 index 00000000..1a06b804 --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm/IFsmManager.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections.Generic; + +namespace TEngine +{ + /// + /// 有限状态机管理器。 + /// + public interface IFsmManager + { + /// + /// 获取有限状态机数量。 + /// + int Count + { + get; + } + + /// + /// 检查是否存在有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 是否存在有限状态机。 + bool HasFsm() where T : class; + + /// + /// 检查是否存在有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 是否存在有限状态机。 + bool HasFsm(Type ownerType); + + /// + /// 检查是否存在有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 是否存在有限状态机。 + bool HasFsm(string name) where T : class; + + /// + /// 检查是否存在有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 是否存在有限状态机。 + bool HasFsm(Type ownerType, string name); + + /// + /// 获取有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要获取的有限状态机。 + IFsm GetFsm() where T : class; + + /// + /// 获取有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要获取的有限状态机。 + FsmBase GetFsm(Type ownerType); + + /// + /// 获取有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 要获取的有限状态机。 + IFsm GetFsm(string name) where T : class; + + /// + /// 获取有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 要获取的有限状态机。 + FsmBase GetFsm(Type ownerType, string name); + + /// + /// 获取所有有限状态机。 + /// + /// 所有有限状态机。 + FsmBase[] GetAllFsms(); + + /// + /// 获取所有有限状态机。 + /// + /// 所有有限状态机。 + void GetAllFsms(List results); + + /// + /// 创建有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机持有者。 + /// 有限状态机状态集合。 + /// 要创建的有限状态机。 + IFsm CreateFsm(T owner, params FsmState[] states) where T : class; + + /// + /// 创建有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 有限状态机持有者。 + /// 有限状态机状态集合。 + /// 要创建的有限状态机。 + IFsm CreateFsm(string name, T owner, params FsmState[] states) where T : class; + + /// + /// 创建有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机持有者。 + /// 有限状态机状态集合。 + /// 要创建的有限状态机。 + IFsm CreateFsm(T owner, List> states) where T : class; + + /// + /// 创建有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 有限状态机名称。 + /// 有限状态机持有者。 + /// 有限状态机状态集合。 + /// 要创建的有限状态机。 + IFsm CreateFsm(string name, T owner, List> states) where T : class; + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 是否销毁有限状态机成功。 + bool DestroyFsm() where T : class; + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 是否销毁有限状态机成功。 + bool DestroyFsm(Type ownerType); + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要销毁的有限状态机名称。 + /// 是否销毁有限状态机成功。 + bool DestroyFsm(string name) where T : class; + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要销毁的有限状态机名称。 + /// 是否销毁有限状态机成功。 + bool DestroyFsm(Type ownerType, string name); + + /// + /// 销毁有限状态机。 + /// + /// 有限状态机持有者类型。 + /// 要销毁的有限状态机。 + /// 是否销毁有限状态机成功。 + bool DestroyFsm(IFsm fsm) where T : class; + + /// + /// 销毁有限状态机。 + /// + /// 要销毁的有限状态机。 + /// 是否销毁有限状态机成功。 + bool DestroyFsm(FsmBase fsm); + } +} diff --git a/Assets/TEngine/Runtime/GameFramework/Fsm/IFsmManager.cs.meta b/Assets/TEngine/Runtime/GameFramework/Fsm/IFsmManager.cs.meta new file mode 100644 index 00000000..807fd02d --- /dev/null +++ b/Assets/TEngine/Runtime/GameFramework/Fsm/IFsmManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2c9f1536f7484d609c882586db2dc855 +timeCreated: 1680503870 \ No newline at end of file