TomLooman_ActionRoguelike_AssignmentFour
该专栏用于保存对TomLooman的ActionRoguelike项目的学习笔记,学习过程中的思考与记录不一定准确。
教程参考:https://github.com/tomlooman/ActionRoguelike
基于UE5.0的项目实现:https://github.com/CarolBaggins2023/TomLooman_ActionRoguelike_Tutorial

2023_08_12
Assignment 4:当bot处于低血量时,逃跑并回血
给bot带上属性组件后,Assignment 4较容易完成。我们首先需要在行为树中判断bot是否处于低血量,和判断玩家是否处于bot攻击范围内相同,我们通过用Service对黑板中的bool变量赋值,完成这个功能。


我们继承BTServiceNode创建C++类,同样要覆盖TickNode函数,来实现间断地检查bot血量。

TickNode的实现如下,关键还是两点,访问到bot和访问到行为树黑板。访问到bot是为了从bot的属性组件类获得血量信息,访问到行为树黑板是为了用bot的血量信息给黑板中的变量赋值。

在通过Service给黑板中的bool变量赋值后,我们就可以用这个变量决定要不要执行逃跑操作,在行为树中,这就是一条以黑板节点开始的分支,我们将它放在最左侧(好像代表优先级最高),与攻击类似,我们这个分支添加一个冷却时间。

该分支主要是3步,运行环境查询,移动到查询结果位置,回血。
这里的环境查询依据三个Test。
路径长度测试用来寻找一个可到达且距离bot较近的位置,距离查询用来保持bot不离玩家太远,TraceTest用来保证bot在那个位置不会受到玩家攻击(bool match为true表示射线路径上有hit才会通过筛选)。
三个测试中路径长度的测试权重最大(Scoring Factor)(权重为负仅表示距离越近分数越大,而不是分数为负)。




回血任务节点类似于攻击任务节点,我们在C++中继承BTTaskNode类,并覆盖ExecuteTask函数。

该函数的实现类似于子弹造成伤害的函数,都要用GetComponentByClass访问Actor上的属性组件类成员变量,并用ApplyHealthChange修改血量。不同的是,子弹造成伤害是通过Overlap函数的OtherActor参数访问到Actor,而这个功能则是通过行为树访问使用行为树的AI控制器,再通过AI控制器访问被控Actor。
