当前位置: 华文问答 > 游戏

虚幻引擎对mod的支持怎么样?

2023-05-11游戏

最近研究了一下Mod的实现方案,网上找了许多,离不开两个东西,打包和插件,虚幻引擎会在游戏启动时检索Content、Saved和Plugins这些文件夹下的Pak文件夹们,然后把所有pak文件收集起来加载,然后PluginManager就初始化了,开始找有没有需要默认启用的插件,并且加载他。

硬编码是坏文明!坏文明!!!

最终也是找到了两个可以用于打包插件的解决方案,一个是查利鹏大佬编写的HotPatcher插件,该插件可以打热更包,并且还可以打包GameFeature,但该插件仅支持到5.1版本,硬修改后编译会导致功能不正常,作者说后续会更新,但现在我急急急急急,所以我就去找有没有别的方法能够帮我打个包。

在搜索的时候,发现一篇文章,教你如何添加Mod支持,这里使用的是打包自定义描述文件,用于告诉UnrealPak我需要你用什么参数去打包,这种打包方式支持插件,也就是打包DLC,用DLC名字检查Plugins文件夹中有没有叫这个名字的插件。但在我自己的多种尝试下都无法实现,也不太清楚是什么问题,所以就先暂时跳过手动设置描述文件的方案。

项目启动程序打包

后来发现了一个叫做UGC插件的UE4项目:文章链接,这个项目需要重新编译引擎源码,我的原则是使用公版引擎做尽可能多的事儿,当时以为没戏了,无意中找到了一个论坛帖子,里面在讨论如何让这个UGC插件支持虚幻5,就发现楼中有大佬写出了一个UE5能用的插件(该插件其实就在官方储存库的Fork下,最多星的那位就是这个插件,该插件支持5至今为止的版本号,也就是5.0,5.1,5.2,5.3都支持,只需要修改部分代码即可编译通过,而且功能正常),社区的力量真的是无限大。

那就废话不多说,开始研究这个示例项目和插件,也是在这个示例项目中,我也是第一次发现,虚幻留了很多Mod支持的东西,FPaths中有个ModsDir来获取Mods文件夹的位置(其实我后来并没有使用这个)、Plugin也有一种Type是Mod等等。这个插件能够创建Mod类型的Plugin,仅支持蓝图,可以添加资产,需要在打包项目后,获得Cook出来的资产注册表,把他放在Release文件夹中,插件会识别这个Release文件夹中的资产注册表来给Mod打包,但这个插件打包的原理其实还是打包DLC,只是多了一些用户易用的按钮。打包完成之后可以将pak文件直接丢到游戏目录Content下的Pak中,游戏启动时便会自动读取并挂载这些Mod的Pak文件,PluginManager初始化时自动启用该插件,该插件会搜索类别为Game Mod的插件(是硬编码,有点呃呃),然后用GameInstance子系统存这些插件的数组,用于Mod的实现等,总体来说,这种方法很巧妙,可以后面自己读取插件Pak里的内容,然后添加模组的实现方法,大佬们可以看看这个插件的源码,了解具体的实现。

后来又发现,虚幻5不是有个插件叫GameFeature吗,Lyra、古代山谷都在使用,想用就开,不想用就关,【堡垒之夜】便是使用这个GameFeature实现了更换赛季时,或者单次活动时,都能更轻松地轮换Gameplay和游戏内容,具体可以查看官方介绍:钊哥介绍GameFeature(钊哥有介绍GameFeature的文章,在知乎)

GameFeature的本质还是插件,那我是不是可以用这个UGC插件去帮我打包呢,当然是可以的,修改也是十分的简单,在Editor模块中找到这个:

然后给种类加一个或,在按钮事件中加上对于GameFeature类型插件的检测

接着就可以给Mod加东西了,加完东西之后,记得检查以下参数:

一个是GameFeature的初始状态,你希望他被加载后对游戏造不造成影响,一个是默认启用,作为Mod来说,这个一定是需要勾上的,它需要在Pak被Mount后自动启用,但是在编辑器界面不让√,就需要在uplugin文件中修改。接着就可以打包GameFeature了,打包失败的话可能需要打开解决方案重新编译一下项目。

找到Pak,放在Content文件夹下,应该可以放在FPaths中的ModsDir中,但需要手动挂载Pak,并且让PluginManager加载那个插件(这里不太会,求助一下大佬,有解决方法后续会更新文章的),启动游戏,在控制台中输入ListGameFeaturePlugins,就可以看到这个GameFeature被加载了,并且还显示了他的激活状态

如果不是Active,就需要手动激活,这里可以写一些游戏内的用户界面,给用户自行选择启用哪些GameFeature。

这个便是非常简单的,给游戏添加Mod支持的方法了,自己的知识浅薄,俺也是研究了好久,带给大家一些小小的技巧,希望大家可以用得上。