欢迎光临散文网 会员登陆 & 注册

TomLooman_ActionRoguelike_AssignmentFour

2023-08-18 15:22 作者:别叫我小红  | 我要投稿

该专栏用于保存对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。


TomLooman_ActionRoguelike_AssignmentFour的评论 (共 条)

分享到微博请遵守国家法律