2-18 拉怪机制,怪物攻击玩家、伤害源、黑板_哔哩哔哩_bilibili
目录
1.实行行为树实现拉怪机制
1.1行为树黑板
1.2获取施加伤害对象(伤害源)
2.修复原视频中,第二次攻击怪物后,怪物卡在原地不动的BUG
3.怪物攻击玩家
1.实行行为树实现拉怪机制
1.1行为树黑板
在AI行为树的蓝图中创建黑板,并命名为怪物黑板。
我理解的黑板是:为行为树绑定黑板,当黑板中出现指定的目标时,选择行为树的特定分支,执行特定的事件。
相当于AI的猎杀清单,当遇到清单上的目标时,会执行相应的动作。这个猎杀清单刚开始是空的,当玩家触发某些条件(攻击怪物,走到怪物领域内)在黑板中添加该玩家,实现相应动作。
黑板中存储的内容是以键值对存储的,在黑板定义时为key命名,在触发某些条件时(攻击怪物,走到怪物领域内)为对应的key赋值相应的value。
打开黑板
在黑板中新建一个object对象,并命名为目标玩家。
添加分支和装饰器,当装饰器上的目标玩家出现时,执行该分支。
创建新的AI任务蓝图:怪物走向玩家
怪物不死亡时,使用AI MOVE TO从黑板中获取到目标对象,让怪物移动到目标对象处
因为在上述任务的变量中公开了黑板属性,所以在行为树中可以编辑该属性,当该属性为目标玩家时开始执行节点。
1.2获取施加伤害对象(伤害源)
现在我们需要在游戏运行时,为我们怪物的黑板添加对象,当怪物收到玩家伤害时,给怪物的目标对象赋值为施加伤害的玩家。
主要分三步走:
1.告诉火球,谁生成了它,让他记住自己的主人是谁。
2.火球打到人后,火球传话给被打者,自己的主人是谁,你找他去算账去。
3.被打者拿到火球的主人(对象),进行仇恨的设定(反伤)等等。
1.打开角色蓝图,在发射火球的方法中,做出如下修改,告诉生成的火球,是self生成了它。
同理,流星火雨也一样。
2.打开火球蓝图(流星火雨同理),编辑重叠事件方法,火球作为话事人,告诉被打者,谁是火球的顶头上司,在火球施加应用伤害是,把instigator传递到参数damage causer上
3.被打者获取到火球的发射者,并将其添加到怪物黑板。
在怪物蓝图中变价事件任意伤害方法。
这里的Damage Causer就是火球的发射者。
前面我们说了黑板的存储是以键值对的形式存在的,我们的key=="目标玩家"上要赋值value=="火球的发射者",利用将值设为对象,self获取AI的黑板,并将黑板中key=="目标玩家"的赋值为value ==Damage Causer。
这里会有人好奇,怪物蓝图是怎么得到黑板对象,并对其赋值的。
怪物蓝图绑定了AI控制器,AI控制器运行了AI行为树,所以怪物蓝图运行了行为树,且行为树对应唯一的黑板对象,所以怪物蓝图拿到了唯一的黑板对象。
这就实现了AI自动跟踪的效果。
2.修复原视频中,第二次攻击怪物后,怪物卡在原地不动的BUG
哇,测试了很久才测出来的,视频中,为了实现让受击怪物僵直在原地的效果,有一个立即停止移动的逻辑,导致怪物在ai move to时永远也不可能成功,行为树卡在了ai move to上,
既然卡在了AI MOVE TO上,当AI MOVE TO失败后,我们继续让怪物跳回方法最初的地方继续判断和执行即可。
3.怪物攻击玩家
主要流程为下
1.行为树调用怪物普通攻击。
2.怪物普通攻击只播放蒙太奇,蒙太奇创建动画通知调用施加伤害方法。
3.施加伤害方法把伤害打到主角上。
打开怪物总类蓝图,创建怪物攻击玩家的自定义事件
1.创建怪物的普通攻击的自定义事件,就只是播放一个动画蒙太奇,随后通过在蒙太奇中添加通知的方式,调用施加伤害的方法,实现动作游戏中,特定帧造成伤害的效果。
2.施加伤害的自定义事件的实现
通过针对Object进行多球体追踪,在怪物身前70像素,100半径内获取到pawn对象
获取到pawn对象转换为玩家对象,后进行应用伤害,随后会通过动画通知调用这个方法实现。
3.创建攻击蒙太奇并添加通知
在动画蓝图中,通过通知调用001怪物的施加伤害事件
4.AI行为树调用最初的普通攻击方法
新建任务怪物攻击,怪物攻击后逗留1秒,比较自然。
逻辑很简单,怪物不死亡,直接调用怪物的普通攻击方法,即可。
总体思路:因为前面的行为树:“怪物走向玩家”成功后,才会执行这个“怪物攻击”节点,所以这个怪物的普通攻击肯定是面向主角,且距离较近,在播放普通攻击蒙太奇后,动画通知会自动调用施加伤害的方法,施加伤害通过多球体对object进行检测,获取球体内的所有pawn,如果这个pawn能转换为主角,则对主角调用应用伤害方法,最后再实现一下主角蓝图中的任意伤害事件即可,实现方法如下: