参考文献:
《大象无形:虚幻引擎程序设计浅析》
[UE4C++程序]GameModule与Plugin_C/C++_程序达人-CSDN博客
基本概念:在UE3的时候是用MakeFiles实现开发中编辑器和最终发行游戏之间的分离,到了UE4有了UnrealBuildTool和UnrealHeaderTool,带来了模块机制,解决了这个问题的同时也带来了模块化编程的新特性。UnrealBuildTool和UnrealHeaderTool的工作内容:对模块的配置、编译,指导引擎对模块的启动、运行。
我们的项目其实是UE4引擎的一个Module(模块),这也是为什么你给你的项目创建新的C++类,每个类的UClass() class 后面都会跟上个XXX_API宏,不同的模块之间就是通过这个区分模块的宏进行互相访问的。
UE4中的一个模块的模块文件夹内应该包含的内容:
·Public文件夹,用来存放头文件,头文件里面如果是声明一些数据结构或者比较简单的实现:如获取路径函数,那就不用在源文件里面写实现,直接写在头文件里面了。
·Private文件夹,用来存放源文件和预编译头,
·.build.cs文件,里面的配置参数用于指导UnrealBuildTool处理该模块,然后通过处理后的数据指导引擎如何使用该模块的行为。
·PrivatePCH.h文件,预编译头,是共享模块中大家都会用到的头文件,加快项目的编译速度(当项目有很多源文件的时候很有用),举个例子:PrivatePCH里面包含Log.h,Log.h声明了好几个Log供不同的类debug输出
**实际上PrivatePCH就是一个头文件,只不过这个头文件的作用就是减少源文件中依赖的头文件数量(有点绕)
**无论是在Source文件夹下的模块(按照上面格式定义的模块),还是插件类型的模块,其模块的布局都是一样的
**模块里面可以有模块,允许套娃(不建议),比如project可以有plugin插件,可以在Source里面套模块,可以在plugin里面套模块,模块里面可以有模块......一切只需要你按照上图那样布局,把 build.cs 模块.h 模块.cpp 写好就行。但是,至少要使用 IMPLEMENT_PRIMARY_GAME_MODULE 注册一个模块,这个模块就是你游戏本体模块,其他模块都是游戏性模块,用IMPLEMENT_GAME_MODULE 方法进行注册。
**注意,多一个模块说明将会多一个dll,核心的游戏性模块不应该分成太多个dll,这样会导致更加频繁地处理 DLL文件导出或接口类,除非你要搞个很长期维护的项目,至少得是维护一个商业游戏引擎级别的,不然,按照官方文档里面说的——“使用多个游戏性模块会使得连接时间更短,代码迭代速度更快; 但使用过多的模块,你需要更加频繁地处理 DLL 文件导出 和/或 接口类。对于引擎和编辑器代码来说,做出这种妥协是正确的选择,但对于游戏性代码来说,就不是很合理了。”所以,一般的游戏,核心的游戏性模块应该在项目Source文件夹里面套娃,依赖性和耦合性没有那么强的功能,建议做成Plugin插件
.uplugin .uproject .Target.cs
三个文件都是模块说明文件,都有引入其他模块的功能
其中.uproject引入Plugins插件这种模块的方式是,插件是一种特殊的模块
.Target.cs
关于模块说明详情请看/Engine/Source/Runtime/Projects/Public/ModuleDescriptor.h
Projects | Unreal Engine Documentation
Name:模块名
LoadingPhase:ELoadingPhase::Type | Unreal Engine Documentation
Type:EHostType::Type | Unreal Engine Documentation
AdditionalDependencies:运行该项目所必需要的模块
Build相关配置快速查找:
.target.cs
.build.cs