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 可以定义相同的 OnEntryOnExit,它们将由 WalkJumpingEndJumping.

此外,它为您提供了一种更简单的方法来检查您是否正在跳跃中。而不是:

var state = stateMachine.state;
var isJumping = state == State.WalkJumping || state == RunJumping;

你可以简单地做:

var isJumping = stateMachine.IsInState(State.Jumping);

这将正确考虑所有子状态,当前为 WalkJumpingRunJumping。但是如果你在未来添加一个新的跳转子状态,例如DoubleJumping,那么 isJumping 谓词也会自动涵盖这种情况,无需记住修复它。