UE C++项目如何新增模块Module?如可在新增模块Module使用UMG?
在 Unreal Engine 的 C++ 项目中新增模块(Module)并在该模块中使用 UMG 需要以下几个步骤:
- 创建模块目录结构
- 修改项目的
.uproject
文件 - 配置模块的
Build.cs
文件 - 创建模块的源文件: .h文件 .cpp文件
- 修改主项目的
Build.cs
文件以包含新模块
1. 创建模块目录结构
假设你的项目名为 MyProject
,首先在 MyProject/Source/
目录下创建新模块的目录结构:
MyProject/
├── Source/
│ ├── MyProject/
│ │ ├── MyProject.Build.cs
│ │ └── ...
│ ├── MyProjectEditor/
│ │ ├── MyProjectEditor.Target.cs
│ │ └── ...
│ ├── MyNewModule/
│ │ ├── MyNewModule.Build.cs
│ │ ├── Public/
│ │ │ └── MyNewModule.h
│ │ └── Private/
│ │ ├── MyNewModule.cpp
2. 修改项目的 .uproject
文件
在你的项目根目录下找到 .uproject
文件(如 MyProject.uproject
),添加新模块的描述:
{
"Modules": [
{
"Name": "MyProject",
"Type": "Runtime",
"LoadingPhase": "Default"
},
{
"Name": "MyNewModule",
"Type": "Runtime",
"LoadingPhase": "Default"
}
]
}
3. 配置模块的 Build.cs
文件
在 MyProject/Source/MyNewModule/
目录下创建 MyNewModule.Build.cs
文件,内容如下:
using UnrealBuildTool;
public class MyNewModule : ModuleRules
{
public MyNewModule(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] {
"Core",
"CoreUObject",
"Engine",
"InputCore",
"UMG" // 添加 UMG 依赖
});
PrivateDependencyModuleNames.AddRange(new string[] { });
// 如果需要 Slate UI:
PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// 如果需要在线功能:
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// 如果需要添加第三方库:
// AddThirdPartyPrivateStaticDependencies(Target, "XYZ");
}
}
4. 创建模块的源文件
在 MyProject/Source/MyNewModule/Private/
目录下创建 MyNewModule.cpp
文件
在 MyProject/Source/MyNewModule/Public
/
目录下创建 MyNewModule.h
文件。
MyNewModule.h 示例内容:
#pragma once
#include "CoreMinimal.h"
#include "Modules/ModuleInterface.h"
/// 自定义日记类别参考资料:https://blog.csdn.net/liulong1567/article/details/52449000
/// 声明Log类别: 为了使用自定义日记类别log
/// 打Log很方便,可以使用宏:UE_LOG(TableResInclude,Log,TElXT("UMGExtension::StartupModule"))
/// 但是使用之前需要先定义Log Category,Category会在Log中体现出来,以便在茫茫Log中更容易区分其作用或所属模块。
// ------------------------------------------------------
/// 如果想定义一个‘Public’的Category,并且在全局生效,不管是 static 函数还是其他类都可以使用,就需要在头文件中声明一个Category,并在CPP中定义,每个用到的CPP文件都需要include该头文件:DECLARE_LOG_CATEGORY_EXTERN
/// 1.声明一个 Category 为 extern,避免多个文件使用此头文件时重复声明
DECLARE_LOG_CATEGORY_EXTERN(Log_MyNewModule, All, All)
/// 2.在.cpp中定义该 Category,全局仅需一份
//DEFINE_LOG_CATEGORY(Log_UMGExtensionl)
// ------------------------------------------------------
/// <summary>
/// 声明 FMyNewModule 类继承 IModuleInterface
/// </summary>
class FMyNewModule : public IModuleInterface
{
public:
virtual void StartupModule() override;
virtual void ShutdownModule() override;
};
MyNewModule.cpp 示例内容:
#include "MyNewModule.h"
/// 定义日记类别 Log_UMGExtensionl ,此日记类别已经在 UMGExtension.h 头文件中声明了:DECLARE_LOG_CATEGORY_EXTERN(CategoryName, All, All)
DEFINE_LOG_CATEGORY(Log_MyNewModule)
void FMyNewModule ::StartupModule() {
/// 使用自定的日记类别 Log_MyNewModule 输出日记
UE_LOG(Log_MyNewModule, Log, TEXT(__FUNCTION__",初始化模块"))
}
void FMyNewModule ::ShutdownModule() {
/// 使用自定的日记类别 Log_MyNewModule输出日记
UE_LOG(Log_MyNewModule, Log, TEXT(__FUNCTION__",清理模块"))
}
/// 在UE游戏中,至少要使用 IMPLEMENT_PRIMARY_GAME_MODULE 注册一个主模块。
/// 其他模块可以使用另一个可选的 IMPLEMENT_GAME_MODULE 方法进行注册。
/// 在这里新增的模块并不是做为主模块使用,因此使用 IMPLEMENT_GAME_MODULE 注册。
/// IMPLEMENT_GAME_MODULE 里面也是调用的 IMPLEMENT_MODULE
/// 注册你想要的的模块类对应的名称 必须
IMPLEMENT_MODULE(FMyNewModule , MyNewModule );
5. 修改主项目的 Build.cs
文件以包含新模块
在 MyProject/Source/MyProject/MyProject.Build.cs
文件中,添加新模块的依赖:
using UnrealBuildTool;
public class MyProject : ModuleRules
{
public MyProject(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] {
"Core",
"CoreUObject",
"Engine",
"InputCore",
"MyNewModule" // 添加新模块依赖
});
PrivateDependencyModuleNames.AddRange(new string[] { });
}
}
6. 使用新模块和 UMG
你现在可以在 MyNewModule
中使用 UMG。创建一个简单的 UMG Widget 示例。
ExampleWidget.h:
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "ExampleWidget.generated.h"
UCLASS()
class MYNEWMODULE_API UExampleWidget : public UUserWidget
{
GENERATED_BODY()
public:
UPROPERTY(meta = (BindWidget))
class UTextBlock* MyTextBlock;
};
ExampleWidget.cpp:
#include "ExampleWidget.h"
#include "Components/TextBlock.h"
// 在此处初始化你的 Widget 元素
结论
通过以上步骤,你已经成功在 Unreal Engine 的 C++ 项目中新增了一个模块,并配置使用 UMG。你可以在这个新模块中创建和管理你的 UI 元素。记得在编辑器中刷新项目和重新生成解决方案,以确保新模块被正确识别。