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