UE4是由多个模块组成的,不仅包含虚幻源代码的模块,还有创建项目时生成的模块,如果自己写了插件里面还有插件的模块,每个模块都有自己的功能实现,通过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”(例如,MyProject.target.cs定义类“MyProjectTarget”)。
using UnrealBuildTool;
using System.Collections.Generic;
public class MyProjectTarget :TargetRules
{
public MyProjectTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Game;
// 此处为其他属性
}
}
除此之外,在父类里面还定义了多个可以获取或者更改的变量。
其中常用的如下:
- 只读属性
Name (String):此目标的名称。
Platform (UnrealTargetPlatform):编译此目标所针对的平台。
Configuration (UnrealTargetConfiguration):正在被编译的配置。
读/写属性
Type (TargetType) 目标类型。
bUsesSteam (Boolean) 目标是否使用Steam。
bUsesCEF3 (Boolean) 目标是否使用CEF3。
等等多种属性。
所有属性参照以下网址:
Targetsdocs.unrealengine.comModules
模块是UE4的构建模块。引擎是由大量的模块集合实现的,开发游戏的时候提供自己的模块来进行扩充。每个模块都包含了一组功能,并且可以提供公共接口和编译环境(包括宏、路径等)来让其他模块使用。
模块是通过C#源文件声明的,扩展名为.build.cs,存储再项目的Source目录下。属于一个模块的C++源代码与.build.cs文件并列存储,或者存储再他的子目录种。每个.build.cs都声明一个类,从ModuleRules基类衍生而来,并设置属性来控制如何从其构造函数进行构建,这些build.cs文件都由UBT编译。 并被构造来确定整个编译环境。
.build.cs文件的典型结构如下。
using UnrealBuildTool;
using System.Collections.Generic;
public class MyModule :ModuleRules
{
public MyModule(ReadOnlyTargetRules Target) : base(Target)
{
// Settings go here
}
}
与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来改变编译配置:
详细的参数列表参照下面链接:
Build Configurationdocs.unrealengine.comIWYU(Include what you use)
顾名思义:只包含你需要的头文件。
之前的引擎版本大概是4.16之前,包含头文件Engin.h或UnrealEd.h就可以包含大部分你使用到的库,通过预编译头文件(PCH)快速编译这些文件即可达成较快的编译时间。但随着引擎的更新,这成为了一个瓶颈。
所以,引擎添加了IWYU规则。也就是只包含你所需要的头文件依赖,这样可以减小项目的不必要依赖,精简项目,并且可以大大减少编译时间。
编写C++代码的时候,需要遵循以下四个原则:
1.所有头文件只需要添加必要的依赖头文件;
2..cpp文件首先包含自己对应的.h文件(也就是要放在第一行);
3.PCH文件不再是显示包含;
4.不再只包含单个头文件;
IWYUdocs.unrealengine.com其次还有Project Files for IDEs
Project Files for IDEsdocs.unrealengine.com其余比如二进制文件版本划分:
二进制文件版本划分docs.unrealengine.com上一篇:UBT和UHT是什么?