UE C++项目如何新增模块Module

2 篇文章 0 订阅

UE C++项目如何新增模块Module?如可在新增模块Module使用UMG?

在 Unreal Engine 的 C++ 项目中新增模块(Module)并在该模块中使用 UMG 需要以下几个步骤:

  1. 创建模块目录结构
  2. 修改项目的 .uproject 文件
  3. 配置模块的 Build.cs 文件
  4. 创建模块的源文件: .h文件 .cpp文件
  5. 修改主项目的 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 元素。记得在编辑器中刷新项目和重新生成解决方案,以确保新模块被正确识别。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值