UE学习记录:AI添加攻击
缺少未解决的外部符号,在build文件里添加模块GameplayTasks
今天给AI的行为树添加一些逻辑,目前只有移动和等待,我们将给他添加一个攻击范围的检测:如果在攻击范围内就立即停止移动,如果不在就开始追踪,我们可以给行为树里的MoveToPlayer添加一个自己写的Service。首先新建一个C++类,继承BTService类,命名为RgBTService_CheckAttackRange,对TickNode进行重写:
行为树在游戏开始后会重复循环运行,我们到黑板里创建一个bool新键命名为WithinAttackRange,我们没有对它进行硬编码,否则它必须与C++中的名字相匹配。打开行为树

右键添加Selector,添加服务CheckAttackRange。然后将暴露在蓝图中的AttackRangeKey设置为WithinAttackRange,这时,我们需要给MoveToPlayer添加一个装饰器Blackboard,命名为Outside attack range?。在它的流控制选项中,观察者中止选择self,这样条件不满足的时候就会终止行为树,然后重新执行。

我们今天在行为树中给AI添加攻击行为。
新建一个TaskNode类命名为RgBTTask_RangedAttack,对ExecuteTask进行重写,我们要做的就是像写Service类那样,用行为树组件OwnerComp可以得到AI拥有者
Character类有一个可供我们使用的获取网格类,我们想获得枪口的位置,就得把MyController,Cast成一个ACharacter,然后就可以用一个FVector接受枪口的位置
然后我们需要拿到TargetActor,像之前在Service里做过的那样,通过黑板组件得到对象的值,我们可以将任何目标作为关键名称,获取该数据。我们要确保TargetActor不是空指针,这很有可能发生,因为我们在RgAIController中对其进行过设置。
这样我们有了AI和TargetActor(玩家),拿到他们得位置相减,就能得到枪口指向玩家的方向,这个方向矢量可以变成Rotation以便往特定的Rotation发射攻击,
最后还需要添加一个碰撞处理方法的参数,就可以产生攻击NewProj,ProjectileClass可以暴露在蓝图里以便更改攻击样式。
转到行为树进行如下操作

这里对行为树目前用到的知识做简单的总结:
Composite组合节点包括Selector,Sequence,Simple Parallel
Selector只要有一个子节点成功,则停止执行其它子节点并返回true。如果所有子节点都失败,则返回false。
Sequence只要有一个子项失败,则停止执行其它子节点并返回false。如果所有子节点都成功,则返回true。
Task 节点执行实际操作,不含输出连接
Decorator装饰节点附着于其他节点,用作其他节点是否可以执行的条件
Services节点只能附着在Composite组合节点上,只要其附着的节点执行,Services节点就会被执行,通常用来检查和更新黑板。
关于流控制中的观察者中止:
NONE,不终止执行
Self,中止自己和该节点下的所有子节点
Lower Priority,中止该节点右方的所有节点
Both,终止自己、该节点下的所有子节点、以及该节点右方的所有节点