From e3afd4acac50dd9c57dd4dc9ba9df231a5520126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=93=AE?= <834207172@qq.com> Date: Thu, 10 Apr 2025 11:20:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9fsm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RunTime/Abstract.meta | 2 +- .../RunTime/Abstract/IState.cs | 68 +------- .../03.FiniteStateMachine/RunTime/Base.meta | 2 +- .../RunTime/Base/FSMController.cs | 135 ---------------- .../RunTime/Base/IFSMController.cs | 93 +++++++++++ ...troller.cs.meta => IFSMController.cs.meta} | 0 .../RunTime/FiniteStateMachine.RunTime.asmdef | 3 +- .../FiniteStateMachine.RunTime.asmdef.meta | 2 +- Assets/03.FiniteStateMachine/RunTime/Use.meta | 2 +- .../RunTime/Use/FSMExtension.cs | 53 +++++++ ...nitialize.cs.meta => FSMExtension.cs.meta} | 0 .../RunTime/Use/FSMInitialize.cs | 50 ------ .../RunTime/Use/FSMManager.cs | 150 ------------------ .../RunTime/Use/IFSMManager.cs | 70 ++++++++ ...FSMManager.cs.meta => IFSMManager.cs.meta} | 0 Assets/03.FiniteStateMachine/package.json | 2 +- 16 files changed, 229 insertions(+), 403 deletions(-) delete mode 100644 Assets/03.FiniteStateMachine/RunTime/Base/FSMController.cs create mode 100644 Assets/03.FiniteStateMachine/RunTime/Base/IFSMController.cs rename Assets/03.FiniteStateMachine/RunTime/Base/{FSMController.cs.meta => IFSMController.cs.meta} (100%) create mode 100644 Assets/03.FiniteStateMachine/RunTime/Use/FSMExtension.cs rename Assets/03.FiniteStateMachine/RunTime/Use/{FSMInitialize.cs.meta => FSMExtension.cs.meta} (100%) delete mode 100644 Assets/03.FiniteStateMachine/RunTime/Use/FSMInitialize.cs delete mode 100644 Assets/03.FiniteStateMachine/RunTime/Use/FSMManager.cs create mode 100644 Assets/03.FiniteStateMachine/RunTime/Use/IFSMManager.cs rename Assets/03.FiniteStateMachine/RunTime/Use/{FSMManager.cs.meta => IFSMManager.cs.meta} (100%) diff --git a/Assets/03.FiniteStateMachine/RunTime/Abstract.meta b/Assets/03.FiniteStateMachine/RunTime/Abstract.meta index 1ded10e..db46e50 100644 --- a/Assets/03.FiniteStateMachine/RunTime/Abstract.meta +++ b/Assets/03.FiniteStateMachine/RunTime/Abstract.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 <<<<<<<< HEAD:Assets/05.TableTextConversion/RunTime/Abstract.meta -guid: 3f4958b2707b1874fb59e045842881b7 +guid: d5e1ba5da7a7031428c195b18d385b42 ======== guid: a4c1b2e6dc7695646be9fd2a98863529 >>>>>>>> 03.FiniteStateMachine:Assets/03.FiniteStateMachine/RunTime/Abstract.meta diff --git a/Assets/03.FiniteStateMachine/RunTime/Abstract/IState.cs b/Assets/03.FiniteStateMachine/RunTime/Abstract/IState.cs index b5ce039..a8822b6 100644 --- a/Assets/03.FiniteStateMachine/RunTime/Abstract/IState.cs +++ b/Assets/03.FiniteStateMachine/RunTime/Abstract/IState.cs @@ -4,84 +4,28 @@ using UnityEngine; namespace Stary.Evo.FiniteStateMachine { - public interface IState + public interface IFSMIState { - public FSMController Machine { get; set; } + IFSMManager FsmManager { get; } + string Name { get; } public void OnEnter(); public void OnExit(); public void Update(); public void FixedUpdate(); - public void OnInit(); public void OnDestory(); } - public abstract class AbstractState : IState + public abstract class AbstractState : IFSMIState { - public FSMController Machine { get; set; } + public IFSMManager FsmManager { get; } + public string Name { get; } public abstract void OnEnter(); public abstract void OnExit(); public abstract void Update(); public abstract void FixedUpdate(); - public abstract void OnInit(); public abstract void OnDestory(); } - /// - /// 状态中具体行为: - /// (OnInitAction:初始化) - /// (OnEnterAction:进入) - /// (UpdateAction:循环) - /// (FixedUpdateAction:后循环) - /// (OnExitAction:离开) - /// (OnDestoryAction:销毁) - /// - public struct StateDateAction - { - public System.Action OnEnterAction; - public System.Action OnExitAction; - public System.Action UpdateAction; - public System.Action FixedUpdateAction; - public System.Action OnInitAction; - public System.Action OnDestoryAction; - } - /// - /// 单个状态 - /// - public class SingleState : AbstractState - { - public StateDateAction stateDate; - public bool IsRunning; - - public override void FixedUpdate() - { - stateDate.FixedUpdateAction?.Invoke(); - } - - public override void OnDestory() - { - stateDate.OnDestoryAction?.Invoke(); - } - - public override void OnEnter() - { - stateDate.OnEnterAction?.Invoke(); - } - - public override void OnExit() - { - stateDate.OnExitAction?.Invoke(); - } - - public override void OnInit() - { - stateDate.OnInitAction?.Invoke(); - } - - public override void Update() - { - stateDate.UpdateAction?.Invoke(); - } - } } diff --git a/Assets/03.FiniteStateMachine/RunTime/Base.meta b/Assets/03.FiniteStateMachine/RunTime/Base.meta index 82d9915..c54d947 100644 --- a/Assets/03.FiniteStateMachine/RunTime/Base.meta +++ b/Assets/03.FiniteStateMachine/RunTime/Base.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 <<<<<<<< HEAD:Assets/05.TableTextConversion/RunTime/Base.meta -guid: f458924b47972e344ab95e73c17cec83 +guid: 0cf7b52f32e49cc4ba7a0727dbab7f3f ======== guid: 482775b04d27d6644bc8d880e135e6ac >>>>>>>> 03.FiniteStateMachine:Assets/03.FiniteStateMachine/RunTime/Base.meta diff --git a/Assets/03.FiniteStateMachine/RunTime/Base/FSMController.cs b/Assets/03.FiniteStateMachine/RunTime/Base/FSMController.cs deleted file mode 100644 index a0d36f9..0000000 --- a/Assets/03.FiniteStateMachine/RunTime/Base/FSMController.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; - -namespace Stary.Evo.FiniteStateMachine -{ - public class FSMController : MonoBehaviour - { - private Dictionary states = new Dictionary(); - - public void AddState(SingleState state) - { - var type = state.GetType(); - if (!states.ContainsKey(type)) - { - // 添加时初始化 - state.Machine = this; - state.OnInit(); - states.Add(type, state); - } - else - { - Debug.LogError("该FSMController中已经添加过该状态!!!"); - } - } - - /* //public bool IsRunning() where T : SingleState => IsRunning(typeof(T)); - - //public void Enter() where T : SingleState => Enter(typeof(T)); - - //public void Exit() where T : SingleState => Exit(typeof(T)); - - //public void ForceEnter() where T : SingleState => ForceEnter(typeof(T));*/ - - public bool IsRunning(Type type) - { - if (states.ContainsKey(type)) - { - if (states[type].IsRunning) return true; - } - else - { - Debug.LogError("状态已不存在!!!"); - } - return false; - } - - public void Enter(Type type) - { - if (states.ContainsKey(type)) - { - if (IsRunning(type)) - { - Debug.LogError("该状态正在进行,无法再次进入!!!"); - return; - } - ForceEnter(type); - } - else - { - Debug.LogError("状态已不存在!!!"); - } - - } - - public void ForceEnter(Type type) - { - if (states.ContainsKey(type)) - { - SingleState state = states[type]; - state.OnEnter(); - state.IsRunning = true; - } - else - { - Debug.LogError("状态已不存在!!!"); - } - } - - public void Exit(Type type) - { - if (states.TryGetValue(type, out SingleState state)) - { - if (!IsRunning(type)) return; - state.IsRunning = false; - state.OnExit(); - } - else - { - Debug.LogError("状态已不存在!!!"); - } - - } - - public void ExitAll() - { - foreach (var state in states) - { - if (state.Value.IsRunning) Exit(state.Key); - } - } - - private void Update() - { - foreach (var state in states) - { - if (state.Value.IsRunning) state.Value.Update(); - } - } - - private void FixedUpdate() - { - foreach (var state in states) - { - if (state.Value.IsRunning) state.Value.FixedUpdate(); - } - } - - private void OnDestroy() - { - ExitAll(); - // 遍历字典中的每个状态 - foreach (var key in states.Keys.ToList()) - { - states[key].OnDestory(); - // 将每个值设置为 null,释放引用 - states[key] = null; - } - // 清空字典 - states.Clear(); - } - } -} \ No newline at end of file diff --git a/Assets/03.FiniteStateMachine/RunTime/Base/IFSMController.cs b/Assets/03.FiniteStateMachine/RunTime/Base/IFSMController.cs new file mode 100644 index 0000000..d05aebf --- /dev/null +++ b/Assets/03.FiniteStateMachine/RunTime/Base/IFSMController.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +namespace Stary.Evo.FiniteStateMachine +{ + public interface IFSMController + { + void Initialize(); + void AddState(IFSMIState state); + void RemoveState(IFSMIState state); + } + public abstract class FSMController : MonoBehaviour,IFSMController + { + private IFSMManager manager; + + + public void Start() + { + manager = new FSMManager(); + Initialize(); + } + + public void AddState(IFSMIState state) + { + if (manager != null) + { + manager.AddState(state); + } + else + { + Debug.LogError("FSMManager未初始化!!"); + } + } + public void RemoveState(IFSMIState state) + { + if (manager != null) + { + manager.RemoveState(state); + } + else + { + Debug.LogError("FSMManager未初始化!!"); + } + } + /// + /// FSM在此类中初始化,进行状态的添加等操作 + /// + public abstract void Initialize(); + private void Update() + { + if (manager != null) + { + manager.CurState.Update(); + } + else + { + Debug.LogError("FSMManager未初始化!!"); + } + } + + private void FixedUpdate() + { + if (manager != null) + { + manager.CurState.FixedUpdate(); + } + else + { + Debug.LogError("FSMManager未初始化!!"); + } + } + + private void OnDestroy() + { + if (manager != null) + { + foreach (var state in manager. States) + { + state.Value.OnDestory(); + } + } + else + { + Debug.LogError("FSMManager未初始化!!"); + } + } + + + } +} \ No newline at end of file diff --git a/Assets/03.FiniteStateMachine/RunTime/Base/FSMController.cs.meta b/Assets/03.FiniteStateMachine/RunTime/Base/IFSMController.cs.meta similarity index 100% rename from Assets/03.FiniteStateMachine/RunTime/Base/FSMController.cs.meta rename to Assets/03.FiniteStateMachine/RunTime/Base/IFSMController.cs.meta diff --git a/Assets/03.FiniteStateMachine/RunTime/FiniteStateMachine.RunTime.asmdef b/Assets/03.FiniteStateMachine/RunTime/FiniteStateMachine.RunTime.asmdef index 76d724d..595a7ba 100644 --- a/Assets/03.FiniteStateMachine/RunTime/FiniteStateMachine.RunTime.asmdef +++ b/Assets/03.FiniteStateMachine/RunTime/FiniteStateMachine.RunTime.asmdef @@ -1,3 +1,4 @@ { - "name": "FiniteStateMachine.RunTime" + "name": "FiniteStateMachine.RunTime", + "references":[ "GUID:d1a793c2b6959e04ea45b972eaa369c8" ] } diff --git a/Assets/03.FiniteStateMachine/RunTime/FiniteStateMachine.RunTime.asmdef.meta b/Assets/03.FiniteStateMachine/RunTime/FiniteStateMachine.RunTime.asmdef.meta index cafbaf6..4c7e477 100644 --- a/Assets/03.FiniteStateMachine/RunTime/FiniteStateMachine.RunTime.asmdef.meta +++ b/Assets/03.FiniteStateMachine/RunTime/FiniteStateMachine.RunTime.asmdef.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 <<<<<<<< HEAD:Assets/05.TableTextConversion/Editor/Excel/I18N.meta -guid: a0ddbcdd27271534b8277ca2bddffca7 +guid: 24734379547c0af4bab49f6e45d74d94 folderAsset: yes timeCreated: 1531104110 licenseType: Pro diff --git a/Assets/03.FiniteStateMachine/RunTime/Use.meta b/Assets/03.FiniteStateMachine/RunTime/Use.meta index af34494..a4afb06 100644 --- a/Assets/03.FiniteStateMachine/RunTime/Use.meta +++ b/Assets/03.FiniteStateMachine/RunTime/Use.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 <<<<<<<< HEAD:Assets/05.TableTextConversion/RunTime/Use.meta -guid: 102768b9489625641a18c187eac264be +guid: d7a613213ec10e649a2923aa72919d23 ======== guid: bacf497398db3124994cae839e813842 >>>>>>>> 03.FiniteStateMachine:Assets/03.FiniteStateMachine/RunTime/Use.meta diff --git a/Assets/03.FiniteStateMachine/RunTime/Use/FSMExtension.cs b/Assets/03.FiniteStateMachine/RunTime/Use/FSMExtension.cs new file mode 100644 index 0000000..24917c2 --- /dev/null +++ b/Assets/03.FiniteStateMachine/RunTime/Use/FSMExtension.cs @@ -0,0 +1,53 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEngine.SceneManagement; + + +namespace Stary.Evo.FiniteStateMachine +{ + public static class FSMInitialize + { + private static Dictionary _fsmControllers = + new Dictionary(); + + + /// + /// 创建FSMController + /// + /// 返回创建的FSMController的识别Int值 + public static void CreateFSMController(Transform parent) where T : FSMController + { + if (_fsmControllers.ContainsKey(typeof(T).Name)) + { + Debug.LogError($"FSM控制器已存在!!!_key:{typeof(T).Name}"); + } + else + { + GameObject newController = new GameObject($"{typeof(T).Name}"); + newController.transform.SetParent(parent); + var controller = newController.AddComponent(); + + _fsmControllers.Add(typeof(T).Name, controller); + } + } + + /// + /// 销毁指定FSMController + /// + /// + public static void DestroyFSMController() where T : FSMController + { + if (_fsmControllers.TryGetValue(typeof(T).Name, out var controller)) + { + GameObject.Destroy(controller.gameObject); + _fsmControllers.Remove(typeof(T).Name); + } + else + { + Debug.LogError("该Id的FSMController不存在或已被销毁!!!"); + } + } + } +} \ No newline at end of file diff --git a/Assets/03.FiniteStateMachine/RunTime/Use/FSMInitialize.cs.meta b/Assets/03.FiniteStateMachine/RunTime/Use/FSMExtension.cs.meta similarity index 100% rename from Assets/03.FiniteStateMachine/RunTime/Use/FSMInitialize.cs.meta rename to Assets/03.FiniteStateMachine/RunTime/Use/FSMExtension.cs.meta diff --git a/Assets/03.FiniteStateMachine/RunTime/Use/FSMInitialize.cs b/Assets/03.FiniteStateMachine/RunTime/Use/FSMInitialize.cs deleted file mode 100644 index 992cdc0..0000000 --- a/Assets/03.FiniteStateMachine/RunTime/Use/FSMInitialize.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; -using UnityEngine.SceneManagement; - - -namespace Stary.Evo.FiniteStateMachine -{ - public static class FSMInitialize - { - /// - /// 状态机初始化 - /// - /// 指定场景 - /// - public static FSMManager Init(Scene targetScene) - { - GameObject targetObject = targetScene.GetRootGameObjects().FirstOrDefault(go => go.name == "FSMManger"); - FSMManager fSMManager; - - if (targetObject == null) - { - targetObject = new GameObject("FSMManger"); - SceneManager.MoveGameObjectToScene(targetObject, targetScene); - - fSMManager = new FSMManager(); - fSMManager.FSMMangerObject = targetObject; - - void OnSceneUnloaded(Scene scene) - { - // 当场景卸载时释放缓存 - if (scene.name == targetScene.name) - { - GameObject.Destroy(targetObject); - fSMManager = null; - } - } - SceneManager.sceneUnloaded += OnSceneUnloaded; - - return fSMManager; - } - else - { - Debug.LogError("场景: " + targetScene.name + "已经初始化过FSM状态机!!!"); - return null; - } - } - } -} diff --git a/Assets/03.FiniteStateMachine/RunTime/Use/FSMManager.cs b/Assets/03.FiniteStateMachine/RunTime/Use/FSMManager.cs deleted file mode 100644 index 81594ae..0000000 --- a/Assets/03.FiniteStateMachine/RunTime/Use/FSMManager.cs +++ /dev/null @@ -1,150 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - - -namespace Stary.Evo.FiniteStateMachine -{ - public class FSMManager - { - public GameObject FSMMangerObject; - private Dictionary controllers = new Dictionary(); - private Dictionary states = new Dictionary(); - private int nextControllerId = 0; - private int nextStateId = 0; - - /// - /// 创建FSMController - /// - /// 返回创建的FSMController的识别Int值 - public int CreateFSMController() - { - if (FSMMangerObject == null) - { - Debug.LogError("FSM状态机还未初始化!!!"); - return -1; - } - else - { - int id = nextControllerId++; - GameObject newController = new GameObject("FSMController" + id); - newController.transform.SetParent(FSMMangerObject.transform); - var controller = newController.AddComponent(); - controllers[id] = controller; - return id; - } - } - - /// - /// 销毁指定FSMController - /// - /// - public void DestroyFSMController(int controllerId) - { - if (controllers.TryGetValue(controllerId, out var controller)) - { - GameObject.Destroy(controller.gameObject); - controllers.Remove(controllerId); - } - else - { - Debug.LogError("该Id的FSMController不存在或已被销毁!!!"); - } - } - - /// - /// 退出指定Controller中的所有状态 - /// - /// - public void ExitAllStateInController(int controllerId) - { - if (controllers.TryGetValue(controllerId, out var controller)) - { - controller.ExitAll(); - } - else - { - Debug.LogError("该Id的FSMController不存在或已被销毁!!!"); - } - } - - /// - /// 创建状态 - /// - /// 状态挂载的ControllerId - /// 状态行为数据 - /// - public int CreateState(int controllerId, StateDateAction stateDateAction) - { - if (controllers.TryGetValue(controllerId, out var controller)) - { - // 创建state并将其添加到指定controller生命周期中 - SingleState state = new SingleState(); - state.stateDate = stateDateAction; - controller.AddState(state); - int id = nextStateId++; - states[id] = state; - return id; - - } - else - { - Debug.LogError("该Id的FSMController不存在或已被销毁,状态初始化失败!!!"); - return -1; - } - } - - /// - /// 进入指定状态 - /// - /// - public void EnterState(int stateId) - { - if (states.TryGetValue(stateId, out var state)) - { - state.Machine.Enter(state.GetType()); - } - else - { - Debug.LogError("该Id的状态不存在!!!"); - } - } - - /// - /// 离开指定状态 - /// - /// - public void ExitState(int stateId) - { - if (states.TryGetValue(stateId, out var state)) - { - state.Machine.Exit(state.GetType()); - } - else - { - Debug.LogError("该Id的状态不存在!!!"); - } - } - - /// - /// 销毁指定状态 - /// - /// - public void DestroyState(int stateId) - { - if (states.TryGetValue(stateId, out var state)) - { - states.Remove(stateId); - } - } - - // 将状态添加到FSMController - public void AddStateToController(int controllerId, int stateId) - { - if (controllers.TryGetValue(controllerId, out var controller) && states.TryGetValue(stateId, out var state)) - { - controller.AddState(state); - } - } - } -} \ No newline at end of file diff --git a/Assets/03.FiniteStateMachine/RunTime/Use/IFSMManager.cs b/Assets/03.FiniteStateMachine/RunTime/Use/IFSMManager.cs new file mode 100644 index 0000000..7c95f24 --- /dev/null +++ b/Assets/03.FiniteStateMachine/RunTime/Use/IFSMManager.cs @@ -0,0 +1,70 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace Stary.Evo.FiniteStateMachine +{ + public interface IFSMManager + { + IFSMIState CurState { get; set; } + void AddState(IFSMIState state); + void RemoveState(IFSMIState state); + void SetCurState(string name); + IFSMIState GetStateWithName(string name); + Dictionary States { get; set; } + } + + public class FSMManager : IFSMManager + { + public IFSMIState CurState { get; set; } + public Dictionary States { get; set; } + + public FSMManager() + { + States = new Dictionary(); + } + + public void AddState(IFSMIState state) + { + Debug.Log(state.Name); + if (!States.ContainsKey(state.Name)) + { + States.Add(state.Name, state); + } + else + { + Debug.LogErrorFormat("States状态机容器里已存在名字为--【{0}】--的状态", state.Name.ToString()); + } + } + + public void RemoveState(IFSMIState state) + { + if (States.ContainsKey(state.Name)) + { + States.Remove(state.Name); + } + else + { + Debug.LogErrorFormat("States状态机容器里不存在名字为--【{0}】--的状态", state.Name.ToString()); + } + } + + public void SetCurState(string name) + { + if (CurState != null) + CurState.OnExit(); + IFSMIState state = GetStateWithName(name); + CurState = state; + CurState.OnEnter(); + } + + public IFSMIState GetStateWithName(string name) + { + if (States.ContainsKey(name)) + { + return States[name]; + } + + return null; + } + } +} \ No newline at end of file diff --git a/Assets/03.FiniteStateMachine/RunTime/Use/FSMManager.cs.meta b/Assets/03.FiniteStateMachine/RunTime/Use/IFSMManager.cs.meta similarity index 100% rename from Assets/03.FiniteStateMachine/RunTime/Use/FSMManager.cs.meta rename to Assets/03.FiniteStateMachine/RunTime/Use/IFSMManager.cs.meta diff --git a/Assets/03.FiniteStateMachine/package.json b/Assets/03.FiniteStateMachine/package.json index b86c4b2..1742605 100644 --- a/Assets/03.FiniteStateMachine/package.json +++ b/Assets/03.FiniteStateMachine/package.json @@ -1,6 +1,6 @@ { "name": "com.staryevo.finitestatemachine", - "version": "1.0.1", + "version": "1.0.2", "displayName": "03.FiniteStateMachine", "description": "状态机工具", "unity": "2021.3",