转载注明出处
UE4如何组织模块?
ue4的模块组织是一个相对复杂的工作,这边博文会依照部分源代码进行讲解。
UE4中文件组织模块的主要描述文件有以下几种:
1.插件描述文件,Json,以.uplugin结尾
2.项目描述文件,Json,以.uproject结尾
关于这两个文件有两项需要说一下
加载模块的适用场景(Type)
namespace EHostType
{
enum Type
{
除了独立程序以外的所有目标
Runtime,
除了独立程序和运行命令行模式的Editor
RuntimeNoCommandlet,
所有的目标都加载
RuntimeAndProgram,
只在被cook过的游戏加载
CookedOnly,
只在development的运行时或者editor构建,不在shipping模式下构建
Developer,
在只有Editor启动的时候加载
Editor,
只有在editor启动时加载,但是一定不是在命令行模式下的editor
EditorNoCommandlet,
只在独立小程序中加载
Program,
除了专用客户端以外的其他所有目标
ServerOnly,
除了专用服务器以外的其他所有目标
ClientOnly,
注,如果你增加了一个新值,一定要确保ToString函数也改一下
Max
};
这个模块在哪个阶段被加载?(LoadingPhase)
namespace ELoadingPhase
{
enum Type
{
尽早的被加载,换句话说,uplugin文件可以从pak文件加载(也可以在安装了PlatformFile后加载,以防pak文件不被使用),用于读取文件(压缩格式等)所需的插件
EarliestPossible,
在引擎被完全初始化之前,在配置文件系统被初始化以后马上调用,只在用于在底层拦截其它进程的消息用自己的方式处理使用。
PostConfigInit,
加载前coreUObject设置手动加载屏幕,用于我们的补丁系统
PreEarlyLoadingScreen,
在引擎完全初始化之前加载,因为模块需要在触发之前挂接到加载屏幕
PreLoadingScreen,
在默认阶段之前
PreDefault,
在引擎初始化之前,在游戏模块被加载之后
Default,
在默认阶段之后
PostDefault,
在引擎被初始化之后
PostEngineInit,
不自动加载该模块
None,
注,如果你增加了一个新值,一定要确保ToString函数也改一下
Max
};
3.build.cs,Target文件
说到这里,可能会不理解为什么设立这么多场景,在这里就要提到UE4的本身模块结构划分:
UE4划分为以下5个模块:
Developer主要是跨平台工具,Merge和一些底层的工具。
Editor主要是编辑器相关的代码
Programs主要是独立于引擎,但大多数又依赖引擎的工具,UBT就在这里
ThirdParty第三方库或者插件
RunTime是主要的Gameplay等等和游戏相关的代码了。
- 如何在项目中添加一个插件:
1.在build.cs中添加公共依赖
2.在uproject中添加plugin
- UE4中如何新建模块?
注意目录结构:
目前source只有这三个,现在添加一个新模块
新模块里面必须有这三个文件
在此处一定要注意,只有主模块依赖副模块,其他模块不能依赖主模块,小心形成相互依赖
在target.cs中加入你的模块。注意需要重新构造字符串。
原来:
现在:Add只能增加一个,用Addrange
最后在uproject中添加模块
最后在主模块的build.cs中加入模块
以下一段参考UE4官方文档:如果你的游戏模块涉及UObject,需要进行以下配置
由于新的游戏性模块包含 UObject 代码,所以需进行一些必要的配置。
- 需要在 DefaultEngine.ini 文件中的几个地方添加该模块:
[UnrealEd.EditorEngine] 部分的 EditPackages 数组:
[UnrealEd.EditorEngine]
+EditPackages=<ModuleName>
[Launch] 部分:
[Launch]
Module=<ModuleName>
[/Script/Engine.UObjectPackages] 部分的 NativePackages 数组:
[/Script/Engine.UObjectPackages]
+NativePackages=<ModuleName>
来自 <https://docs.unrealengine.com/zh-CN/Programming/Modules/Gameplay/index.html>
如何实现自定义模块模板:
注意此处要有两个必须实现的方法
详解:
IMPLEMENT_PRIMARY_GAME_MODULE 是什么呢?
这个宏实现的是什么呢?
应该把以下这几个宏放到一起去说。
IMPLEMENT_MODULE
IMPLEMENT_GAME_MODULE
其实是实现常规模块的模块实现样板。
在具体使用的时候,你的C++模块必须使用这些宏定义。
这个宏用来把模块的主类暴露给引擎剩下的部分,具体该怎么解释呢:
1.InitializeModule函数才能被引擎找到。
2.这个宏会让模块从静态连接转化为动态链接。
下图为源码:
那个在使用这三个类有什么场景呢?
IMPLEMENT_PRIMARY_GAME_MODULE 主要的游戏模块,最少有1个,部分源码如下,和IMPLEMENT_GAME_MODULE的区别不大,但是 monolithic mode下是不一样的!!
IMPLEMENT_MODULE 一般不包含游戏代码的模块
IMPLEMENT_GAME_MODULE 包含游戏代码的模块
下方这两个宏其实是一毛一样的哈,就是为了做个区分
第二个参数是模块名称
第一个参数是一个模块接口
从这里看其实FDefaultModuleImpl和FDefaultGameModuleImpl就是对IModuleInterface极其简单的封装。