前言
通过 开发 C++ Blueprint Library 可以扩展 Unreal Python 插件的功能。
让 Unreal Python 的自动化更上一层楼,比纯 C++ 的调用要简单。
然而 Unreal 的 C++ 插件有个很蛋疼的限制,不同电脑编译的 dll 都无法互相兼容。
直接将插件相关的编译好的 dll 二进制文件扔到项目的 Plugins 目录,启动项目就会弹出需要重新编译的问题。
如果点击是尝试进行重新编译,基本上是不可能成功的。
因为项目用的美术工程都是不提供源码的。
这导致 C++ Plugin 的部署非常受限,过去我开发的东西是和项目的程序工程绑定在一起的,这样部署就不会出问题。
但是最近要支持多个项目,C++ Plugin 如果也能跨项目岂不美哉。
踩坑尝试
最初的方向还是在 Bing 上搜索 C++ plugin distribution 之类的关键字。
也找到了一些论坛和回答上相关的问题,其中有些内容提到了官方的 Plugin说明
最开始我草草阅读 Plugin 说明,留意到里面有提到 发布插件相关的说明,需要用到 package 功能来发布到虚幻商城。
于是我也尝试走了一下打包流程,然并卵,打包只是将插件放到一个空的工程下,但是将工程里的 Plugin 搬到别的 项目中依然需要编译支持。
后来认真地把官方文档通读了一遍。
发现里面分 Engine Plugin 和 Project Plugin 的。
官方说明里提到 Engine Plugin 是不依赖项目的,于是我也尝试了一下将 自己的插件 放到 Engine 的 Plugin 目录下。
启动项目居然没有弹出编译提示,启动成功了。
但是进入引擎之后去找插件,可以看到自己写的插件是没有加载的,勾选上之后重启引擎,然后编译的警告又又出现了。
到此我是真的卡主了,浪费了我好多时间。
这个时候我只好进行进一步测试了,好歹我支持的项目是 程序 美术工程都在手的。
我就不信将自己本机的程序工程拷到美术工程到不行。
于是我也尝试了一下这个方案,结果还真的报警告了。
于是我又还原了美术工程的插件,然后只替换里面的 dll ,结果发现居然可以正常启动了。
我仔细查了一下我插件下的文件,然后我就破案了。
关键是在
UE4Editor.modules
这个文件里面
这个文件里面存储了
BuildId
, 我发现 UnrealBuildTool 应该是识别这个 Id 是否一致来判断这个插件是否需要重新编译的。
因此我没有替换这个文件就不会触发警告。
顺着这个思路查了一下,可以在官方文档里面找到相关的内容 链接
这次是真的找到关键了,正如上面我所说的, Unreal 编译的时候会统一生成这个 BuildId 来确保 dll 是统一环境下生成的。
避免 dll 的不统一导致引擎出现 Crash ,这种 Crash 就很难查,因此 Unreal 直接通过 BuildId 来规避问题。
沿着这个线索可以找到更多有用的信息 UE4多个分支版本兼容相同的工程dll
上面的 CSDN文章 也是我所想要实现的效果,奈何之前不知道怎么搜索一直没找到这种关键的文章。
文章还提到这个 id 是通过 引擎编译的时候生成的 uuid。
检测提示则是在LaunchEngineLoop.cpp
文件里面
只有识别到跳过编译状态才会检测这个 buildId 是否一致。
如果在
EditorPerProjectUserSettings.ini
加入下面的选项
1 | [/Script/UnrealEd.LevelEditorViewportSettings] |
则会强制进行编译,就没有 buildId 检测了,但是强制编译也是不通过的结局。
所以每次引擎更新的时候都要更新一下当前 C++ 模块的 buildId 才不会弹出提示窗口。
那么 BuildId 应该以哪个文件为准呢?
骨骼找到一个 Unreal 插件的说明文档,还是挺有价值的 链接
以引擎内置的
UE4Editor.modules
的 BuildId 为准。
经过我的测试,如果没有别的依赖的话,只要 BuildId 对应, dll 是可以跨项目使用的。
总结
以上就是这次踩坑的情况。
如果不部署到项目的程序工程代码里面的话,就只能用一个工具检测 引擎内置的UE4Editor.modules
有没有变化,变化了就更新 BuildId。
这个处理也是挺麻烦的(:з」∠),不过也不失为一个可行的方案。
当然也有一个更简单的方案,就是得和项目的程序进行商量。
Engine\Build\Build.version
引擎里面有这个文件,具体的配置可以参考 C++ API & 文档
Build.version
的 json 文件里面配置 buildId 就可以了。
但是以后所有的 BuildId 都用这里的配置的 ID。