diff --git a/GFramework.Core.Abstractions/state/IStateMachine.cs b/GFramework.Core.Abstractions/state/IStateMachine.cs
index fa3c1303..53b09edd 100644
--- a/GFramework.Core.Abstractions/state/IStateMachine.cs
+++ b/GFramework.Core.Abstractions/state/IStateMachine.cs
@@ -17,25 +17,12 @@ public interface IStateMachine
/// 要注册的状态实例
IStateMachine Register(IState state);
- ///
- /// 从状态机中注销指定类型的状态
- ///
- /// 要注销的状态类型,必须实现IState接口
- IStateMachine Unregister() where T : IState;
-
///
/// 异步从状态机中注销指定类型的状态
///
/// 要注销的状态类型,必须实现IState接口
Task UnregisterAsync() where T : IState;
- ///
- /// 检查是否可以切换到指定类型的状态
- ///
- /// 目标状态类型,必须实现IState接口
- /// 如果可以切换则返回true,否则返回false
- bool CanChangeTo() where T : IState;
-
///
/// 异步检查是否可以切换到指定类型的状态
///
@@ -43,13 +30,6 @@ public interface IStateMachine
/// 如果可以切换则返回true,否则返回false
Task CanChangeToAsync() where T : IState;
- ///
- /// 切换到指定类型的状态
- ///
- /// 要切换到的状态类型,必须实现IState接口
- /// 如果成功切换则返回true,否则返回false
- bool ChangeTo() where T : IState;
-
///
/// 异步切换到指定类型的状态
///
@@ -89,12 +69,6 @@ public interface IStateMachine
/// 状态历史记录的只读副本
IReadOnlyList GetStateHistory();
- ///
- /// 回退到上一个状态
- ///
- /// 如果成功回退则返回true,否则返回false
- bool GoBack();
-
///
/// 异步回退到上一个状态
///
diff --git a/GFramework.Core.Tests/state/StateMachineSystemTests.cs b/GFramework.Core.Tests/state/StateMachineSystemTests.cs
index 6e8a75fd..479be46a 100644
--- a/GFramework.Core.Tests/state/StateMachineSystemTests.cs
+++ b/GFramework.Core.Tests/state/StateMachineSystemTests.cs
@@ -151,126 +151,6 @@ public void OnArchitecturePhase_Should_Not_Throw_Exception()
Throws.Nothing);
}
- ///
- /// 测试ChangeTo发送StateChangedEvent事件
- /// 验证当状态机切换到新状态时,会正确触发StateChangedEvent事件,并且事件中的旧状态为null(首次切换)
- ///
- [Test]
- public void ChangeTo_Should_Send_StateChangedEvent()
- {
- // 订阅StateChangedEvent事件以验证事件是否被正确发送
- var eventReceived = false;
- StateChangedEvent? receivedEvent = null;
-
- _eventBus!.Register(e =>
- {
- eventReceived = true;
- receivedEvent = e;
- });
-
- var state1 = new TestStateV5();
- var state2 = new TestStateV5();
-
- _stateMachine!.Register(state1);
- _stateMachine.Register(state2);
-
- _stateMachine.Init();
- _stateMachine.ChangeTo();
-
- Assert.That(eventReceived, Is.True);
- Assert.That(receivedEvent!.OldState, Is.Null);
- Assert.That(receivedEvent.NewState, Is.InstanceOf());
- }
-
- ///
- /// 测试ChangeTo发送StateChangedEvent事件(包含旧状态)
- /// 验证当状态机从一个状态切换到另一个状态时,会正确触发StateChangedEvent事件,
- /// 并且事件中包含正确的旧状态和新状态信息
- ///
- [Test]
- public void ChangeTo_Should_Send_StateChangedEvent_With_OldState()
- {
- // 订阅StateChangedEvent事件以验证事件是否被正确发送
- var eventReceived = false;
- StateChangedEvent? receivedEvent = null;
-
- _eventBus!.Register(e =>
- {
- eventReceived = true;
- receivedEvent = e;
- });
-
- var state1 = new TestStateV5();
- var state2 = new TestStateV5();
-
- _stateMachine!.Register(state1);
- _stateMachine.Register(state2);
-
- _stateMachine.Init();
- _stateMachine.ChangeTo();
- _stateMachine.ChangeTo();
-
- Assert.That(eventReceived, Is.True);
- Assert.That(receivedEvent!.OldState, Is.InstanceOf());
- Assert.That(receivedEvent.NewState, Is.InstanceOf());
- }
-
- ///
- /// 测试CanChangeTo方法对于已注册状态的工作情况
- /// 验证当状态已注册到状态机中时,CanChangeTo方法应返回true
- ///
- [Test]
- public void CanChangeTo_Should_Work_With_Registered_States()
- {
- var state = new TestStateV5();
-
- _stateMachine!.Register(state);
-
- var canChange = _stateMachine.CanChangeTo();
- Assert.That(canChange, Is.True);
- }
-
- ///
- /// 测试可以注册多个状态
- /// 验证状态机能够成功注册多个不同的状态实例,并且能够切换到这些已注册的状态
- ///
- [Test]
- public void Multiple_States_Should_Be_Registered()
- {
- var state1 = new TestStateV5 { Id = 1 };
- var state2 = new TestStateV5 { Id = 2 };
- var state3 = new TestStateV5 { Id = 3 };
-
- _stateMachine!.Register(state1);
- _stateMachine.Register(state2);
- _stateMachine.Register(state3);
-
- var canChange = _stateMachine.CanChangeTo();
- Assert.That(canChange, Is.True);
- }
-
-
- ///
- /// 测试状态机生命周期完整
- ///
- [Test]
- public void StateMachine_Lifecycle_Should_Be_Complete()
- {
- var state1 = new TestStateV5();
- var state2 = new TestStateV5();
-
- _stateMachine!.Register(state1);
- _stateMachine.Register(state2);
-
- _stateMachine.Init();
- Assert.That(_stateMachine.Current, Is.Null);
-
- _stateMachine.ChangeTo();
- Assert.That(_stateMachine.Current, Is.InstanceOf());
-
- _stateMachine.Destroy();
- }
-
///
/// 测试异步ChangeToAsync发送StateChangedEvent事件
/// 验证当状态机使用异步方法切换到新状态时,会正确触发StateChangedEvent事件
diff --git a/GFramework.Core.Tests/state/StateMachineTests.cs b/GFramework.Core.Tests/state/StateMachineTests.cs
index 7542ac60..440c436c 100644
--- a/GFramework.Core.Tests/state/StateMachineTests.cs
+++ b/GFramework.Core.Tests/state/StateMachineTests.cs
@@ -43,204 +43,6 @@ public void Register_Should_AddState_To_StatesDictionary()
Assert.That(_stateMachine.ContainsState(), Is.True);
}
- ///
- /// 验证ChangeTo方法能够正确设置当前状态
- ///
- [Test]
- public void ChangeTo_Should_SetCurrentState()
- {
- var state = new TestStateV2();
- _stateMachine.Register(state);
- _stateMachine.ChangeTo();
-
- Assert.That(_stateMachine.Current, Is.SameAs(state));
- }
-
- ///
- /// 验证ChangeTo方法会调用OnEnter回调
- ///
- [Test]
- public void ChangeTo_Should_Invoke_OnEnter()
- {
- var state = new TestStateV2();
- _stateMachine.Register(state);
- _stateMachine.ChangeTo();
-
- Assert.That(state.EnterCalled, Is.True);
- Assert.That(state.EnterFrom, Is.Null);
- }
-
- ///
- /// 验证当存在当前状态时,切换到新状态会调用原状态的OnExit回调
- ///
- [Test]
- public void ChangeTo_When_CurrentStateExists_Should_Invoke_OnExit()
- {
- var state1 = new TestStateV2();
- var state2 = new TestStateV3();
- _stateMachine.Register(state1);
- _stateMachine.Register(state2);
-
- _stateMachine.ChangeTo();
- _stateMachine.ChangeTo();
-
- Assert.That(state1.ExitCalled, Is.True);
- Assert.That(state1.ExitTo, Is.SameAs(state2));
- }
-
- ///
- /// 验证当存在当前状态时,切换到新状态会调用新状态的OnEnter回调
- ///
- [Test]
- public void ChangeTo_When_CurrentStateExists_Should_Invoke_OnEnter()
- {
- var state1 = new TestStateV2();
- var state2 = new TestStateV3();
- _stateMachine.Register(state1);
- _stateMachine.Register(state2);
-
- _stateMachine.ChangeTo();
- _stateMachine.ChangeTo();
-
- Assert.That(state2.EnterCalled, Is.True);
- Assert.That(state2.EnterFrom, Is.SameAs(state1));
- }
-
- ///
- /// 验证切换到相同状态时不应调用回调方法
- ///
- [Test]
- public void ChangeTo_ToSameState_Should_NotInvoke_Callbacks()
- {
- var state = new TestStateV2();
- _stateMachine.Register(state);
- _stateMachine.ChangeTo();
-
- var enterCount = state.EnterCallCount;
- var exitCount = state.ExitCallCount;
-
- _stateMachine.ChangeTo();
-
- Assert.That(state.EnterCallCount, Is.EqualTo(enterCount));
- Assert.That(state.ExitCallCount, Is.EqualTo(exitCount));
- }
-
- ///
- /// 验证切换到未注册状态时应抛出InvalidOperationException异常
- ///
- [Test]
- public void ChangeTo_ToUnregisteredState_Should_ThrowInvalidOperationException()
- {
- Assert.Throws(() => _stateMachine.ChangeTo());
- }
-
- ///
- /// 验证当状态未注册时CanChangeTo方法应返回false
- ///
- [Test]
- public void CanChangeTo_WhenStateNotRegistered_Should_ReturnFalse()
- {
- var result = _stateMachine.CanChangeTo();
- Assert.That(result, Is.False);
- }
-
- ///
- /// 验证当状态已注册时CanChangeTo方法应返回true
- ///
- [Test]
- public void CanChangeTo_WhenStateRegistered_Should_ReturnTrue()
- {
- var state = new TestStateV2();
- _stateMachine.Register(state);
-
- var result = _stateMachine.CanChangeTo();
- Assert.That(result, Is.True);
- }
-
- ///
- /// 验证当当前状态拒绝转换时CanChangeTo方法应返回false
- ///
- [Test]
- public void CanChangeTo_WhenCurrentStateDeniesTransition_Should_ReturnFalse()
- {
- var state1 = new TestStateV2 { AllowTransition = false };
- var state2 = new TestStateV3();
- _stateMachine.Register(state1);
- _stateMachine.Register(state2);
- _stateMachine.ChangeTo();
-
- var result = _stateMachine.CanChangeTo();
- Assert.That(result, Is.False);
- }
-
- ///
- /// 验证当当前状态拒绝转换时不应发生状态变化
- ///
- [Test]
- public void ChangeTo_WhenCurrentStateDeniesTransition_Should_NotChange()
- {
- var state1 = new TestStateV2 { AllowTransition = false };
- var state2 = new TestStateV3();
- _stateMachine.Register(state1);
- _stateMachine.Register(state2);
- _stateMachine.ChangeTo();
-
- var oldState = _stateMachine.Current;
- var result = _stateMachine.ChangeTo();
-
- Assert.That(result, Is.False);
- Assert.That(_stateMachine.Current, Is.SameAs(oldState));
- Assert.That(_stateMachine.Current, Is.SameAs(state1));
- Assert.That(state2.EnterCalled, Is.False);
- }
-
- ///
- /// 验证注销状态后应从字典中移除该状态
- ///
- [Test]
- public void Unregister_Should_RemoveState_FromDictionary()
- {
- var state = new TestStateV2();
- _stateMachine.Register(state);
- _stateMachine.Unregister();
-
- Assert.That(_stateMachine.ContainsState(), Is.False);
- }
-
- ///
- /// 验证当活动状态被注销时应调用OnExit并清除当前状态
- ///
- [Test]
- public void Unregister_WhenStateIsActive_Should_Invoke_OnExit_AndClearCurrent()
- {
- var state = new TestStateV2();
- _stateMachine.Register(state);
- _stateMachine.ChangeTo();
- _stateMachine.Unregister();
-
- Assert.That(state.ExitCalled, Is.True);
- Assert.That(state.ExitTo, Is.Null);
- Assert.That(_stateMachine.Current, Is.Null);
- }
-
- ///
- /// 验证当非活动状态被注销时不应调用OnExit
- ///
- [Test]
- public void Unregister_WhenStateNotActive_Should_Not_Invoke_OnExit()
- {
- var state1 = new TestStateV2();
- var state2 = new TestStateV3();
- _stateMachine.Register(state1);
- _stateMachine.Register(state2);
- _stateMachine.ChangeTo();
-
- _stateMachine.Unregister();
-
- Assert.That(state1.ExitCalled, Is.False);
- Assert.That(_stateMachine.Current, Is.SameAs(state1));
- }
-
///
/// 验证异步注销后状态应从字典中移除
///
@@ -254,21 +56,6 @@ public async Task UnregisterAsync_Should_RemoveState_FromDictionary()
Assert.That(_stateMachine.ContainsState(), Is.False);
}
- ///
- /// 验证异步注销活动同步状态时调用OnExit
- ///
- [Test]
- public async Task UnregisterAsync_WhenStateIsActive_WithSyncState_Should_Invoke_OnExit()
- {
- var state = new TestStateV2();
- _stateMachine.Register(state);
- _stateMachine.ChangeTo();
- await _stateMachine.UnregisterAsync();
-
- Assert.That(state.ExitCalled, Is.True);
- Assert.That(state.ExitTo, Is.Null);
- Assert.That(_stateMachine.Current, Is.Null);
- }
///
/// 验证异步注销活动异步状态时调用OnExitAsync
@@ -286,24 +73,6 @@ public async Task UnregisterAsync_WhenStateIsActive_WithAsyncState_Should_Invoke
Assert.That(_stateMachine.Current, Is.Null);
}
- ///
- /// 验证异步注销非活动状态不调用退出方法
- ///
- [Test]
- public async Task UnregisterAsync_WhenStateNotActive_Should_Not_Invoke_Exit()
- {
- var state1 = new TestStateV2();
- var state2 = new TestStateV3();
- _stateMachine.Register(state1);
- _stateMachine.Register(state2);
- _stateMachine.ChangeTo();
-
- await _stateMachine.UnregisterAsync();
-
- Assert.That(state1.ExitCalled, Is.False);
- Assert.That(_stateMachine.Current, Is.SameAs(state1));
- }
-
///
/// 验证异步切换检查未注册状态返回false
///
@@ -327,21 +96,6 @@ public async Task CanChangeToAsync_WhenStateRegistered_Should_ReturnTrue()
Assert.That(result, Is.True);
}
- ///
- /// 验证异步切换检查当前状态拒绝转换时返回false
- ///
- [Test]
- public async Task CanChangeToAsync_WhenCurrentStateDeniesTransition_Should_ReturnFalse()
- {
- var state1 = new TestStateV2 { AllowTransition = false };
- var state2 = new TestStateV3();
- _stateMachine.Register(state1);
- _stateMachine.Register(state2);
- _stateMachine.ChangeTo();
-
- var result = await _stateMachine.CanChangeToAsync();
- Assert.That(result, Is.False);
- }
///
/// 验证异步切换检查使用异步状态时调用CanTransitionToAsync
@@ -359,21 +113,6 @@ public async Task CanChangeToAsync_WithAsyncState_Should_Call_CanTransitionToAsy
Assert.That(state1.CanTransitionToCallCount, Is.EqualTo(1));
}
- ///
- /// 验证异步切换检查使用同步状态时调用CanTransitionTo
- ///
- [Test]
- public async Task CanChangeToAsync_WithSyncState_Should_Call_CanTransitionTo()
- {
- var state1 = new TestStateV2 { AllowTransition = false };
- var state2 = new TestStateV3();
- _stateMachine.Register(state1);
- _stateMachine.Register(state2);
- _stateMachine.ChangeTo();
-
- var result = await _stateMachine.CanChangeToAsync();
- Assert.That(result, Is.False);
- }
///
/// 验证异步状态切换能够正确设置当前状态
@@ -628,52 +367,6 @@ public async Task MultipleAsyncStateChanges_Should_Invoke_Callbacks_Correctly()
Assert.That(state3.EnterCalled, Is.True);
Assert.That(state3.ExitCalled, Is.False);
}
-
- ///
- /// 验证多次状态转换应正确调用回调方法
- ///
- [Test]
- public void MultipleStateChanges_Should_Invoke_Callbacks_Correctly()
- {
- var state1 = new TestStateV2();
- var state2 = new TestStateV3();
- var state3 = new TestStateV4();
- _stateMachine.Register(state1);
- _stateMachine.Register(state2);
- _stateMachine.Register(state3);
-
- _stateMachine.ChangeTo();
- _stateMachine.ChangeTo();
- _stateMachine.ChangeTo();
-
- Assert.That(state1.EnterCalled, Is.True);
- Assert.That(state1.ExitCalled, Is.True);
- Assert.That(state2.EnterCalled, Is.True);
- Assert.That(state2.ExitCalled, Is.True);
- Assert.That(state3.EnterCalled, Is.True);
- Assert.That(state3.ExitCalled, Is.False);
- }
-
- ///
- /// 验证ChangeTo方法应遵循CanTransitionTo逻辑
- ///
- [Test]
- public void ChangeTo_Should_Respect_CanTransitionTo_Logic()
- {
- var state1 = new TestStateV2();
- var state2 = new TestStateV3();
- var state3 = new TestStateV4();
- _stateMachine.Register(state1);
- _stateMachine.Register(state2);
- _stateMachine.Register(state3);
-
- _stateMachine.ChangeTo();
- _stateMachine.ChangeTo();
-
- Assert.That(state1.EnterCalled, Is.True);
- Assert.That(state1.ExitCalled, Is.True);
- Assert.That(state2.EnterCalled, Is.True);
- }
}
///
diff --git a/GFramework.Core/state/StateMachine.cs b/GFramework.Core/state/StateMachine.cs
index 4ffd820c..45c6bcff 100644
--- a/GFramework.Core/state/StateMachine.cs
+++ b/GFramework.Core/state/StateMachine.cs
@@ -9,8 +9,10 @@ namespace GFramework.Core.state;
public class StateMachine(int maxHistorySize = 10) : IStateMachine
{
private readonly object _lock = new();
- private readonly HashSet _registeredStates = new(); // 优化:用于快速检查状态是否注册
+
+ private readonly HashSet _registeredStates = [];
private readonly Stack _stateHistory = new();
+ private readonly SemaphoreSlim _transitionLock = new(1, 1);
///
/// 存储所有已注册状态的字典,键为状态类型,值为状态实例
@@ -37,57 +39,31 @@ public IStateMachine Register(IState state)
return this;
}
- ///
- /// 从状态机中注销指定类型的状态
- ///
- /// 要注销的状态类型
- public IStateMachine Unregister() where T : IState
- {
- var stateToUnregister = PrepareUnregister(out var isCurrentState);
- if (stateToUnregister == null) return this;
-
- // 如果是当前状态,执行同步退出
- if (isCurrentState)
- {
- Current!.OnExit(null);
- Current = null;
- }
-
- CompleteUnregister(stateToUnregister);
- return this;
- }
-
///
/// 异步注销指定类型的状态
///
/// 要注销的状态类型
public async Task UnregisterAsync() where T : IState
{
- var stateToUnregister = PrepareUnregister(out var isCurrentState);
- if (stateToUnregister == null) return this;
-
- // 如果是当前状态,执行异步退出
- if (isCurrentState)
+ await _transitionLock.WaitAsync();
+ try
{
- await ExecuteExitAsync(Current!, null);
- Current = null;
- }
-
- CompleteUnregister(stateToUnregister);
- return this;
- }
+ var stateToUnregister = PrepareUnregister(out var isCurrentState);
+ if (stateToUnregister == null) return this;
- ///
- /// 检查是否可以切换到指定类型的状态
- ///
- /// 目标状态类型
- /// 如果可以切换则返回true,否则返回false
- public bool CanChangeTo() where T : IState
- {
- if (!States.TryGetValue(typeof(T), out var target))
- return false;
+ if (isCurrentState)
+ {
+ await ExecuteExitAsync(Current!, null);
+ Current = null;
+ }
- return Current?.CanTransitionTo(target) ?? true;
+ CompleteUnregister(stateToUnregister);
+ return this;
+ }
+ finally
+ {
+ _transitionLock.Release();
+ }
}
///
@@ -97,38 +73,23 @@ public bool CanChangeTo() where T : IState
/// 如果可以切换则返回true,否则返回false
public async Task CanChangeToAsync() where T : IState
{
- if (!States.TryGetValue(typeof(T), out var target))
- return false;
-
- if (Current == null) return true;
-
- return await CanTransitionToAsync(Current, target);
- }
-
- ///
- /// 切换到指定类型的状态
- ///
- /// 目标状态类型
- /// 如果成功切换则返回true,否则返回false
- /// 当目标状态未注册时抛出
- public bool ChangeTo() where T : IState
- {
- lock (_lock)
+ await _transitionLock.WaitAsync();
+ try
{
if (!States.TryGetValue(typeof(T), out var target))
- throw new InvalidOperationException($"State {typeof(T).Name} not registered.");
-
- if (Current != null && !Current.CanTransitionTo(target))
- {
- OnTransitionRejected(Current, target);
return false;
- }
- ChangeInternal(target);
- return true;
+ if (Current == null) return true;
+
+ return await CanTransitionToAsync(Current, target);
+ }
+ finally
+ {
+ _transitionLock.Release();
}
}
+
///
/// 异步切换到指定类型的状态
///
@@ -137,30 +98,37 @@ public bool ChangeTo() where T : IState
/// 当目标状态未注册时抛出
public async Task ChangeToAsync() where T : IState
{
- IState target;
- IState? currentSnapshot;
-
- lock (_lock)
+ await _transitionLock.WaitAsync();
+ try
{
- if (!States.TryGetValue(typeof(T), out target!))
- throw new InvalidOperationException($"State {typeof(T).Name} not registered.");
+ IState target;
+ IState? currentSnapshot;
- currentSnapshot = Current; // 在锁内获取当前状态的快照
- }
+ lock (_lock)
+ {
+ if (!States.TryGetValue(typeof(T), out target!))
+ throw new InvalidOperationException($"State {typeof(T).Name} not registered.");
- // 验证转换(在锁外执行异步操作)
- if (currentSnapshot != null)
- {
- var canTransition = await CanTransitionToAsync(currentSnapshot, target);
- if (!canTransition)
+ currentSnapshot = Current;
+ }
+
+ if (currentSnapshot != null)
{
- await OnTransitionRejectedAsync(currentSnapshot, target);
- return false;
+ var canTransition = await CanTransitionToAsync(currentSnapshot, target);
+ if (!canTransition)
+ {
+ await OnTransitionRejectedAsync(currentSnapshot, target);
+ return false;
+ }
}
- }
- await ChangeInternalAsync(target);
- return true;
+ await ChangeInternalAsync(target);
+ return true;
+ }
+ finally
+ {
+ _transitionLock.Release();
+ }
}
///
@@ -216,30 +184,25 @@ public IReadOnlyList GetStateHistory()
}
}
- ///
- /// 回退到上一个状态
- ///
- /// 如果成功回退则返回true,否则返回false
- public bool GoBack()
- {
- var previousState = FindValidPreviousState();
- if (previousState == null) return false;
-
- ChangeInternalWithoutHistory(previousState);
- return true;
- }
-
///
/// 异步回退到上一个状态
///
/// 如果成功回退则返回true,否则返回false
public async Task GoBackAsync()
{
- var previousState = FindValidPreviousState();
- if (previousState == null) return false;
+ await _transitionLock.WaitAsync();
+ try
+ {
+ var previousState = FindValidPreviousState();
+ if (previousState == null) return false;
- await ChangeInternalWithoutHistoryAsync(previousState);
- return true;
+ await ChangeInternalWithoutHistoryAsync(previousState);
+ return true;
+ }
+ finally
+ {
+ _transitionLock.Release();
+ }
}
///
@@ -310,24 +273,6 @@ private void CompleteUnregister(IState stateToUnregister)
}
}
- ///
- /// 内部状态切换方法(不记录历史),用于回退操作
- ///
- /// 下一个状态实例
- protected virtual void ChangeInternalWithoutHistory(IState next)
- {
- if (Current == next) return;
-
- var old = Current;
- OnStateChanging(old, next);
-
- old?.OnExit(next);
- Current = next;
- Current.OnEnter(old);
-
- OnStateChanged(old, Current);
- }
-
///
/// 异步内部状态切换方法(不记录历史),用于回退操作
///
@@ -346,32 +291,6 @@ protected virtual async Task ChangeInternalWithoutHistoryAsync(IState next)
await OnStateChangedAsync(old, Current);
}
- ///
- /// 内部状态切换方法,处理状态切换的核心逻辑
- ///
- /// 下一个状态实例
- protected virtual void ChangeInternal(IState next)
- {
- if (Current == next) return;
-
- if (Current != null && !Current.CanTransitionTo(next))
- {
- OnTransitionRejected(Current, next);
- return;
- }
-
- var old = Current;
- OnStateChanging(old, next);
-
- AddToHistory(Current);
-
- old?.OnExit(next);
- Current = next;
- Current.OnEnter(old);
-
- OnStateChanged(old, Current);
- }
-
///
/// 异步内部状态切换方法,处理状态切换的核心逻辑
///
@@ -383,12 +302,15 @@ protected virtual async Task ChangeInternalAsync(IState next)
var old = Current;
await OnStateChangingAsync(old, next);
- AddToHistory(Current);
-
await ExecuteExitAsync(old, next);
+
+ AddToHistory(old);
+
Current = next;
+
await ExecuteEnterAsync(Current, old);
+
await OnStateChangedAsync(old, Current);
}
diff --git a/GFramework.Core/state/StateMachineSystem.cs b/GFramework.Core/state/StateMachineSystem.cs
index 6bed3bb9..1fbab8e6 100644
--- a/GFramework.Core/state/StateMachineSystem.cs
+++ b/GFramework.Core/state/StateMachineSystem.cs
@@ -71,22 +71,6 @@ public virtual void Destroy()
States.Clear();
}
- ///
- /// 内部状态切换方法,重写基类方法以添加状态变更事件通知功能
- ///
- /// 要切换到的下一个状态
- protected override void ChangeInternal(IState next)
- {
- var old = Current;
- base.ChangeInternal(next);
-
- // 发送状态变更事件,通知监听者状态已发生改变
- this.SendEvent(new StateChangedEvent
- {
- OldState = old,
- NewState = Current
- });
- }
///
/// 异步内部状态切换方法,重写基类方法以添加状态变更事件通知功能