UE4类黑魂锁定系统

黑魂的锁定系统不说完美,但对于一个强调实时对敌人出招做出反应的游戏来讲,已经算不错了。除了预设的锁定位置可能不够好,视角及“瞎几把滚”之外,锁定系统起到的作用还是相当不错的,至少大幅减少了玩家在战斗中控制角色轴向带来的蛋疼问题。

几个主要功能如下:镜头方向寻查及锁定敌人、锁定后永面对敌人、摄像机随敌人移动而移动、自动调整玩家人物轴向。

在制作锁定系统时,参考了President Nelson的《Alice In Tokyo Wonderland》关于锁定的部分思路。本篇文章的结尾会列出他的几个视频。相比Get All Actor Of Class节点,我使用了形状追踪,这样范围更可控一些。在场景内的Actor数量很多时,相比前者节点更省资源。单线追踪相对获取目标敌人来说不是非常适合,判定要比形状追踪更苛刻。

一、获取敌人

这里使用CapsuleTraceForObjects来获取是否有敌人在范围内,Ignore Targets变量来无视当前目标(如果有多个目标在当前范围内),Object Types选择Pawn来确保追踪只获得敌人,而不是所有场景内的物体都会被捕获。Break Hit Result节点内,Hit Actor单独做了一个判定,确保获得了一个Actor,否则返回什么都没获取。然后进入LineTraceByChannel做二次判定,由当前玩家角色位置到上个节点获得的敌人位置发射一条射线,确保两者之间没有墙等场景物体的遮挡。

如果以上两次判定均成功,则返回已获得目标的结果,将获得的Actor变量传递到Return节点内。由外部蓝图做其它工作。

关于切换锁定目标,如果获取敌人做的足够好的话,只需要重新执行一次获取敌人功能即可,这也是我为什么设置Ignore Targets变量的原因。

 

(来自角色蓝图)

 

二、锁定敌人

锁定敌人方面有一个缺点就是需要每帧都调用此功能。基于Tick事件来每次调用节点获得最新的敌人位置并调整角色及摄像机轴向。

RInterp To是个首选节点来调整摄像机的观看轴向,Interp Speed变量数字越大,轴向调整速度越快,数字越小速度越慢,与敌人轴向越大这一副作用越明显。此变量是Float属性,也就是说支持小数,具体数值的大小自行摸索最佳。

接下来使用Set Control Rotation 来设置玩家角色轴向,并且记住此处需要把玩家的Movement Component下的Orient Rotation to Movement设为False。

然后继续使用LineTraceByChannel来追踪玩家与敌人之间的位置和遮挡,来决定是否返回被遮挡。

(来自锁定蓝图)


(来自角色蓝图)

 

三、取消锁定

这方面的判定依照项目更多变化一些,我自己这边主要做了遮挡与距离判定和长按取消锁定。主要思路就是,在取消锁定时,通知敌人父类Class来取消锁定,清空当前锁定目标,将判定锁定的布尔值设为False。即在之前锁定敌人时对角色做的判定与修改设置做一个反向修改。将部分值还原为锁定前的状态。

 

其它资料:

参考视频:https://www.youtube.com/watch?v=D7r12VBs8Qs

https://www.youtube.com/watch?v=RSTctK1u1nM&t=9s

 关于追踪的相关引擎文档:https://docs.unrealengine.com/latest/INT/Gameplay/HowTo/UseRaycasts/Blueprints/index.html

UE4敌人AI的一点初探究

UE4的AI严重缺乏相关的教程和文档,在搞AI的时候可谓是进了一大堆坑,然后在各种文档和教程中慢慢退坑。在各种试错的初期,各种五花八门的方法都试了一下,最终选择敌人的攻击招式写在敌人的蓝图里,行为树来Roll点数选择攻击模式的大方向中。目前来看,这样的方式是最好的。敌人蓝图与AI蓝图和行为树通讯的时候,使用Cast to功能即可。考虑到个人的游戏是类黑魂向的,所以远程型的敌人暂不考虑。敌人初始化状态,使用了Enum列表,此列表与AI蓝图和行为树共享,方便蓝图与行为树之间通讯。

类似巡逻等简单的行为,我选择直接在敌人蓝图内写好相关事件节点,在拖到编辑器内直接选择相关Enum初始化即可。同时在视野侦察方面,我选择了内置的PawnSensing功能的OnSeePawn事件来检测玩家是否进入视野,同时此功能还有噪音获取相关的事件,我还没有细化所以暂且不探究相关内容。

所以敌人的行为大概为:在关卡内初始化–>根据初始化内容来巡逻或在原地等待–>发现玩家–>通知AI蓝图进入战斗状态并运行行为树。

攻击招式同样建立了Enum来选择,目前仅仅是普通攻击,暂未加入连招等攻击方式。Roll点数与玩家距离来决定攻击方式,并且使用行为树Service来控制AI行为。虽然现在仅仅是早期阶段,看起来AI运行的还不错。

 

视频中的敌人在攻击距离上还有点问题,除此之外,作为一个杂兵级的AI雏形表现的还不错。

 

