大象无形UE4笔记六:UBT

大象无形UE4笔记六:UBT

今天主要介绍分享一下书中第8.4节 道常无名:UBT和UHT简介 一节。

本节会先着重介绍UBT工具,对UHT与代码反射的介绍详见下一节。

概述

那么UBT和UHT到底是什么呢?

UBT

首先UBT全称为 UnrealBuildTool ,意思是虚幻引擎的构建工具,它主要负责分析build.cs和Target.cs等配置文件,并把虚幻的*.h和*.cpp文件编译并链接为二进制可执行文件exe/dll。如下图:

UHT

而UHT的全称为 UnrealHeaderTool,意思是虚幻引擎的头文件工具,主要负责解析各个头文件,并分析其中的有UCLASS(),USTRUCT()等前缀的类,以及UFUNCTION()等前缀的函数,并且把这些类与函数等信息通过生成(*.generate.h)等代码反射给蓝图使用,如下图:

完整编译流程

UBT收集目录中的*.cs文件,解析各种编译配置;然后UBT调用UHT分析需要分析的*.h文件,根据文件是否有UCLASS(),UFUNCTION()等宏,来反射信息,并生成*.generated.h和*.gen.cpp文件;最后UBT调用MSBuild,将相关*.h/ *.cpp代码,以及生成的*.generated.h和*.gen.cpp一起编译。

UBT概述

UBT是用C#做的一个命令行可执行程序exe,它的代码在Engine\Source\Programs\UnrealBuildTool,我们可以在UE5的解决方案的Programs目录中找到它:

它编译后生成的exe文件位于Engine\Binaries\DotNET\UnrealBuildTool目录,我们可以进入控制台(cmd)在这个目录,输入UnrealBuildTool.exe启动这个工具:

UBT命令行模式

一,生成项目解决方案

我们知道当我们刚创建一个名为MyGame游戏项目时,会右键点击MyGame.uproject,然后点击“Generate Visual Studio project file”以便生成MyGame.sln的解决方案,方便用Visual Studio打开它来编译。

其实,这个操作也能直接调用UBT的命令行来实现,我们先在命令行模式,cd到Engine\Binaries\DotNET\UnrealBuildTool目录,然后输入:

UnrealBuildTool.exe -projectfiles -project=I:/ue5/Projects/MyGame/MyGame.uproject -game -rocket -progress -log=I:/ue5/log1.txt
也可以生成 MyGame.sln文件。

同样,我们也可以在Visual Studio中调试这个UnrealBuildTool工具的C#源代码。我们先右键点击这个项目,然后点击“属性”,在属性那里选择“调试”,然后在“命令行参数”那里输入:-projectfiles -project=I:/ue5/Projects/MyGame/MyGame.uproject -game -rocket -progress -log=I:/ue5/log1.txt

如下图:

然后选择这个项目,并设置为“启动项目”,然后按F5即可断点调试UnrealBuildTool的C#源代码:

二,编译项目

我们也可以用UBT的命令行来编译一个UE5的项目,比如我们可以cd到Engine\Binaries\DotNET\UnrealBuildTool目录,然后输入:

UnrealBuildTool.exe MyGameEditor Win64 Development -Project=I:/ue5/Projects/MyGame/MyGame.uproject

它就会编译MyGame项目在Win64平台的Development Editor 配置的目标exe出来,如下:

我们看到第一个 参数为 MyGameEditor,这个是什么意思呢?它表示生成MyGame项目的Editor目标,即带UE5编辑器的目标,方便内部开发与调试。如果这个输入MyGame的话,它是编译发布给玩家的game.exe,不带UE5编辑器,资源也必须提前cook好,不然运行不了程序。 其中,这两个命令是跟解决方案的*.Target.cs文件一一对应的,如下图:

到这里,我们发现其实我们只要安装过Visual Studio的C++编译环境,其实脱离Visual Studio编辑器也可以在命令行编译UE5引擎与游戏了。这也是为什么Rider等其他编辑器也能编辑与编译UE5引擎代码的原因。甚至我们还可以用vim修改引擎代码,然后用命令行编译和运行引擎。

那么UBT我们先介绍到这里,如果读者对UBT本身的代码感兴趣的话,可以在Visual Studio把UnrealBuildTool项目设置为“启动项目”,并且右击项目,点击“属性”,在属性那里选择“调试”,然后在“命令行参数”输入类似:

MyGameEditor Win64 Development -Project=I:/ue5/Projects/MyGame/MyGame.uproject

就能在Visual Studio中断点调试这个UBT工具本身的C#代码与原理了。笔者暂时对UBT的底层原理这块就不求甚解了。另外书中还详细提到了WinMain函数代码是怎么编译进exe的,这块有兴趣的同学也请自己参照下书本上的内容。

下一节我们会分享代码反射与UHT工具的基本原理,敬请期待!

发布于 2022-09-11 23:58