六一的部落格


关关难过关关过,前路漫漫亦灿灿。



编译源码的规则使用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/ 为例

  1. Engine.Build.cs文件中


  2. 包含模块相应头文件


TheBasics模块使用预编译头文件

Source/TheBasics.Build.cs

  1. PCHUsage项默认设置


  2. 编译时,会包含依赖模块提供的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" });

源码的编译过程


编译源码的规则使用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/ 为例

  1. Engine.Build.cs文件中


  2. 包含模块相应头文件


TheBasics模块使用预编译头文件

Source/TheBasics.Build.cs

  1. PCHUsage项默认设置


  2. 编译时,会包含依赖模块提供的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" });