引用马哥的UBT讲解
UE5是由多个模块组成的,不仅包含虚幻源代码的模块,还有创建项目时生成的模块,如果自己写了插件里面还有插件的模块,每个模块都有自己的功能实现,通过build.cs也有自己的编译方式,里面包含了定义的模块的依赖关系、额外的库、路径等信息。这些文件被编译成dll文件,并通过单一的可执行文件进行加载。
需要注意的是,开发环境的项目文件的编译是一个独立的过程。
要想更深入的理解UBT,不得不提及与UBT相关的几个方面:
Targets、modules、BuildConfigration、IWYU、
UBT支持编译多种TargetType:
- Game - 需要烘焙数据来运行的独立游戏;
- Client - 与Game相同,但包不含任何服务器代码,适用于联网游戏。
- Server - 与Game相同,但不包含客户端代码,适用于联网游戏种的独立服务器。
- Editor - 扩展编辑器的一种targetType。
- Program - 基于虚幻引擎打造的独立工具程序。
Target
Target是通过C#源文件声明的,扩展名为.target.cs,并存储在项目的 Source 目录下。每个.target.cs文件都声明一个类,从TargetRules基类衍生而来,并设置属性来控制如何从其构造函数进行编译。当要求编译目标时,虚幻编译工具将编译target.cs文件,并在其中构造类来确定其设置。
类的名称必须与在其中声明这个类的文件的名称相匹配,后跟“Target”(例如,ThirdPersonMPTarget.target.cs定义类“ThirdPersonMPTarget”)。
using UnrealBuildTool;
using System.Collections.Generic;
public class ThirdPersonMPTarget : TargetRules
{
public ThirdPersonMPTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Game; // 需要烘焙数据来运行的独立游戏;
DefaultBuildSettings = BuildSettingsVersion.V2;
ExtraModuleNames.Add("ThirdPersonMP");
}
}
除此之外,在父类里面还定义了多个可以获取或者更改的变量。
其中常用的如下:
- 只读属性
Name (String):此目标的名称。
Platform (UnrealTargetPlatform):编译此目标所针对的平台。
Configuration (UnrealTargetConfiguration):正在被编译的配置。
- 读/写属性
Type (TargetType) 目标类型。
bUsesSteam (Boolean) 目标是否使用Steam。
bUsesCEF3 (Boolean) 目标是否使用CEF3。
等等多种属性。
所有属性参照以下网址:
Targets官方文档
Modules
模块是UE5的构建模块。引擎是由大量的模块集合实现的,开发游戏的时候提供自己的模块来进行扩充。每个模块都包含了一组功能,并且可以提供公共接口和编译环境(包括宏、路径等)来让其他模块使用。
模块是通过C#源文件声明的,扩展名为.build.cs,存储再项目的Source目录下。属于一个模块的C++源代码与.build.cs文件并列存储,或者存储再他的子目录种。每个.build.cs都声明一个类,从ModuleRules基类衍生而来,并设置属性来控制如何从其构造函数进行构建,这些build.cs文件都由UBT编译。 并被构造来确定整个编译环境。
.build.cs文件的典型结构如下。
using UnrealBuildTool;
public class ThirdPersonMP : ModuleRules
{
public ThirdPersonMP(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay" });
}
}
与Target相同,它也有父类提供的默认变量以供开发者使用:
与Target不同的是,它里面的变量都是可以修改的读/写变量。
如:Type(ModuleType) 模块类型 等
BuildConfiguration
UBT将从以下位置中的XML配置文件读取设置:
- Engine/Saved/UnrealBuildTool/BuildConfiguration.xml
- User Folder/AppData/Roaming/Unreal Engine/UnrealBuildTool/BuildConfiguration.xml
- My Documents/Unreal Engine/UnrealBuildTool/BuildConfiguration.xml
配置文件里面有很多参数,可以自定义,了解其中的参数含义可以自定义配置BuildConfiguration.xml来改变编译配置:
详细的参数列表参照下面链接:
Modules官方文档
IWYU(Include what you use)
顾名思义:只包含你需要的头文件。
之前的引擎版本大概是4.16之前,包含头文件Engin.h或UnrealEd.h就可以包含大部分你使用到的库,通过预编译头文件(PCH)快速编译这些文件即可达成较快的编译时间。但随着引擎的更新,这成为了一个瓶颈。
所以,引擎添加了IWYU规则。也就是只包含你所需要的头文件依赖,这样可以减小项目的不必要依赖,精简项目,并且可以大大减少编译时间。
编写C++代码的时候,需要遵循以下四个原则:
-
所有头文件只需要添加必要的依赖头文件;
-
cpp文件首先包含自己对应的.h文件(也就是要放在第一行);
-
PCH文件不再是显示包含;
-
不再只包含单个头文件;
Project Files for IDEs
在VS的IDE中使用.sln
项目文件
除C++的代码外,添加到我们生成多个项目的其他文件的部分示例:
-
着色器源代码(*.usf文件)
-
引擎文档文件(*.udn文件)
-
程序配置文件(*.ini文件)
-
本地化文件(*.int文件)
-
程序源文件和清单(*.rc、.manifest)
-
特定外部(非已生成)项目文件(如UnrealBuildTool、Clean)
安装UnrealVS扩展
- 在以下位置搜寻您的Visual Studio版本的扩展:
[UE5RootLocation]/Engine/Extras/UnrealVS/<VS-Version>/UnrealVS.vsix
- 双击 UnrealVS.vsix文件来开始安装。
- UnrealVS扩展可用于特定的Visual Studio版本。请注意安装程序正在查找您的版本并且框体已经更新,然后点击Install按钮以继续。
- 运行Visual Studio并且在 工具->扩展和更新… 中,您应该可以看到该扩展。
- 扩展同时在 帮助->关于微软Visual Studio 对话框的已安装产品列表中显示。
- 转到 视图->工具栏 或对Visual Studio工具栏区域 右键点击 ,然后选择 UnrealVS 以显示扩展的工具栏。
- 默认情况下,工具栏出现在上方,但其内容可通过选择 命令 选项卡的 UnrealVS 工具栏的 工具->自定义… 来进行自定义。
用UnrealVS扩展进行整合
VS的UnrealVS扩展包括一个工具栏按钮,您可以单击该按钮重新生成当前已加载解决方案的项目文件。
同时还可将快捷键绑定到此功能。在VS中,打开工具(Tools )->选项(Options)-> 环境(Environment)-> 键盘(Keyboard),然后搜索UnrealVS.RefreshProjects。
注意:加载解决方案后才会启用此功能(因为工具需要了解要针对哪个代码分支来生成项目)。如尚未生成 UE4.sln 文件,需首先直接运行 GenerateProjectFiles.bat 脚本。
在单个源文件中迭代
如果你习惯在Visual Studio中使用Ctrl+F7单个源文件(.cpp)中迭代更新,可以将 Ctrl+F7
绑定到 UnrealVS.CompileSingleFile
命令。它会用当前解决方案配置、平台和 -singlefile=<Path to currently open file>
参数编译你的活跃项目。
二进制文件版本划分
LiveCoding
我之前是在使用,关闭UE5 Editor,IDE中编译项目的方法。
但是这样做很慢,每次都要编译整个项目,而且重新开启Editor也要花费很长时间。
使用LiveCoding
然后点击Start Session,重启编辑器
当我们更改了Cpp的代码后输入Ctrl+Alt+F11,即可自动编译,这个是最快的,但是缺点是不能改.h文件