一些坑:

  • 每次在Roll到新的行动时,要清除已存在的黑板键值,否则会按照默认的从左到右模式执行,如果行为多了这种方法会很蛋疼,在考虑寻找更多的教程和解释来按照期望的方式执行。
  • 行为树的AI除了选择行为方式外,不做任何攻击等判定,判定全部交给蓝图来做。
  • 攻击等行为调用在任务蓝图中使用Cast To来完成。
  • 需要一个相同种类、或者是敌人的父类蓝图来驱动,否则一个敌人一个蓝图这样会造成大量低效率文件,让修改工作更蛋疼。

 

 

《黑暗之魂3》,可以享受的受苦游戏

因为久闻其“受苦”的大名,一开始要我入这个游戏我真的是拒绝的。某群的群众同时也在不停地的给我安利本作,正好发售的时候又处于《全境封锁》首月期,也没吃下这个安利。缘起《全境封锁》不给力和育碧强行喂屎,在B站点开了老E的某个受苦视频,各种秒立Flag,还有游戏的动作流畅性和怪物AI比较有有意思,再加上群里的群众鼓动,按捺不住吃下了这个安利。

作为一个特点满满的游戏,《黑暗之魂3》有很多设计不错的地方,也有很多蛋疼的地方。作为一个新手,打败审判者古达之后,在不熟悉游戏套路的情况下,初进洛斯里克高墙被折磨的死去活来,在不知道第一个骑士的房间上边有一个火堆的情况下,惨遭送回高墙火堆N次,后来被某人带着打了看门狗和进行了一些py交易,开始了“直剑之魂”的旅程。


第一次站在高墙边举起小环旗时看着对面的环境,现在再回过头来看,自己的受苦之路历历在目。虽然没有小地图的设置,但在反复的受苦之下,路也基本熟了。而对火堆的巧妙设置,明显可以看出开发组是经过考虑的。

要说恶意的地方,除了埋伏在墙角的怪之外,也可以数的过来。不死聚落到活祭品之路的电梯下去遇到的第一个外征骑士绝对算一个。此怪攻击速度极快,范围广,伤害也高,还附带冰冻伤害,相信大部分玩家都是初见被一顿削之后回到火堆,再次尝试时,有翻滚癌的患者会死的很有节奏。而此怪最大的弱点也很明显,只要在它攻击时翻滚到它屁股后边砍就很容易过了。而玩家在热情好客的不死街受到热烈欢迎并体验到大妈的热情拥吻之后,利用外征骑士继续提升游戏难度。不过,要说游戏里的最终恶意,莫过于敌人的武器攻击可以穿墙,而玩家砍到墙则会出硬直……


游戏敌人的AI和动作设计也可圈可点。虽然新人一周目持盾在某种程度上让游戏成为了回合制,但战斗节奏依旧不慢。抛开小怪不谈,大部分精英怪和BOSS的攻击方式和攻击位置很明显是经过很多测试和调整的,这也算是本作的一大恶意了。为什么翻滚之后的位置正巧是敌人的攻击位置?持盾的骑士为什么往往在你翻滚到它背后的时候给你一个盾击?因为这些都是套路,一切都在宫崎英高的凝视中。

后期高难度的BOSS大部分设计的也不错,沙力万是我遇到第一个教做人的BOSS。原因很简单,在遇到此BOSS之前,我一直以为盾牌和其它游戏一样只是单纯加防御用的,哪知道什么持盾和盾反。想起那个被虐的夜晚,初见迎头一刀,然后几个旋风斩一套带走,连他长什么样都没看清,只记得游戏的经典标题看了一遍又一遍……


要说个人最喜欢的BOSS,非舞娘莫属。其攻击招式华丽且诡异,攻击节奏不定,再加上BGM的气氛渲染,在游戏里是非常有特色的一个BOSS。击杀她的时候大概挂了10多次,每次都基本是享受下来的。虽然舞娘的AI似乎有一点问题,再加上攻击欲望一般,感觉她经常闲逛,就在你攻击几下之后,突然砍下来让你猝不及防。当然,说万句,也不如体去验一次。

在入《黑暗之魂3》之前,还有一个原因就是宝箱怪。煎蛋的无聊图里就有一些宝箱怪的GIF,一个强力的回旋踢让人印象深刻。其实以前玩《倚天》的时候,修炼场萌萌的宝箱也是情怀之一,当然黑魂里的宝箱怪可比倚天里的宝箱厉害多了。还好在进游戏之前就充分了解了宝箱怪,所以也就没在这个怪上边受苦,相反,这个怪还是挺萌的。

作为特色的剧情部分,全靠玩家依据各种线索脑补,NPC的对话寥寥数句。不过最让我印象深刻的还是在走灭火路线时,把眼眸交给防火女的时候,她整个说话的情绪都变了。而且离开之后的对话也有了改变。

虽然游戏不错,可惜蛋疼的地方也不少。最蛋疼的莫过于游戏里的提示键位都是手柄的,很多交互也没有对键鼠进行改进,捏人的滑动条简直无情。游戏的优化也不足,部分场景有固定掉帧,还有各种穿墙的光源。很多的时候,也只能让人抱怨日厂技术差了。还有那奇葩的服务器,我这边各种掉线而别人却不怎么掉,即使挂上代理,也时不时的诡异掉线。