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 配置的参数,因此本节不适用。其内部行为逻辑(如徘徊范围、卡住检测等)均已预设。