AI行为树叶节点:徘徊 (JobNode_Wander)
功能说明
JobNode_Wander 是一个 AI 行为树的叶节点,它指示执行该行为树的实体 (SelfEntity) 在其当前位置附近随机选择一个可达的目标点,并移动到该点。一旦到达目标点,该节点即告成功。此节点也包含了卡住检测机制,如果实体在徘徊过程中长时间未移动,则判定为卡住并返回失败,以便行为树可以尝试其他行为。
此节点常用于实现实体的默认空闲行为,如生物在地图上漫无目的地行走,或NPC在没有特定任务时在区域内巡逻。
可用参数
无需配置参数。JobNode_Wander 节点不接受任何来自XML的额外配置。其所有行为(例如徘徊的最大范围、最小移动距离、寻找目标点的尝试次数、卡住检测的阈值和帧数等)均由节点内部的默认逻辑和常量控制。
行为树节点状态 (Status) 返回值
JobNode_Wander 节点执行完毕后,会返回以下状态:
- 运行中 (
Running):- 节点已成功找到一个徘徊目标点,并且
SelfEntity正在向该目标点移动。 SelfEntity尚未到达目标点,但仍在尝试移动。
- 节点已成功找到一个徘徊目标点,并且
- 成功 (
Success):SelfEntity已经成功到达其当前徘徊的目标点。
- 失败 (
Failure):- 在经过多次尝试后,未能找到一个有效且可达的随机徘徊目标点。这通常发生在实体被困在一个无法移动的区域时。
SelfEntity在向目标点移动的过程中被检测到卡住(长时间未移动)。
示例
以下是一个 BehaviorTreeDef 的示例,展示了 JobNode_Wander 如何在一个行为链中被使用:
<Define>
<BehaviorTreeDef>
<defName>PassiveAnimalBehavior</defName>
<label>被动动物行为</label>
<description>动物在没有威胁时,会随机徘徊并短暂空闲。</description>
<!-- 序列节点:先徘徊,然后空闲 -->
<Node className="ThinkNode_Sequence">
<childTree>
<li>
<!-- 随机徘徊到附近一个点 -->
<className>JobNode_Wander</className>
</li>
<li>
<!-- 徘徊结束后,空闲120帧 (约2秒) -->
<className>JobNode_Idle</className>
<value>120</value>
</li>
</childTree>
</Node>
</BehaviorTreeDef>
<BehaviorTreeDef>
<defName>MonsterDefaultPatrol</defName>
<label>怪物默认巡逻</label>
<description>怪物在没有敌人时,会进行随机巡逻。</description>
<!-- 条件节点:如果没有敌人,则执行巡逻 -->
<Node className="ThinkNode_Conditional" value="!HasHostileTarget()">
<childTree>
<li>
<!-- 随机徘徊 -->
<className>JobNode_Wander</className>
</li>
</childTree>
</Node>
<!-- 如果有敌人,则可能执行攻击行为(由其他节点定义) -->
</BehaviorTreeDef>
</Define>
在上述示例中:
- 第一个
BehaviorTreeDef演示了一个被动动物的行为,它会先通过JobNode_Wander移动到附近一个点,然后通过JobNode_Idle暂停一段预设的时间。 - 第二个
BehaviorTreeDef展示了JobNode_Wander如何在ThinkNode_Conditional内部作为默认的巡逻行为,只有在没有敌对目标时才会触发。
复杂参数说明
由于 JobNode_Wander 节点没有任何可直接通过 XML 配置的参数,因此本节不适用。其内部行为逻辑(如徘徊范围、卡住检测等)均已预设。