Fallback节点(回退节点)
Fallback节点在其他框架中被称为“选择器”或“优先级”节点。其目的是尝试不同的策略,直到找到有效的一个。
目前框架提供了两种类型的Fallback节点:
- Fallback:传统的Fallback节点,它会根据子节点的状态决定如何处理。
- ReactiveFallback:响应式Fallback节点,它可以在前置条件从失败变为成功时中断异步子节点。
Fallback节点共享以下规则:
- 在触发第一个子节点之前,节点状态变为运行中(RUNNING)。
- 如果子节点返回失败(FAILURE),则Fallback会触发下一个子节点。
- 如果最后一个子节点也返回失败,则所有子节点将被停止,Fallback节点返回失败。
- 如果子节点返回成功(SUCCESS),则停止并返回成功,所有子节点都将被停止。
两种ControlNodes的区别:
ControlNode类型 | 子节点返回RUNNING时 |
---|---|
Fallback | 再次触发(Tick again) |
ReactiveFallback | 重新开始(Restart) |
- “再次触发(Tick again)”意味着下一次Fallback节点被触发时,相同的子节点将再次被触发。已经返回失败的前一个兄弟节点不再被触发。
- “重新开始(Restart)”意味着整个Fallback将从列表中的第一个子节点重新开始。
Fallback 示例
假设我们尝试使用不同的策略来打开门。首先检查(只检查一次)门是否已经开启。
<Fallback name="OpenDoorStrategies">
<IsDoorOpen/>
<OpenDoorWithKey/>
<OpenDoorWithCrowbar/>
</Fallback>
在这个例子中,我们首先检查门是否开启,如果没有,则尝试使用钥匙打开门,如果还不行,最后尝试使用撬棍。
ReactiveFallback 示例
ReactiveFallback节点用于当我们想要在前置条件的状态从失败变为成功时中断异步子节点。
以下示例中,角色将睡眠最多8小时。如果他/她完全休息好了,节点areYouRested?
将返回成功,并且异步节点Timeout (8 hrs)
和Sleep
将被中断。
<ReactiveFallback name="SleepUntilRested">
<AreYouRested/>
<Timeout seconds="28800" name="SleepTimeout"/>
<Sleep name="Sleep"/>
</ReactiveFallback>
在这个例子中,AreYouRested?
节点将检查角色是否休息完毕。如果角色休息完毕,即使Sleep
节点还在运行中,整个ReactiveFallback节点也会停止,因为已经达到了目标状态。
Fallback节点使得行为树能够灵活地处理多种情况,并在遇到障碍时尝试不同的解决方案。通过使用Fallback和ReactiveFallback,开发者可以创建出能够适应不同环境和条件的智能AI行为。