UE4 모듈 추가 절차에 대한 메모 쓰기

15809 단어 위 4UnrealEngine4C#

개요



UnrealEngine 모듈 추가에 대한 메모 쓰기입니다.
편집기 모듈의 추가 단계를 기록하고 있습니다.

업데이트 내역




날짜
내용


2020/09/14
플러그인에 대해 추가.

2020/10/13
모듈의 외부 참조에 대한 비고 추가.


환경



Windows10
Visual Studio 2017
UnrealEngine 4.22

참고



다음을 참고로 해 주셔서 감사합니다.

모듈 정보
【UE4】 모듈 추가
htps : // 코 m / 카누라 포이 소 / ms / 에 4b551 아 1f22b85162c70
htps : // 이 m / go _ st r / ms / 5d001 a 9c에서 182488f9f3

모듈 추가 절차



파일 추가 및 설정 파일 재작성이 필요합니다.

모듈 소스 작성



모듈명을 정해 폴더를 작성해, 그것을 프로젝트의 [Source] 폴더 이하에 배치한다. 폴더에는 [***.Build.cs][.h][.cpp]의 파일을 둔다.

이하 [TestModuleEd]라는 모듈을 작성하는 경우는 다음과 같이 됩니다.



TestModuleEd.Build.cs
namespace UnrealBuildTool.Rules 
{ 
    public class TestModuleEd : ModuleRules 
    { 
        public TestModuleEd(ReadOnlyTargetRules Target) : base(Target) 
        { 
            PublicIncludePaths.AddRange( 
                new string[] { 
                    "TestModuleEd", 
                    // ... add public include paths required here ... 
                } 
                ); 
            PrivateIncludePaths.AddRange( 
                new string[] { 
                    "TestModuleEd", 
                    // ... add other private include paths required here ... 
                } 
                ); 
            PublicDependencyModuleNames.AddRange( 
                new string[] 
                { 
                    "Core", 
                    "CoreUObject", 
                    "Engine", 
                    // ... add other public dependencies that you statically link with here ... 
                } 
                ); 
            PrivateDependencyModuleNames.AddRange( 
                new string[] 
                { 
                    // ... add private dependencies that you statically link with here ... 
                } 
                ); 
            DynamicallyLoadedModuleNames.AddRange( 
                new string[] 
                { 
                    // ... add any modules that your module loads dynamically here ... 
                } 
                ); 
        } 
    } 
} 


TestModule.h
#pragma once 
#include "CoreMinimal.h" 
#include "Modules/ModuleInterface.h" 
#include "Modules/ModuleManager.h" 
/** 
 * The public interface to this module 
 */ 
class ITestModuleEd : public IModuleInterface 
{ 
public: 
    /** 
     * Singleton-like access to this module's interface.  This is just for convenience 
     * Beware of calling this during the shutdown phase, though.  Your module might have been unloaded already. 
     * 
     * @return Returns singleton instance, loading the module on demand if needed 
     */ 
    static inline ITestModuleEd& Get() 
    { 
        return FModuleManager::LoadModuleChecked< ITestModuleEd >( "TestModuleEd" ); 
    } 
    /** 
     * Checks to see if this module is loaded and ready.  It is only valid to call Get() if IsAvailable() returns true. 
     * 
     * @return True if the module is loaded and ready to use 
     */ 
    static inline bool IsAvailable() 
    { 
        return FModuleManager::Get().IsModuleLoaded( "TestModuleEd" ); 
    } 
}; 


TestModule.cpp
#include "TestModuleEd/TestModuleEd.h" 
class FTestModuleEd : public ITestModuleEd 
{ 
    /** IModuleInterface implementation */ 
    virtual void StartupModule() override; 
    virtual void ShutdownModule() override; 
}; 
IMPLEMENT_MODULE( FTestModuleEd, TestModuleEd ) 
void FTestModuleEd::StartupModule() 
{ 
    // This code will execute after your module is loaded into memory (but after global variables are initialized, of course.) 
} 
void FTestModuleEd::ShutdownModule() 
{ 
    // This function may be called during shutdown to clean up your module.  For modules that support dynamic reloading, 
    // we call this function before unloading the module. 
} 


파일 내용 수정



추가한 모듈의 정보를 반영하기 위해 설정 파일에 추가합니다.
수정하는 파일은 에디터용 모듈을 상정해, [MyProject.uproject][MyProject.Build.cs][MyProjectEditor.Target.cs]의 3 파일입니다.

Modules에 추가합니다.

MyProject.uproject
{
    "FileVersion": 3,
    "EngineAssociation": "4.22",
    "Category": "",
    "Description": "",
    "Modules": [
        {
            "Name": "MyProject",
            "Type": "Runtime",
            "LoadingPhase": "Default",
            "AdditionalDependencies": [
                "Engine"
            ]
        }
## ここから追加↓、(カンマに注意)
        ,{
            "Name": "TestModuleEd",
            "Type": "Editor",
            "LoadingPhase": "PostEngineInit"
        }
## ここまで↑
    ],
    "Plugins": [
        {
            "Name": "EditorTests",
            "Enabled": true
        },
    ]
}


PublicDependencyModuleNames에 추가합니다.

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" });
        PublicDependencyModuleNames.AddRange(new string[] { "TestModuleEd"});   // ←ここを追加

        PrivateDependencyModuleNames.AddRange(
            new string[]
            {
                "Slate",
                "SlateCore",
            }
        );
    }
}


ExtraModuleName에 추가합니다.

MyProjectEditor.Target.cs

using UnrealBuildTool;
using System.Collections.Generic;

public class MyProjectEditorTarget : TargetRules
{
    public MyProjectEditorTarget(TargetInfo Target) : base(Target)
    {
        Type = TargetType.Editor;

        ExtraModuleNames.AddRange( new string[] { "MyProject" } );
        ExtraModuleNames.AddRange( new string[] { "TestModuleEd" } );    // ←ここを追加
    }
}



모듈 파일을 솔루션에 추가



MyProject.uproject의 오른쪽 클릭 메뉴에서 Generate VisualStudio project files를 실행하여 솔루션을 검토하고 빌드합니다.



오류가 발생하면 설정을 확인하십시오.

UE 편집기에서
창 -> 개발자 도구 -> 모듈에 추가한 모듈이 표시됩니다.



비고



플러그인 지원



모듈 추가를 지원하는 플러그인도있는 것 같습니다.
New C++ Module tool

설치하고 플러그인을 활성화합니다.


메뉴에 추가됩니다.


외부 공개 정보



외부 모듈에의 참조는 .Build.cs 파일의 PublicDependencyModuleNames 에 추기하는 것으로 가능합니다만, 외부 공개를 위해서는 그 클래스나 스트럭트에 MYPROJECT_API (MyProject는 모듈명)라고 하는 매크로를 붙일 필요가 있습니다 있습니다.
이것이 없는 경우 헤더에만 쓰여진 getter 와 같은 메소드는 액세스 할 수 있습니다만, 그 이외는 참조 에러가 됩니다.

요약



기능별로 모듈 분할을 하도록(듯이) 추천되고 있는 것 같습니다만, 의존관계는 설계 단계에서 고려하지 않으면 힘들게 됩니다.
EditorUtilityWidget 등 에디터 전용의 기능을 C++로부터 사용하는 경우는 에디터 전용 모듈을 작성은 필수가 됩니다.

좋은 웹페이지 즐겨찾기