迁移到Github Pages

反正也很久没有写博文了……

ESO 上古卷轴OL 本地化文件提取拆分

起源于游戏5.1.5版本的更新,微攻略汉化迟迟不出兼容,折腾了几天,终于有点头绪并且导入游戏成功了。走了几天的弯路,被微攻略自己发布的开源工具误导进坑,其实如果只是简单地导入新增文本,完全用不到那个工具。而且我这边勉强搭建好环境也无法成功运行脚本,总之非常迷……

必备工具:EsoExtractData,其它文本编辑器,除非使用拆分功能,否则不建议用使用Excel编辑(内存爆炸警告)。

使用资源提取器提取The Elder Scrolls Online\depot\eso.mnf 文件,提取的时候注意命令行窗口的输出,在本地化文件提取完毕,到提取.gr2文件时就可以关闭了。然后到Depot目录下找export\gamedata\lang目录,复制en.lang文件到提取器所在目录。(不建议在游戏内目录操作提取和修改动作)

将汉化文件zh.lang同样复制到提取器所在目录,用cmd进入提取器目录运行。(大佬熟悉的话也可以写.bat来一键运行)

使用esoextractdata -d zh.lang en.lang提取出三个对比文件,en.lang.added.csv、en.lang.changed.csv、en.lang.removed.csv。其中 en.lang.added.csv 为当前版本新增的本地化文本。然后用文本编辑器将 en.lang.added.csv 的内容复制到zh.lang.csv内即可。

如果没有生成zh.lang.csv文件,可以使用esoextractdata -l zh.lang来转换汉化文件到.csv方便编辑。确定复制无误或是翻译了内容后,使用esoextractdata -x zh.lang.csv把可编辑的zh.lang.csv汉化文件转换到游戏识别的zh.lang文件。然后将转换后的文件复制到汉化插件的AddOns\gamedata\lang目录,启动游戏即可,如果游戏正在运行需要关闭游戏再开启才会生效。汉化文件为游戏启动时加载,且重载界面/reload命令是不会影响到汉化文件的重新读取。

UE4敌人AI,Roll点数特别好用

[之前一篇博文]讲了AI的一些基本思路,后来又看了一些关于AI的教程,文档和神秘代码之后,发现最适合自己的还是那个思路。毕竟UE4的路很多,选择自己顺手的才是最适合的。

经过一些修改之后,AI控制器蓝图我已经基本不用了,由敌人的父级蓝图来进行一些关于AI控制器的数值传递与一些初始化工作。整个AI最核心的部分就是行为树和第一个选择器上的行为树服务蓝图,这个思路依旧不变。不过随着黑板键值越来越多之后,需要公开变量也越来越多,这是一个待解决问题。

20170529_01_BBT_service.jpg

眼尖的你可能已经发现了,选择器上有一个前置条件就是在不为闲置的时候运行行为树,这个主要作用就是在AI之间对打胜利之后清除仇恨。由于目前还没做队友AI的相关内容,所以加了这一条件。

20170529_02_AIServiceBP.jpg

这是目前行为树服务蓝图的内容。主要是根据与目标距离来选择部分攻击。让玩家在各个距离段都感受到压力才是我的目标。当然,AI一直攻击没完没了,缺少平衡是绝对没什么乐趣可言的。在之前的博文中我也有截图,利用欲望点来控制AI的攻击频率。

20170529_03_DesirePointCompare.jpg

同时利用CompareInt节点,让欲望点也可以控制AI的行动,来决定普通攻击或者是重击等行为。CompareInt节点非常方便,可以让AI的行动进一步随机化。

20170529_04_ActionPoint.jpg

在后来我又增加了“行动点”变量来进一步控制AI的攻击频率,在每次攻击之后都会消耗“行动点”来防止AI连续攻击过多。不过不建议把行动点设置太高,会让AI看起来略微奇怪。

之前说的坑:

清除黑板键值这件事已经不干了,这是个错误的方向。行为树节点Decorator里的Flow Control不要随便设置即可,尤其是中止设置,除非你清楚这到底是干什么的,否则不要去动这个选项。

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做二次判定,由当前玩家角色位置到上个节点获得的敌人位置发射一条射线,确保两者之间没有墙等场景物体的遮挡。

20170322_01_GetTarget.jpg

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

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

20170322_03_GetTargetCharBP.jpg (来自角色蓝图)

二、锁定敌人

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

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

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

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

20170322_02_LookTarget.jpg (来自锁定蓝图)

![20170322_04_LookTargetDelta.jpg](https://vip2.loli.io/2022/09/10/VlJ4WFn7pTx21Ig.jpg (来自角色蓝图)

三、取消锁定

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

20170322_05_LockOff.jpg

其它资料:

参考视频: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蓝图和行为树共享,方便蓝图与行为树之间通讯。

20170321_01_Enemy_InitializeVar.jpg

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

20170321_02_OnSeePawn.jpg

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

20170321_03_AIBluePrint.jpg

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

20170321_04_BT.jpg

20170322_05_BTT_NormalAttack.jpg


一些坑:

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