源码的编译过程
2024年1月8日 2024年1月11日
编译源码的规则使用C#编写
拿TheBasics举例, 包含以下3个文件:
- Source/TheBasics/TheBasics.Build.cs
- Source/TheBasics.Target.cs
- Source/TheBasicsEditor.Target.cs
编辑虚幻引擎项目是通过UnrealBuildTool完成的, UBT为虚幻引擎提供的子例程, 其路径为 EpicGames/UE_5.1/Engine/Binaries/DotNET/UnrealBuildTool/
我们通常不直接使用UnrealBuildTool,而是调用对应的脚本
EpicGames/UE_5.1/Engine/Binaries/ThirdParty
里存放了很多第三方工具. 脚本里包含了这些工具的路径,减少了虚幻引擎的环境配置工作
引擎代码模块化
EpicGames/UE_5.1/Source/
引擎代码由若干个模块组成,模块对指定功能进行了封装,如AI、特效和用户界面等
每个模块拥有一个xx.Build.cs文件,包含其编译说明
模块类的编译规则拥有基类 ModuleRules,我们可以对编译规则进行设置
不同平台上,模块的编译规则也不同
TheBasics.Build.cs文件中的编译规则
依赖模块列表
PublicDependencyModuleNames
4个默认依赖:
- Core
- CoreUObject
- Engine
- InputCore
可以添加要使用的第三方库,如机器学习库和计算机视觉库
可用构建选项:
参考
TheBasics模块
Souce/TheBasics/TheBasics.cpp
中,使用宏定义了游戏模块
游戏也可以由模块组成
项目描述
TheBasics.uproject
json格式
Mudules字段描述游戏模块TheBasics
EngineAssociation字段描述引擎版本
虚幻引擎根据uproject生成项目所需文件,并根据虚幻编辑器的设置来运行项目
预编译头文件(PCH, Precompiled Headers)机制
预编译头文件机制提前处理模块内文件,并替换相应文本,可以减少编译项目时预处理器的工作量
模块预设共享头文件
以 Engine/Source/Runtime/Engine/
为例
-
Engine.Build.cs文件中
-
包含模块相应头文件
TheBasics模块使用预编译头文件
Source/TheBasics.Build.cs
-
PCHUsage项默认设置
-
编译时,会包含依赖模块提供的SharedPCHHeaderFile
不使用预编译头文件机制
设置PCHUsage为NoPCHs
1// PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; 2PCHUsage = PCHUsageMode.NoPCHs;
按照之前添加的头文件,编译没有问题
换言之,使用默认PCHUsage设置,可以不用添加那些头文件
注意: 未包含USceneComponent的头文件,AActor中有包含
IWYU
Include-What-You-Use
构建目标
之前都是在虚幻编辑器中运行游戏,构建目标是TheBasicsEditor
Source/TheBasicsEditor.Target.cs
构建独立(standalone)游戏时,target为TheBasics
Source/TheBasics.Target.cs
如果想将游戏构建为专用服务器,添加TheBasic.ServerTarget.cs文件,自己实现
- 设置Type为TargetType.Server
游戏项目的动态库
如 TheBasics/Binaries/Mac/UnrealEditor-TheBasics.dylib
每个模块对应一个UnrealEditor打头的动态库文件
当我们下载虚幻引擎时,将预编译模块的动态库文件下载到本地
当我们编译源码时,在本地生成模块的动态库文件
设置头文件搜索路径
Source/ShootTraining.Build.cs
1PublicIncludePaths.AddRange(new string[] { "ShootTraining/Public/Player" });