虽然UE是个游戏引擎,但并不是只能写游戏——你甚至可以用来写Win32 GUI程序😏.
通常,我们使用Editor创建一个UE的游戏项目,然后在其基础上构建自己的类并在游戏中使用。但是如果不想要创建一个游戏项目,UE也支持可以独立运行的程序(Standalone Application),能够从main函数来自主构建自己的程序,完全控制启用哪些Modules,而不依赖于引擎本身的逻辑架构,也可以将其作为学习和测试UE模块的轻便方法。
注:UE并没有提供直接创建Standalone Application的方法,我自己写了一个创建
Program项目的工具:hxhb/ue4program,并实现了一个独立运行工具的Demo:hxhb/UE4Launcher。
Forward
本文的内容实践需要使用本地从源码构建出来的引擎(源码版引擎)而非从EpicGameLauncher安装的引擎(安装版引擎),我之前的文章里介绍过UBT是检测是否存在Engine/Build/InstalledBuild.txt该文件,来判断引擎是从Launcher安装的还是从源码编译的,但是源码版和安装版并不是只有这么多区别,一些ThridParty的build.cs是不一样的,会造成源码版和安装版引擎对于相同的代码会有不同的编译行为(比如Engine/Source/ThirdParty/HarfBuzz),虽然这些问题也可是可以搞定的,但是我不建议你那么做。
Create Program
首先,下载我写的hxhb/ue4program,将其添加到系统的PATH路径中。添加之后的用法如下:
1 | # ue4program.exe ProgramName |
此时会在当前目录下创建出一个StandaloneApplication文件夹,其目录结构如下:
1 | StandaloneApplication |
本篇文章着重需要分析的是*.target.cs与*.build.cs这两个文件.
创建出来之后,需要将StandaloneApplication文件夹移动到Engine\Source\Programs下,UE所有的辅助程序(UHT/UBT等)都在这个目录之下。
然后,运行GenerateProgramProject.bat,这是我仿照UE的GenerateProjectFiles.bat写的一个脚本,通过调用UBT来创建Standalone Application程序,命令如下:
1 | # bash path in Engine\Source\Programs\StandaloneApplication |
注意:直接在安装版引擎中使用上面的命令会报错(不允许创建非Game项目),因为虽然传入了-notinstallengine参数,但是对Engine/Build/InstalledBuild.txt文件检测的优先级高于-notinstallengine:
1 | Zhalipeng MINGW64 /d/UE_4.18/Engine/Source/Programs/StandaloneApplication (master) |
我写的脚本中做了检测,如果使用的是安装版引擎会先重命名InstalledBuild.txt,生产完毕后会恢复(但是我还是建议不要在安装版引擎中执行)。其执行完毕后会在Engine\Intermediate\ProjectFiles下生成:
1 | StandaloneApplication.vcxproj |
其实就是将当前项目添加到UE的解决方案,执行完毕之后,打开引擎根目录下的UE4.sln,就可以看到创建的项目了:
先来编译运行看一下结果:
Program *.target.cs
UBT支持数种Target类型(通过枚举类型TargetType来指定):
- Game:独立运行的游戏;
- Client:与Game相同,但不包含任何服务器代码;
- Server:与Game相同,但不包含任何客户端代码;
- Editor:UE编辑器的扩展;
- Program:独立运行的程序;
1 | // Engine/Source/Programs/UnrealBuildTool/Configuration/TargetRules.cs |
关于.target.cs的文档介绍:UnrealBuildTool/Targets.
hxhb/ue4program创建生成的*.target.cs模板:
1 | using UnrealBuildTool; |
目前,最需要关注的参数只有三个:
- Type:需要指定为需要构建的目标类型
TargetType.Program. - LinkType:指定为
TargetLinkType.Monolithic则将目标编译成一个单个的可执行文件(不依赖任何DLL). - bIsBuildingConsoleApplication:
ture支持Console,函数入口为main;false则不支持Console,主函数入口为WinMain.
其他参数的(RTTI/Exceptions)均能在用到时根据需求从文档查询。
Program *.Build.cs
Program的*.Build.cs与普通的游戏项目的没有区别(因为Game是一个模块,Program也是),唯一的区别就是将这些模块构建成什么样的目标类型(由*.target.cs决定)。
Demo: UELauncher
hxhb/UE4Launcher是我使用UE的Program模式写的一个便捷的UE Project启动器,可以方便地加入启动参数,选择引擎版本,可以从hxhb/UE4Launcher/release下载并安装。我有一篇独立的文章来介绍该工具、更新日志与下载链接:开源一个虚幻引擎启动器UE Launcher。
主界面:
编辑配置文件:
.uproject文件的右键菜单关联:
.uejson文件的右键菜单关联:
命令行的参数支持:
-g:-g参数后跟.uproject文件,为.uproject生成.uejson配置文件;-e:-e参数后跟.uejson文件,打开窗口以编辑该配置文件;-c:-c参数后跟.uejson文件,启动该配置(不会打开编辑窗口)
1 | # generate LauncherConf_ShooterGame.uejson |
源码中也支持非常简单的扩展UE的其他工具,比如UBT/AutomationTool等,都可以增加为启动的工具(Editor/Editor-cmd为默认)。
End
使用Slate写UI可以参考SlateViewer这个模板示例的各种控件用法,也可以借鉴UnrealFrontend的实现。
当然Standalone Application能做的不仅仅是写UI这么简单,UE里的模块都可以用,是超级强大的Library,而且还是跨平台的,更多的奇淫巧技慢慢发掘吧。