AI行为树叶节点:移动到攻击范围 (JobNode_MoveToAttackRange)

功能说明

JobNode_MoveToAttackRange 是一个 AI 行为树的叶节点,它指示执行该行为树的实体 (SelfEntity) 寻找其视野范围内最近的敌对目标,然后计算一个合适的移动位置,使其自身能够进入该敌对目标的攻击距离边缘。此节点的目的是确保 SelfEntity 能够移动到可以成功攻击敌人的位置,而不会过于接近或远离。它还包含路径设置、持续移动管理以及卡住检测的逻辑,以应对复杂的寻路情况。

该节点无需任何自定义参数,其行为完全基于 SelfEntity 的当前状态、其与环境中其他实体的关系、攻击范围 (SelfEntity.AttributesNow.attackRange) 以及寻路能力。

可用参数

无需配置参数。JobNode_MoveToAttackRange 节点无需任何额外配置即可工作。它的逻辑是自动寻找最近的敌对目标,并计算确保 SelfEntity 能够到达其攻击范围内的最佳位置。

行为树节点状态 (Status) 返回值

JobNode_MoveToAttackRange 节点执行完毕后,会返回以下状态:

  • 运行中 (Running)
    • 节点已找到目标并设置了路径,SelfEntity 正在向目标攻击范围移动。
    • SelfEntity 因卡住而被节点检测到,正在重新规划路径。
  • 成功 (Success)
    • SelfEntity 已经成功移动到其最近敌对目标的攻击范围边缘。
  • 失败 (Failure)
    • 在当前维度中未找到任何有效的敌对实体。
    • 找到了敌对实体,但在尝试设置路径或移动过程中该实体变得无效(例如,它已死亡或离开区域)。

示例

以下是一个 BehaviorTreeDef 的示例,展示了 JobNode_MoveToAttackRange 如何在一个基本的怪物行为中与 JobNode_AttackTarget 节点配合使用:

<Define>
    <BehaviorTreeDef>
        <defName>MonsterAggressiveBehavior</defName>
        <label>怪物侵略性行为</label>
        <description>怪物主动移动到攻击范围并攻击。</description>
      
        <!-- 条件分支:如果怪物有武器,则尝试攻击 -->
        <Node className="ThinkNode_Conditional" value="HasWeapon()">
            <childTree>
                <li>
                    <!-- 序列节点:先移动到攻击范围,再执行攻击 -->
                    <className>ThinkNode_Sequence</className>
                    <childTree>
                        <li>
                            <!-- 移动到攻击范围边缘,此节点会持续运行直到成功或失败 -->
                            <className>JobNode_MoveToAttackRange</className>
                        </li>
                        <li>
                            <!-- 成功进入攻击范围后,攻击目标一次 -->
                            <className>JobNode_AttackTarget</className> 
                        </li>
                    </childTree>
                </li>
            </childTree>
        </Node>

        <!-- 如果没有武器,或者攻击行为失败,则执行默认的徘徊空闲行为 -->
        <Node className="ThinkNode_Sequence">
            <childTree>
                <li>
                    <!-- 随机徘徊 -->
                    <className>JobNode_Wander</className>
                </li>
                <li>
                    <!-- 空闲一段时间 -->
                    <className>JobNode_Idle</className>
                </li>
            </childTree>
        </Node>
    </BehaviorTreeDef>
</Define>

在上述示例中,JobNode_MoveToAttackRange 被放置在一个序列节点中,位于 JobNode_AttackTarget 之前。这意味着只有当实体成功移动到攻击范围后,JobNode_AttackTarget 才会被执行。这种组合确保了实体在能够有效攻击敌人之前,会先尝试达到最佳的战斗位置,并且能够智能处理寻路过程中的卡住情况。