Return 到来电状态?
Return to the caller state?
我正在使用 C# 的无状态状态机,但过去我在其他状态机实现中遇到过这个问题。这个问题主要是理论性的,但如果需要我可以添加一些虚拟代码。
我有一种情况,我不确定如何解决。假设您有 2 种状态(步行和 运行),它们都可以转换到第三种状态(跳跃)。一旦第三个状态完成,我希望回到调用者状态。在某种程度上,我必须能够影响被调用者触发器,但这只会传递给 OnEntry
之类的东西,而不是状态本身。
使用EntryFrom
似乎不起作用,因为无法影响"jump"状态本身,只能影响OnEntry
功能。
使用PermitDynamic
好像也不行,因为一旦进入"jump"状态,我就不知道自己从哪里来了
我可以有 2 个跳跃状态(jumpfrom运行、jumpfromwalk)和一个 OnEntry
函数,以尽量减少一些重复代码。这是我目前使用的。
我可以将以前的状态保存在外部变量中,并将其传递给我的状态更新。我(根本)不想这样做。
是否有处理此类问题的已知技术或方法?有一个共享状态,应该转换回调用者?
谢谢!
通过阅读文档,这似乎是一个非常好的子状态用例。
你可以有一个跳跃状态:
stateMachine.Configure(State.Jumping)
.OnEntry(() => StartJump())
.OnExit(() => EndJump());
和两个跳跃子状态。一个用于步行,一个用于运行宁:
stateMachine.Configure(State.WalkJumping)
.SubstateOf(State.Jumping)
.Permit(Trigger.DoneJumping, State.Walking);
stateMachine.Configure(State.RunJumping)
.SubstateOf(State.Jumping)
.Permit(Trigger.DoneJumping, State.Running);
然后你将步行和 运行 路线分别设置为 WalkJumping 和 RunJumping。
stateMachine.Configure(State.Walking)
.OnEntry(() => StartWalking())
.OnExit(() => EndWalking());
.Permit(Trigger.Jump, State.WalkJumping);
stateMachine.Configure(State.Running)
.OnEntry(() => StartRunning())
.OnExit(() => EndRunning());
.Permit(Trigger.Jump, State.RunJumping);
使用这样的基底,而不是仅仅使用常规状态,还有一个额外的好处,即 State.Jumping
可以定义相同的 OnEntry
和 OnExit
,它们将由 WalkJumping
和 EndJumping
.
此外,它为您提供了一种更简单的方法来检查您是否正在跳跃中。而不是:
var state = stateMachine.state;
var isJumping = state == State.WalkJumping || state == RunJumping;
你可以简单地做:
var isJumping = stateMachine.IsInState(State.Jumping);
这将正确考虑所有子状态,当前为 WalkJumping
和 RunJumping
。但是如果你在未来添加一个新的跳转子状态,例如DoubleJumping
,那么 isJumping
谓词也会自动涵盖这种情况,无需记住修复它。
我正在使用 C# 的无状态状态机,但过去我在其他状态机实现中遇到过这个问题。这个问题主要是理论性的,但如果需要我可以添加一些虚拟代码。
我有一种情况,我不确定如何解决。假设您有 2 种状态(步行和 运行),它们都可以转换到第三种状态(跳跃)。一旦第三个状态完成,我希望回到调用者状态。在某种程度上,我必须能够影响被调用者触发器,但这只会传递给 OnEntry
之类的东西,而不是状态本身。
使用EntryFrom
似乎不起作用,因为无法影响"jump"状态本身,只能影响OnEntry
功能。
使用PermitDynamic
好像也不行,因为一旦进入"jump"状态,我就不知道自己从哪里来了
我可以有 2 个跳跃状态(jumpfrom运行、jumpfromwalk)和一个 OnEntry
函数,以尽量减少一些重复代码。这是我目前使用的。
我可以将以前的状态保存在外部变量中,并将其传递给我的状态更新。我(根本)不想这样做。
是否有处理此类问题的已知技术或方法?有一个共享状态,应该转换回调用者? 谢谢!
通过阅读文档,这似乎是一个非常好的子状态用例。
你可以有一个跳跃状态:
stateMachine.Configure(State.Jumping)
.OnEntry(() => StartJump())
.OnExit(() => EndJump());
和两个跳跃子状态。一个用于步行,一个用于运行宁:
stateMachine.Configure(State.WalkJumping)
.SubstateOf(State.Jumping)
.Permit(Trigger.DoneJumping, State.Walking);
stateMachine.Configure(State.RunJumping)
.SubstateOf(State.Jumping)
.Permit(Trigger.DoneJumping, State.Running);
然后你将步行和 运行 路线分别设置为 WalkJumping 和 RunJumping。
stateMachine.Configure(State.Walking)
.OnEntry(() => StartWalking())
.OnExit(() => EndWalking());
.Permit(Trigger.Jump, State.WalkJumping);
stateMachine.Configure(State.Running)
.OnEntry(() => StartRunning())
.OnExit(() => EndRunning());
.Permit(Trigger.Jump, State.RunJumping);
使用这样的基底,而不是仅仅使用常规状态,还有一个额外的好处,即 State.Jumping
可以定义相同的 OnEntry
和 OnExit
,它们将由 WalkJumping
和 EndJumping
.
此外,它为您提供了一种更简单的方法来检查您是否正在跳跃中。而不是:
var state = stateMachine.state;
var isJumping = state == State.WalkJumping || state == RunJumping;
你可以简单地做:
var isJumping = stateMachine.IsInState(State.Jumping);
这将正确考虑所有子状态,当前为 WalkJumping
和 RunJumping
。但是如果你在未来添加一个新的跳转子状态,例如DoubleJumping
,那么 isJumping
谓词也会自动涵盖这种情况,无需记住修复它。