diff --git a/GFramework.Core.Abstractions/state/IStateMachine.cs b/GFramework.Core.Abstractions/state/IStateMachine.cs index f7ddf1e..7922b63 100644 --- a/GFramework.Core.Abstractions/state/IStateMachine.cs +++ b/GFramework.Core.Abstractions/state/IStateMachine.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; namespace GFramework.Core.Abstractions.state; @@ -36,7 +36,8 @@ public interface IStateMachine /// 切换到指定类型的状态 /// /// 要切换到的状态类型,必须实现IState接口 - void ChangeTo() where T : IState; + /// 如果成功切换则返回true,否则返回false + bool ChangeTo() where T : IState; /// /// 检查指定类型的状态是否已注册 diff --git a/GFramework.Core.Tests/state/StateMachineTests.cs b/GFramework.Core.Tests/state/StateMachineTests.cs index e47743c..87438ee 100644 --- a/GFramework.Core.Tests/state/StateMachineTests.cs +++ b/GFramework.Core.Tests/state/StateMachineTests.cs @@ -174,7 +174,7 @@ public class StateMachineTests } /// - /// 验证当当前状态拒绝转换时不应发生状态变化 + /// 验证当当前状态拒绝转换时不应发生状态变化 /// [Test] public void ChangeTo_WhenCurrentStateDeniesTransition_Should_NotChange() @@ -186,8 +186,9 @@ public class StateMachineTests _stateMachine.ChangeTo(); var oldState = _stateMachine.Current; - _stateMachine.ChangeTo(); + 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); diff --git a/GFramework.Core/state/StateMachine.cs b/GFramework.Core/state/StateMachine.cs index 08e3b24..a2f1a0a 100644 --- a/GFramework.Core/state/StateMachine.cs +++ b/GFramework.Core/state/StateMachine.cs @@ -1,4 +1,4 @@ -using GFramework.Core.Abstractions.state; +using GFramework.Core.Abstractions.state; namespace GFramework.Core.state; @@ -79,8 +79,9 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine /// 切换到指定类型的状态 /// /// 目标状态类型 + /// 如果成功切换则返回true,否则返回false /// 当目标状态未注册时抛出 - public void ChangeTo() where T : IState + public bool ChangeTo() where T : IState { lock (_lock) { @@ -90,10 +91,13 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine // 验证当前状态是否可以转换到目标状态 if (Current != null && !Current.CanTransitionTo(target)) - throw new InvalidOperationException( - $"Cannot transition from {Current.GetType().Name} to {typeof(T).Name}"); + { + OnTransitionRejected(Current, target); + return false; + } ChangeInternal(target); + return true; } }