본문 바로가기
Unreal/Manual

Unreal Editor Module 만들기

by Dev_카페인 2024. 3. 10.
반응형

[Unreal/C++] Editor Module 만들기

 

에디터 모듈(Editor modules) 은 에디터 빌드에 대해서만 코드가 컴파일되는 언리얼 엔진 (UE) C++ 모듈입니다. 이를 통해 런타임(출시) 빌드 크기를 늘리지 않고 커스텀 에디터 기능을 지원하는 클래스를 쉽게 생성할 수 있습니다.

 

에디터 모듈이란 무엇인가요? 편집기 모듈을 사용하면 사용자 정의 C++ 액터, 구성 요소 및 기타 클래스에 대한 편집기 기능을 확장할 수 있습니다. 등 다양한 일을 할 수 있습니다.

 

편집기 모듈을 사용하면 사용자 정의 C++ 액터, 구성 요소 및 기타 클래스에 대한 편집기 기능을 확장할 수 있습니다.

UPROPERTY에 대한 세부 정보 패널 사용자 정의, 새 편집기 모드 추가, 구성 요소 시각화 도우미 사용 및 기타 흥미로운 작업과 같은 다양한 작업을 수행할 수 있습니다. 이 튜토리얼에서는 그 방법을 논의하지는 않지만, 사용자 정의 코드를 넣을 모듈을 실제로 만드는 공백을 메우는 것을 목표로 합니다.

 

플러그인을 사용해야 하는지 아니면 편집기 모듈을 사용해야 하는지는 무엇을 하려는지에 달려 있습니다. 여러 프로젝트에서 사용할 수 있는 방식으로 편집기를 확장하려면 아마도 플러그인이 필요할 것입니다. 게임 및 클래스 유형에 특정한 사용자 정의만 만들고 싶다면 편집기 모듈이 더 나은 디자인 선택입니다.

 

플러그인에는 여러 모듈이 포함될 수도 있습니다. 플러그인에 런타임 모듈을 제공하고 사용 편의성을 위해 편집기 플러그인과 함께 제공하는 것이 전적으로 가능합니다.

편집기 모듈은 게임 코드에서 비공개로 유지될 수 있습니다. 즉, 상호 종속성이 없습니다. 이렇게 하면 연결 오류가 발생할 가능성이 크게 줄어들고 편집기 코드가 패키지된 애플리케이션에 포함되지 않음을 의미합니다. 제거해도 게임은 여전히 ​​잘 작동하고 편집기는 확장 기능을 잃게 됩니다.

 

 

만들기

먼저 작업 중인 프로젝트 파일에서 .uproject 파일을 편집해야 합니다.

열려있는 에디터를 모두 닫고 수정합니다.

 

 

메모장으로 열어보면 왼쪽과 같이 기본 셋팅이 되어있습니다.

편집기용 모듈을 만들기 위해서는 오른쪽과 같이 모듈을 추가해줘야 합니다.

 

 

이름을 정하고 모듈의 타입과 로딩 단계를 결정합니다.

모듈의 타입과 로딩 단계에 대한 문서는 하단 링크를 참조하시길 바랍니다.

대부분 로딩 단계는 기본 런타임 모듈과 함께 Default로 사용됩니다.

필자의 경우는 엔진과 함께 초기화될 필요가 없기 때문에 PostEngineInit으로 설정했습니다.

{
"Name": "MyProjectEditor",
"Type": "Editor",
"LoadingPhase": "Default"
}

변경 후 저장을 한 후 닫아줍니다.

 

이후 솔루션 파일을 열고 폴더와 스크립트를 생성해줍니다.

수정하거나 생성해야 하는 파일은 다음과 같습니다.

 

MyProject는 작성하는 사람의 프로젝트 이름입니다.
MultiPlayer는 제 프로젝트의 이름입니다.
MyProject는 MultiPlayer와 동일하게 사용됩니다.
편의를 위해 MyProject와 MultiPlayer 를 무분별하게 사용합니다.
이 글을 보고 혼동하지 않기를 바랍니다. 
Source 폴더에 생성
1. MyProjectEditor.Target.cs

Source/MyProjectEditor 폴더에 생성
1. MyProjectEditor.h
2. MyProjectEditor.cpp
3. MyProjectEditor.Build.cs

수정
1. MyProject.Target.cs

이에 대한 파일은 기존에 생성되어 있는 파일들을 복사한 후 수정하는 것이 좋습니다.

 

 

// MyProject.Target.cs

using UnrealBuildTool;
using System.Collections.Generic;

