从阅读文档来看,这似乎是子状态的一个很好的用例。
你可以有一个跳转状态:
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
谓词也会自动覆盖这种情况,而无需记住修复它。