01 - 模块,插件,项目工程与独立程序

本文主要说明了UE中:

  • 模块(Module),插件(Plugin),项目工程(Project)和独立程序(Program)的概念和关系。

模块 Module

模块是虚幻引擎中管理代码编译的最小单位,它将一组代码资源按一定规则聚合到一起,实现特定功能以供外部调用。每个模块中都有一个模块名.Build.cs文件,模块中除了代码文件外,还可包括其他文本,音频,图片等内容。

根据模块存放路径的不同,可将其分为引擎模块,项目模块和插件模块。模块之间没有互相依赖的关系。模块的.cpp代码中应该有宏IMPLEMENT_MODULE()

模块有不同的加载时机和不同的使用环境,它的相关定义在Engine/Source/Runtime/Projects/Public//ModuleDescriptor.h中。

加载阶段

模块的加载阶段定义于名称空间ELoadingPhase的枚举类Type中:

定义备注
EarliestPossible尽可能早地加载
PostConfigInit在配置系统初始化后加载
PostSplashScreen在引擎编辑器加载界面后加载
PreEarlyLoadingScreencoreUObject 之前加载,用于设置手动加载屏幕,应该是内部使用的
PreLoadingScreen在引擎完全初始化之前加载,用于需要在触发之前挂接到加载屏幕的模块
PreDefaultDefault阶段之前加载
Default默认加载阶段
PostDefaultDefault阶段之后加载
PostEngineInit在引擎初始化后加载
None不自动加载

如果想要自己添加阶段,需要完善配套的FromString()ToString()

使用环境

模块的使用环境定义在EHostType::Type中:

定义备注
Runtime在除了独立程序Programs的平台上加载
RuntimeNoCommandlet在除了Programs和通过commandlet运行的编辑器的平台上加载
RuntimeAndProgram在包含Program的所有平台上加载
CookedOnly只在烘焙后的游戏中加载
UncookedOnly只在烘焙前的游戏中加载
Developer已弃用
DeveloperTool在启用bBuildDeveloperTools的平台上加载
Editor只在编辑器启动时加载
EditorNoCommandlet只在编辑器启动,且不是commandlet模式时加载
EditorAndProgram只在编辑器和独立程序平台上加载
Program只在独立程序平台上加载
ServerOnly只在除了特定客户端的平台上加载
ClientOnly只在除了特定服务器的平台上加载
ClientOnlyNoCommandlet只在编辑器和不是commandlet模式的客户端上加载

如果想要自己添加使用环境,需要完善配套的FromString()ToString()

常用的运行环境主要有RuntimeEditor,前者适用于大部分情况(除了独立程序平台),后者只允许在编辑器平台下使用。需要注意的是,严禁在游戏主模块中包含Editor模块,这会导致工程打包失败,因为Editor模块会在打包时剥离出去。

文件结构

模块的推荐文件结构如下:

模块名
-  Private
|- [模块名]Module.cpp
|- 所有.cpp文件和私有头文件
-  Public
|- 所有公共头文件
-  [模块名].Build.cs

插件 Plugin

插件包含一个或多个模块,它在插件名.uplugin中定义了所包含模块的加载阶段LoadingPhase,使用环境Type,以及作者等信息。

插件分为引擎插件(引擎内置的插件),项目插件和GameFeature(UE5提供的特殊的项目插件)。插件通常只允许引用引擎内容(引擎插件和引擎模块),而GameFeature允许引用项目内容。

插件之间可以互相依赖,但需要遵循一定的规则。

项目工程 Project

游戏项目工程包含一个或多个模块,并且必须包含游戏主模块。它在项目名.uproject中定义了所包含插件等信息。

项目可以引用引擎插件的模块和引擎模块,也可以引用项目插件的模块,但是不能引用GameFeature插件的内容。

项目工程的.cpp代码中应有宏IMPLEMENT_PRIMARY_GAME_MODULE()

独立程序 Program

独立程序类似项目工程,是它的简化版。它应至少包含一个模块,且该模块为应用主模块。

独立程序一般只引用引擎模块和引擎插件的模块,需要源码版本的引擎编写使用。

独立程序的.cpp代码中应有宏IMPLEMENT_APPLICAITON()

总的来说,模块,插件和项目的关系图如下:

拓展阅读

  • UE 插件与工具开发:基础概念 | 循迹研究室 (imzlp.com)

参考资料

  • UE5 虚幻引擎UEC++从基础到进阶_哔哩哔哩_bilibili
  • ELoadingPhase::Type | Unreal Engine 5.6 Documentation | Epic Developer Community