public class MultiPlayerTarget : TargetRules
{
	public MultiPlayerTarget(TargetInfo Target) : base(Target)
	{
		Type = TargetType.Game;
		DefaultBuildSettings = BuildSettingsVersion.V4;
		IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_3;
		ExtraModuleNames.Add("MultiPlayer");

		// Add
        if (bBuildEditor)   // 편집기 빌드에만 포함
        {
            ExtraModuleNames.Add("MultiPlayerEditor");
        }
        // End
    }
}

 

 

// MyProjectEditor.Target.cs
// 복사해서 생성하는 경우 오탈자에 주의합니다.

using UnrealBuildTool;
using System.Collections.Generic;

public class MultiPlayerEditorTarget : TargetRules	// 수정
{
	public MultiPlayerEditorTarget(TargetInfo Target) : base(Target)	// 수정
	{
		Type = TargetType.Editor;	// 수정
		DefaultBuildSettings = BuildSettingsVersion.V4;
		IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_3;
        ExtraModuleNames.AddRange(new string[] // 수정
		{ 
			"MultiPlayerEditor" 
		});
	}
}

 

 

 시작 및 종료 기능의 기본 구현을 만들고, 로그 호출을 추가하면 시작 시 모듈이 올바르게 로드되는지 확인할 수 있습니다. 편집기 사용자 정의를 수행할 때 이를 로드하고 언로드하는 곳입니다. 이에 대한 정확한 방법은 사용자 정의 유형에 따라 다르지만 일반적으로 모듈 관리자를 통해 해당 모듈에 액세스하고 등록 기능을 호출하는 작업이 포함됩니다.

virtual void StartupModule() override;
virtual void ShutdownModule() override;
// MyProjectEditor.h

#pragma once

#include "Engine.h"
#include "Modules/ModuleInterface.h"


class FMultiPlayerEditorModule : public IModuleInterface
{
public:
	// ~Begin IModuleInterface 
	virtual void StartupModule() override;
	virtual void ShutdownModule() override;
    // ~End IModuleInterface 
};

 

파일 상단에서 IMPLEMENT_GAME_MODULE 매크로를 사용하세요.

첫 번째 인수는 헤더 파일에서 생성한 모듈 클래스의 이름이고, 두 번째 인수는 uproject 파일에서 선언한 모듈의 이름입니다.

// MyProjectEditor.cpp

#include "MultiPlayerEditor.h"

#include "Engine.h"
#include "UnrealEd.h"

DEFINE_LOG_CATEGORY_STATIC(MultiPlayerEditor, All, All)

IMPLEMENT_GAME_MODULE(FMultiPlayerEditorModule, MultiPlayerEditor);


void FMultiPlayerEditorModule::StartupModule()
{
	UE_LOG(MultiPlayerEditor, Warning, TEXT("MyGameEditor: Log Started"));
}

void FMultiPlayerEditorModule::ShutdownModule()
{
	UE_LOG(MultiPlayerEditor, Warning, TEXT("MyGameEditor: Log Started"));
}

 

// MultiPlayerEditor.Build.cs

using UnrealBuildTool;

public class MultiPlayerEditor : ModuleRules
{
	public MultiPlayerEditor(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

		PublicDependencyModuleNames.AddRange(new string[]
        {
            "Core",
            "CoreUObject",
            "Engine",
            "UnrealEd",
        });

        PrivateIncludePaths.AddRange(new string[]
		{
            "MultiPlayerEditor"
        });
	}
}

 

 

마지막으로 .uproject 파일을 마우스 오른쪽 버튼으로 클릭 하고 프로젝트 파일 생성을 선택합니다. 

그러면 새 모듈을 포함한 프로젝트 파일이 다시 생성됩니다.

에디터가 정상적으로 열린 후 출력 로그를 확인할 수 있습니다.

 

 

 

 

 

아래와 같은 메시지가 나타난다면 .uproject 파일에 문제가 없는지 확인합니다.

Couldn't set association for project Check the file is writeable
프로젝트에대한 연결을 설정할 수 없습니다. 파일이 쓰기 가능한지 확인하세요.

 

 

 

 

 

에디터 모듈

커스텀 에디터 툴을 추가하기 위한 C++ 모듈을 구성합니다.

docs.unrealengine.com

 

 

IModuleInterface

Interface class that all module implementations should derive from.

docs.unrealengine.com

 

 

ELoadingPhase::Type

Phase at which this module should be loaded during startup.

docs.unrealengine.com

 

 

EHostType::Type

Environment that can load a module.

docs.unrealengine.com

 

Creating an Editor Module | Unreal Engine Community Wiki

What is an editor module? An editor module allows you to extend the functionality of the editor for your own custom C++ Actors, Components and other classes. You can do a variety of things such as ...

unrealcommunity.wiki

 

반응형