01 - 模块,插件,项目工程与独立程序
本文主要说明了UE中:
- 模块(Module),插件(Plugin),项目工程(Project)和独立程序(Program)的概念和关系。
模块 Module
模块是虚幻引擎中管理代码编译的最小单位,它将一组代码资源按一定规则聚合到一起,实现特定功能以供外部调用。每个模块中都有一个模块名.Build.cs
文件,模块中除了代码文件外,还可包括其他文本,音频,图片等内容。
根据模块存放路径的不同,可将其分为引擎模块,项目模块和插件模块。模块之间没有互相依赖的关系。模块的.cpp
代码中应该有宏IMPLEMENT_MODULE()
。
模块有不同的加载时机和不同的使用环境,它的相关定义在Engine/Source/Runtime/Projects/Public//ModuleDescriptor.h
中。
加载阶段
模块的加载阶段定义于名称空间ELoadingPhase
的枚举类Type
中:
定义 | 备注 |
---|---|
EarliestPossible | 尽可能早地加载 |
PostConfigInit | 在配置系统初始化后加载 |
PostSplashScreen | 在引擎编辑器加载界面后加载 |
PreEarlyLoadingScreen | 在 coreUObject 之前加载,用于设置手动加载屏幕,应该是内部使用的 |
PreLoadingScreen | 在引擎完全初始化之前加载,用于需要在触发之前挂接到加载屏幕的模块 |
PreDefault | 在Default 阶段之前加载 |
Default | 默认加载阶段 |
PostDefault | 在Default 阶段之后加载 |
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()
。
常用的运行环境主要有Runtime
和Editor
,前者适用于大部分情况(除了独立程序平台),后者只允许在编辑器平台下使用。需要注意的是,严禁在游戏主模块中包含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