From dd01496c48be441f7884972c68430595368b27fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=93=AE?= <834207172@qq.com> Date: Mon, 14 Apr 2025 10:07:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B900=20=E6=A1=86=E6=9E=B6?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/Utility/FSM/DefaultState.cs | 37 ++++++++++++++ .../Runtime/Utility/FSM/DefaultState.cs.meta | 3 ++ .../Runtime/Utility/FSM/FSMIState.cs | 18 +++++-- .../Runtime/Utility/FSM/FSMISystem.cs | 48 ++++++++++++++++++- Assets/00.StaryEvo/package.json | 2 +- 5 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 Assets/00.StaryEvo/Runtime/Utility/FSM/DefaultState.cs create mode 100644 Assets/00.StaryEvo/Runtime/Utility/FSM/DefaultState.cs.meta diff --git a/Assets/00.StaryEvo/Runtime/Utility/FSM/DefaultState.cs b/Assets/00.StaryEvo/Runtime/Utility/FSM/DefaultState.cs new file mode 100644 index 0000000..5b0969d --- /dev/null +++ b/Assets/00.StaryEvo/Runtime/Utility/FSM/DefaultState.cs @@ -0,0 +1,37 @@ +using Cysharp.Threading.Tasks; + +namespace Stary.Evo +{ + public class DefaultState : AbstractFSMIState + { + public DefaultState(IFsmSystem system) : base(system) + { + + } + + public override void OnEnter() + { + + } + + public override void OnExit() + { + + } + + public override UniTask OnExitAsync() + { + return UniTask.CompletedTask; + } + + public override UniTask OnEnterAsync(T param) + { + return UniTask.CompletedTask; + } + + public override UniTask OnEnterAsync(T1 param1, T2 param2) + { + return UniTask.CompletedTask; + } + } +} \ No newline at end of file diff --git a/Assets/00.StaryEvo/Runtime/Utility/FSM/DefaultState.cs.meta b/Assets/00.StaryEvo/Runtime/Utility/FSM/DefaultState.cs.meta new file mode 100644 index 0000000..7cc26fd --- /dev/null +++ b/Assets/00.StaryEvo/Runtime/Utility/FSM/DefaultState.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fa9b0b9ba7a849f597744565a49bd61a +timeCreated: 1744547550 \ No newline at end of file diff --git a/Assets/00.StaryEvo/Runtime/Utility/FSM/FSMIState.cs b/Assets/00.StaryEvo/Runtime/Utility/FSM/FSMIState.cs index fbb9233..46fd737 100644 --- a/Assets/00.StaryEvo/Runtime/Utility/FSM/FSMIState.cs +++ b/Assets/00.StaryEvo/Runtime/Utility/FSM/FSMIState.cs @@ -1,4 +1,5 @@ using System; +using Cysharp.Threading.Tasks; using UnityEngine; namespace Stary.Evo @@ -6,20 +7,25 @@ namespace Stary.Evo public interface FSMIState { IFsmSystem FsmSystem { get; } string Name { get; } - float Timer { get; set; } + //进入该状态时调用 void OnEnter(); + + UniTask OnEnterAsync(T param); + + UniTask OnEnterAsync(T1 param1, T2 param2); //每帧调用 void OnUpdate(); //退出该状态时调用 void OnExit(); + + UniTask OnExitAsync(); } public abstract class AbstractFSMIState : FSMIState { public IFsmSystem FsmSystem { get; } public string Name { get; } - public abstract float Timer { get; set; } public AbstractFSMIState(IFsmSystem system) { @@ -27,13 +33,17 @@ namespace Stary.Evo Name = GetType().Name; } - public abstract void OnEnter(); + public abstract UniTask OnEnterAsync(T param); + public abstract UniTask OnEnterAsync(T1 param1, T2 param2); + public abstract void OnEnter(); public virtual void OnUpdate() { - Timer += Time.deltaTime; + // Timer += Time.deltaTime; } public abstract void OnExit(); + + public abstract UniTask OnExitAsync(); } } diff --git a/Assets/00.StaryEvo/Runtime/Utility/FSM/FSMISystem.cs b/Assets/00.StaryEvo/Runtime/Utility/FSM/FSMISystem.cs index d1dee9b..90d3704 100644 --- a/Assets/00.StaryEvo/Runtime/Utility/FSM/FSMISystem.cs +++ b/Assets/00.StaryEvo/Runtime/Utility/FSM/FSMISystem.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Cysharp.Threading.Tasks; using UnityEngine; namespace Stary.Evo @@ -9,6 +10,8 @@ namespace Stary.Evo void AddState(FSMIState state); void RemoveState(FSMIState state); void SetCurState(string name); + UniTask SetCurState(string name, T param); + UniTask SetCurState(string name, T1 param1, T2 param2); FSMIState GetStateWithName(string name); HashMap States { get; set; } } @@ -21,6 +24,7 @@ namespace Stary.Evo public FsmSystem() { States = new HashMap(); + AddState(new DefaultState(this)); } public void AddState(FSMIState state) @@ -48,15 +52,57 @@ namespace Stary.Evo } } + /// + /// 普通状态切换,适用于无参 + /// + /// public void SetCurState(string name) { if (CurState != null) - CurState.OnExit(); + CurState.OnExitAsync(); FSMIState state = GetStateWithName(name); CurState = state; CurState.OnEnter(); } + /// + /// 异步状态切换,适用于有参 + /// + /// + /// + /// + public async UniTask SetCurState(string name, T param) + { + if (CurState != null) + { + await CurState.OnExitAsync(); + } + + FSMIState state = GetStateWithName(name); + CurState = state; + await CurState.OnEnterAsync(param); + } + + /// + /// 异步状态切换,适用于有参 + /// + /// + /// + /// + /// + /// + public async UniTask SetCurState(string name, T1 param1, T2 param2) + { + if (CurState != null) + { + await CurState.OnExitAsync(); + } + + FSMIState state = GetStateWithName(name); + CurState = state; + await CurState.OnEnterAsync(param1, param2); + } + public FSMIState GetStateWithName(string name) { if (States.ContainsKey(name)) diff --git a/Assets/00.StaryEvo/package.json b/Assets/00.StaryEvo/package.json index ac0d046..6109101 100644 --- a/Assets/00.StaryEvo/package.json +++ b/Assets/00.StaryEvo/package.json @@ -1,6 +1,6 @@ { "name": "com.staryevo.main", - "version": "1.0.7", + "version": "1.0.8", "displayName": "00.StaryEvo", "description": "This is an Framework package", "unity": "2021.3",