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 才会被执行。这种组合确保了实体在能够有效攻击敌人之前,会先尝试达到最佳的战斗位置,并且能够智能处理寻路过程中的卡住情况。