后续文章更新移步→微信公众号“虚幻社区”(mantra-xhsq),您的支持是我创作的动力。
在UE4中,有一个非常重要的概念:模块(有时或者说大多数时候会被成为“Plugin”,但其实个人感觉模块更合适)。模块是一些功能相关类的集合,在读完本片文章之后你可以继续阅读关于UE4中多模块组织的更多知识,请参考官方文档。
参考文章(英语好的朋友可以直接跳转,但是原文章使用4.15版本制作,新版本需要进一步修改,可参见本文的后半部分)
注意:前半部分是按照4.15版本,如果您使用的是后续更新的版本(如4.19及以上)请看完,里面有一些需要注意的地方。
一、4.15版本的步骤(4.19通用,但是需要进一步操作)
想要创建一个自定义模块,需要一下几步:
1)修改.uproject文件添加自定义模块
2)创建自定义模块相关的文件和文件夹,如.Build.cs、Public和Private文件夹
3)创建模块类
- 修改.uproject文件添加自定义模块
找到工程的.uproject文件右击使用文本编辑器打开,此处推荐使用VSCode,无论格式还是自动补全都支持比较好。
默认情况下只有工程自带的模块,我们需要在大括号下面添加逗号,之后用另外一个大括号包含我们自定义的模块。这里我添加了一个Runtime的模块,名称为MantraModule,下面截图是完整版的.uproject文件。
接下来我们会创建模块相关的文件。
- 创建自定义模块相关的文件和文件夹
定位到工程目录,在Source文件夹下创建一个新文件夹,名称于我们的模块名保持一致,此处我们命名为MantraModule。(如果你创建的是蓝图的模板,那么没有Source文件夹,可以借助File>New C++ Class,等系统编译完成之后会自动添加Source文件夹)文件夹内部添加如下文件:
- 添加一个名称为Public的文件夹(用于存储.h文件)
- 添加一个名称为Private的文件夹(用于存储.cpp文件)
- 添加一个cs文件,命名方式有一定的规则:YourModuleName.Build.cs,此处我们的文件名为MantraModule.Build.cs。
详情见下图
打开.cs文件并添加如下代码:
using
注意:需要根据你的模块名和工程名进行适当的修改。
- 创建模块类
最后一步操作是需要创建一个模块类(类名和模块名一摸一样,此处为MantraModule.h和MantraModule.cpp)用来处理模块的加载(StartupModule)和卸载(ShutdownModule),主要是借助一个接口IModuleInterface。
下面是我们完整的.h文件,将之保存在我们之前创建的Public文件夹中。
#pragma once
接下来创建对应的.cpp文件,并保存到Private文件夹中
#include "MantraModule.h"
DEFINE_LOG_CATEGORY(MantraModule);
#define LOCTEXT_NAMESPACE "FMantraModule"
void FMantraModule::StartupModule()
{
UE_LOG(MantraModule, Warning, TEXT("Mantra module has started!"));
}
void FMantraModule::ShutdownModule()
{
UE_LOG(MantraModule, Warning, TEXT("Mantra module has shut down"));
}
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FMantraModule, MantraModule)
此处我们实现了.h文件中声明的两个方法,并且自定义了一个Log Category,并在加载和下载模块时打印一条输出语句,主要用于测试,你也可以在这两个方法中自定义加载和卸载模块需要执行的操作。
做完上面这些操作之后,找到.uproject文件,右键执行Generate Visual Studio Project Files。之后可以正常的打开工程。工程加载完毕可以在Output Log(Window>Developer Tools>Output Log)中找到我们在StartupModule中的打印输出。
对于ShutdownModule中的输出,我们只能关闭工程(模块默认是关闭工程之后才卸载)才能查看。找到ProjectName/Saved/Logs中最后一个Log文件,可以查看输出。同时还可以看到其他模块的卸载,如EmptyModule、RuntimePhysicsXCooking和OculusEditor等等。
整体上的层级结构如下图所示
所有的一切貌似很OK,但是很不幸,如果你使用的是新版本,如4.19。想死的心都有啦。各种编译失败,各种打不开。如果是这样,那么请继续往下看。
二、UE4新版本中需要做的操作
对于UE4新版本,我们还需要进一步操作,否则编译失败。
找到ProjectName.Target.cs和ProjectNameEditor.Target.cs(此处我们的名称分别为EmptyModule.Target.cs和EmptyModuleEditor.Target.cs),这两个文件主要控制我们需要加载的模块,在其中的ExtraModuleName中添加我们自定义的模块,具体操作见下面的代码
EmptyModule.Target.cs
using UnrealBuildTool;
using System.Collections.Generic;
public class EmptyModuleTarget : TargetRules
{
public EmptyModuleTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Game;
ExtraModuleNames.AddRange( new string[] { "EmptyModule", "MantraModule" } );
}
}
EmptyModuleEditor.Target.cs
using UnrealBuildTool;
using System.Collections.Generic;
public class EmptyModuleEditorTarget : TargetRules
{
public EmptyModuleEditorTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Editor;
ExtraModuleNames.AddRange( new string[] { "EmptyModule", "MantraModule" } );
}
}
修改完这些之后,在重新生成工程文件,然后就应该看到我们执行的结果啦。
这是我们手动创建一个自定义模块需要的步骤,后面我们会为大家讲解如何使用Plugin Manager自动创建这些文件。
后续文章更新移步→微信公众号“虚幻社区”(mantra-xhsq),您的支持是我创作的动力。
欢迎大家加群讨论:源尚草学院虚幻社区 524418526(一群已满)790066685(请加二群)。