UE4模块系统详解

转载注明出处

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 代码,所以需进行一些必要的配置。

  1. 需要在 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极其简单的封装。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值