📜  ue4 模块化字符 - C++ (1)

📅  最后修改于: 2023-12-03 15:20:47.618000             🧑  作者: Mango

UE4 模块化字符 - C++

在UE4中,模块化代码是一种组织代码的方式,它允许将代码分成多个模块以便更好地管理和维护代码。本文将介绍如何使用模块化字符来构建模块化代码。

什么是模块化字符?

模块化字符是UE4中特有的一种命名约定,用于指定模块名称、类名称和函数名称。模块名称用于指定模块所属的命名空间,而类名称和函数名称则用于指定类或函数所属的模块。

模块名称遵循以下约定:

  • 所有模块名称均为大写,使用下划线作为单词分隔符。例如:MY_MODULE
  • 模块名称通常与模块所在的目录名称相同,但不一定相同。

类名称和函数名称遵循以下约定:

  • 类名称和函数名称均以大写字母开头,使用驼峰式命名法。例如:MyClass
  • 模块的名称应该位于类名称和函数名称之前,使用下划线分隔。例如:MY_MODULE_API void MyFunction()
如何创建模块化代码?

创建模块化代码需要遵循以下步骤:

  1. 创建一个新的UE4项目,并在项目目录下创建一个名为Source的目录。 (如果已经有了,则可以跳过此步骤。)
  2. Source目录下创建一个名为MY_MODULE的目录,该目录是我们将创建的新模块的名称。
  3. MY_MODULE目录下创建一个名为MY_MODULE.Build.cs的文件,该文件用于定义模块的构建规则。
  4. MY_MODULE目录下创建一个名为Public的目录和一个名为Private的目录,其中Public目录用于存放模块的公共头文件,而Private目录用于存放模块的私有头文件和源文件。
  5. PublicPrivate目录下创建你想要的头文件和源文件。
如何为模块添加代码?

要将代码添加到模块中,请使用模块化字符来命名类和函数。例如,假设要向模块中添加一个称为MyClass的类和一个称为MyFunction的函数,则应按以下方式使用模块化字符来命名它们:

// MyClass.h

#pragma once

#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"

namespace MY_MODULE
{
    class MY_MODULE_API MyClass
    {
    public:
        MyClass();
        ~MyClass();

        void DoSomething();
    };
}
// MyClass.cpp

#include "MyClass.h"

namespace MY_MODULE
{
    MyClass::MyClass()
    {
        // 构造函数
    }

    MyClass::~MyClass()
    {
        // 析构函数
    }

    void MyClass::DoSomething()
    {
        // 做些事情
    }
}
// MyModule.h

#pragma once

#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"

DECLARE_LOG_CATEGORY_EXTERN(LogMyModule, Log, All);

class FMyModule : public IModuleInterface
{
public:
    virtual void StartupModule() override;
    virtual void ShutdownModule() override;
};
// MyModule.cpp

#include "MyModule.h"
#include "MyClass.h"

#define LOCTEXT_NAMESPACE "FMyModule"

DEFINE_LOG_CATEGORY(LogMyModule);

void FMyModule::StartupModule()
{
    // 在模块启动时执行的代码
    GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, LOCTEXT("HELLO_WORLD", "Hello World!").ToString());

    MyClass* NewMyClass = new MyClass();
    NewMyClass->DoSomething();
}

void FMyModule::ShutdownModule()
{
    // 在模块卸载时执行的代码
}

#undef LOCTEXT_NAMESPACE

IMPLEMENT_MODULE(FMyModule, MyModule);

在上述示例中,MyClassMyFunction两个类的名称和函数名称均使用了模块化字符。此外,我们还创建了一个名为FMyModule的类来实现我们的模块。该类需要继承自IModuleInterface接口,并实现其StartupModuleShutdownModule方法。最后,我们使用IMPLEMENT_MODULE宏来声明该模块。

如何使用模块?

要在UE4项目中使用模块,需要在项目的.uproject文件中添加模块的引用。例如,如果要将之前创建的MY_MODULE添加到项目中,则需要在.uproject文件中添加以下行:

{
  "FileVersion": 3,
  "EngineAssociation": "4.26",
  "Category": "",
  "Description": "",
  "Modules": [
    {
      "Name": "MyProject",
      "Type": "Runtime",
      "LoadingPhase": "Default",
      "AdditionalDependencies": [
        "Engine",
        "Core",
        "MY_MODULE"
      ]
    }
  ],
  "TargetPlatforms": [
    "MacNoEditor",
    "WindowsNoEditor",
    "LinuxNoEditor"
  ],
  "bHasExplicitTimeOfDay": false
}

请注意,AdditionalDependencies数组包含当前项目中使用的所有模块,而其中包括我们之前创建的MY_MODULE模块。

要在代码中使用模块中的类或函数,我们需要包含模块的头文件,并使用模块化字符来引用类或函数。使用模块化字符示例如下:

#include "MY_MODULE/Public/MyClass.h"

namespace MY_MODULE
{
    void SomeFunction()
    {
        MyClass MyObject;
        MyObject.DoSomething();
    }
}
总结

通过本文的介绍,我们了解了UE4中模块化字符的概念,可以使用模块化字符来创建模块化代码,在模块中添加类和函数,并在项目中使用模块中的类或函数。模块化字符是UE4中非常重要的概念,希望本文能对您有所帮助。