扩展UE4——链接静态库到UE4引擎中
目录
*综述
*范围与注释
*Visual Studio 2013/2015-库构型
*创建一个项目.
*升级另一个项目
*自定义目标UE4模块
*以64bit平台作为目标
*多线程动态链接库
*第三方目录
*虚拟引擎4(UE4)-构建系统
* 扩展 Base ModuleRules 类
* 加载我们的库
* Visual Studio 2013/2015——链接我们的库
*启动模块
*编组
* 更多信息
综述
本篇指导的目的是为大家展示如何链接静态库到使用Build System的UE4引擎中,初期目标受众是那些不打算升级引擎但希望通过提供相应功能的库来拓展UE4的功能。
举例说吧,我将生成一种叫BobsMagic的库,在将它链接进一个叫UE4Magic的UE4 项目。
范围与注释
*你将可以链接自己设计的函式库。
*本次指南不会深入到公开功能或定义任何AP1
*我希望阅览者至少粗略理解C++,C#,以及MS Visual Studio 2013
*本文所提供的所有代码路径都来自于UE4 Project 基目录。
Visual Studio 2013/2015-库配置(Library Configuration)
当你正在使用UE4引擎,你应该使用相同版本的微软Visual Studio(Microsoft Visual Studio)来编译静态库。这是因为各个版本的Visual Studio的编译程序各不相同,导致二进制上不兼容。请放心,一旦你使用了不同版本的Visual Studio,当你视图将库编入时,系统会提出警告。
创建项目
请移步MSDN,按上面的步骤生成一个新的静态库。由于我们必须做两个修正来让它们运行起来,所以请在完成后返回。
更新另一个项目
当你用Project或配置了早期版本的Visual Studio的解决方案文件打开一个项目,你会被要求进行版本升级。同意开始升级后将会把点编址在本区段起始处。假如你错过了这个对话(dialog),或是该对话未显示给您,有可能在解决方案资源管理器中选择菜单栏的“项目> 升级VC++项目”进行升级。
自定义目标UE4模块
我们将需要做一些其他修正以确保我们的库能被很容易地链入。
以64bit平台作为目标
凭借一个标准的静态库项目我们将把x86(32 bit)平台作为目标,该指令不对UE4起作用。
1.打开项目属性页。
2.选择配置管理器
3.打开使用中的方案平台(Active Solution Platform),在下拉菜单中选择
4.键入或选择x64
5.点击“OK”完成保存
你应该可以在此点结束该项目。你应该在Visual Studio顶端下拉框看到它。
更多内容请见targeting x64
多线程动态链接库(Multi Threaded DLL)
虚幻引擎构建系统预料到使用者提供一个之后会链接进动态链接库(DLL),因此我们不得不确保我们的项目也能完成此链接。
1.打开项目属性页
2.过滤配置管理器> C/C++ > 代码生成 > 运行时间库(Configuration Properties > C/C++ > Code Generation > Runtime Library)
3.在下拉菜单中选择多线程动态链接库(Multi Threaded DLL/MD)
4.点击“OK”完成保存
第三方目录
创建你的项目,记录库被输出的位置。根据你所创建的项目的模式你的库文件(lib project)应位于/bin/Debug or /bin/Release,除非你提交前更改了位置。我们将把它们从这里移动到我们的UE4项目目录,以解除引用和之后的打包。
打开一个新的浏览器窗口导入你的项目目录。导入完成后创建一个新的路径给你的库-/ThirdParty/BobsMagic
对于每一个你要引用的库你都将遵循这一步骤,假如我要增加V8库我将创建/ThirdParty/V8
在这个目录里我们将增加两个新建文件夹——Libraries和Includes——以覆盖它们各自的文件。Includes 是与你的库相伴随的页眉文件,用于定义你在UE4引擎里引用的API(Application Programming Interface/应用程序编制界面)。你应该将你的*.库文件(s)复制进Libraries目录。
注意:这是一个任意的目录。记录它的路径很重要,所以之后你会在构建系统(build system)里引用它。
UE4——构建系统
现在我们将要逐步执行虚幻引擎,把我们的库编址到引擎。
创建系统需要用到一些C#编码,不过无须担心。我们的示例将非常简单,所以你只要复制粘贴下面的代码就可以了。
扩展基础 ModuleRules类
大家也许应该添加两个属性到ModuleRules类。我将记录的这两个属性是用来确保我们知道我们的模块和第三方目录的位置。这两个属性将利用System.IO命名空间,使用2个路径静态方法。
在 /Source/UE4Magic/UE4Magic.Build.cs里
LoadBobsMagic保持了一些build system的配置元素,接受TargetInfo对象,可以让你在编译时间自定义构建。它被传递后可以让我们载入视窗目标的库,自后可以被用于靶向其他平台。这也使用于以64bit或32bit平台为目标的情况。如果你还记得,我在上面提到过x64平台为目标,不过你也可以借此机会编译出32bit(x86)的库。
接下来我们将以将要链接的库之名定义一个被传递的常量。
在/Source/UE4Magic/UE4Magic.Build.cs里
这是一个非常直截了当的设置,不大可能代表一个完全跨平台的构建。我们已经做到了创建在编译时间通过的常量WITH_BOBS_MAGIC_BINDING,设为1(或真)。
Visual Studio 2013/2015——链接我们的库
现在你可以将你的页眉文件包含进去,并启动执行代码。
启动模块(Startup Module)
虚幻引擎一些已知细节是你可以重写默认的游戏执行(Game Implement),当你的模块被启动/关闭(类似于装载/卸载)时你能获得一个已执行的类函数。这未必与build system相关,但却是插件开发者们很有可能在初始化点寻找的常见的事。
在/Source/UE4Magic/UE4Magic.cpp里
你可以在此点启动Visual Studio 调试器,一步步跟踪代码。如果你链接了调试版本,你甚至可以把代码放入你所编译的库。他将装载于 ThirdParty/BobsMagic/Includes/Welcome/ 的页眉文件,让库像我们预期的那样执行。
编组(Marshalling)
你很快就能发现,你的库将不会使用虚幻引擎4里的相同类型。重要的是,你要在两者之间以一种有意义切深思熟虑的方法编组你的数据。若在之后改变可能将会导致复杂化的问题。
当把V8链接进虚幻引擎4时,我在StringConv.h里发现了一对宏命令,用于在宽位字符(Wide Character)、统一码(Unicode)、字符串(Strings)和C-style字符串(C style Character Strings)之间的转换。所以我推荐各位再看看其他有用的转换。你最终可能需要创建封装器对象(Wrapper objects)。
更多信息
我已经成功将V8链接进UE4了,现在正在编写一个模块让大家在自己的项目里以JavaScript作为脚本语言。