虽然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,而且还是跨平台的,更多的奇淫巧技慢慢发掘吧。