源码的编译过程
2024年1月8日 2025年4月20日
编译源码的规则使用C#编写
拿TheBasics举例, 包含以下3个文件:
- Source/TheBasics/TheBasics.Build.cs
- Source/TheBasics.Target.cs
- Source/TheBasicsEditor.Target.cs
编辑虚幻引擎项目是通过unreal build tool完成的, ubt为虚幻引擎提供的子例程, 其路径为 EpicGames/UE_5.1/Engine/Binaries/DotNET/UnrealBuildTool/
我们通常不直接使用unreal build tool, 而是调用对应的脚本
EpicGames/UE_5.1/Engine/Binaries/ThirdParty
里存放了很多第三方工具. 脚本里包含了这些工具的路径, 减少了虚幻引擎的环境配置工作
引擎代码模块化
EpicGames/UE_5.1/Source/
引擎代码由若干个模块组成, 模块对指定功能进行了封装, 如ai、特效和用户界面等
每个模块拥有一个xx.Build.cs文件, 包含其编译说明
模块类的编译规则拥有基类module rules, 我们可以对编译规则进行设置
不同平台上, 模块的编译规则也不同
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" });