Unreal Engine 모듈 구조

언리얼 엔진에 대한 모듈 설명은 홈페이지에도 설명해주고 있다.

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-engine-modules

에디터 툴을 기능을 추가한다던지, 런타임 기능, 라이브러리도 개발하여 언리얼 엔진 모듈로 활용할 수 있다.

  • 캡슐화: 함수 내부 코드를 숨기고, 호출 쪽에서 코드를 모르지만 이용에 불편함 없이 이용할 수 있도록 기능을 제공할 수 있다.
  • 유지보수 상승: 코드가 분할로 이루어져 있어서 개발자 분업도 가능하고 코드 추가 및 변경에 불필요한 코드를 숨길 수 있어서 유지보수성이 좋아진다.
  • 재사용성: 여러 프로젝트를 진행하여도 똑같은 코드를 작성할 필요 없이 모듈을 불려와 바로 사용할 수 있다.

언리얼 엔진 Sample 구조 보기

모듈을 알아보기 전에 게임 프레임워크를 어떻게 구성되어있는지 확인해보도록 한다.

  • 언리얼 엔진에서 제공하는 Thrid Persion 샘플 코드를 살펴볼 생각이다.
  • CPP 프로젝트로 선택하고 ThirdUserMap 이름으로 생성하였다.
  • 다운로드가 완료하면 다음과 같이 VS 2022 화면과 같이 ThirdUserMap 솔루션이 열린다.
  • Source 아래의 ThirdUserMap.unproject 으로 열면 각종 모듈과 플러그인을 확인할 수 있다.

Source 보기

디렉토리를 Tree 구조로 확인해보도록 한다.

/.
│  .vsconfig
│  ThirdUserMap.sln
│  ThirdUserMap.uproject
│  ...
│  ...
└─Source
    │  ThirdUserMap.Target.cs
    │  ThirdUserMapEditor.Target.cs
    │
    └─ThirdUserMap
            ThirdUserMap.Build.cs
            ThirdUserMap.cpp
            ThirdUserMap.h
            ThirdUserMapCharacter.cpp
            ThirdUserMapCharacter.h
            ThirdUserMapGameMode.cpp
            ThirdUserMapGameMode.h
  • .vsconfigThirdUserMap.sln 그외 소스들은 VS 2022 열 수 있도록 언리얼엔진이 생성해주었다.

Source 아래의 ThirdUserMap 디렉토리를 중점적으로 확인할 것이다.
코드는 앞에서 링크대로 설명한 *.build.cs, *.cpp, *.h 모듈과 관련된 파일들이 있다.

ThirdUserMap.h

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
  • 게임 플레이, UI, 캐릭터 등등 최소한으로 구성된 헤더파일이다.
  • Ctrl 누른 상태로 CoreMinimal.h 클릭하면 구동에 관련된 세부 내용을 확인할 수 있다.

ThirdUserMap.cpp

// Copyright Epic Games, Inc. All Rights Reserved.

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

IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, ThirdUserMap, "ThirdUserMap" );
 
  • IMPLEMENT_PRIMARY_GAME_MODULE 해당 클래스는 컴파일 진행 중에 모듈을 가장 먼저 찾는 것으로 확인할 수 있다.
  • 모듈 중 "ThirdUserMap" 클래스를 찾고 있다. 디렉토리 안에 있는 ThirdUserMap.Build.cs 파일을 확인 해보도록 한다.

ThirdUserMap.Build.cs

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

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

		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput" });
	}
}
  • 모듈 구동에 필요한 엔진을 의존성 체크하고 있다.

ThirdUserMap.uproject

소스코드 루트디렉토리에 위치하고 있다.

{
	"FileVersion": 3,
	"EngineAssociation": "5.4",
	"Category": "",
	"Description": "",
	"Modules": [
		{
			"Name": "ThirdUserMap",
			"Type": "Runtime",
			"LoadingPhase": "Default"
		}
	],
	"Plugins": [
		{
			"Name": "ModelingToolsEditorMode",
			"Enabled": true,
			"TargetAllowList": [
				"Editor"
			]
		}
	]
}
  • 이 파일은 모듈 과 플러그인이 어떻게 구성되어있는지, 모듈을 사용할 것인지 확인할 수 있다.

소스코드에는 하나의 모듈뿐 아니라 여러개 넣을 수 있다. 확인한 코드를 복사해서 모듈을 추가하는 것을 학습해보도록 한다.


ThirdUserMap 신규 모듈 작성하기

먼저 Source 아래의 신규 디렉토리를 생성해주도록 한다.
이름은 FirstModule로 디렉토리를 생성하였다.

그리고 FirstModule 파일에는 앞서 보았던 .h .cpp .Build.cs 코드들을 작성하여 넣어주도록 한다.

FirstModule.h

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
  • 파일명 말고는 수정할 부분이 없다.

FirstModule.cpp

// Copyright Epic Games, Inc. All Rights Reserved.

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

class FFirstModuleImpl : public FDefaultGameModuleImpl
{
    virtual void StartupModule() override
    {
        double x = 100.1;
        double y = 0.2;
    }
};

IMPLEMENT_MODULE( FFirstModuleImpl, FirstModule );
 
  • IMPLEMENT_PRIMARY_GAME_MODULE 는 이미 사용 중으로 사용할 수 없다.
    신규 모듈을 IMPLEMENT_MODULE 클래스로 사용하도록 한다.
  • IMPLEMENT_MODULE 클래스 인수 값으로 FDefaultGameModuleImpl 대신 상속을 받아 FFirstModuleImpl 신규 클래스가 수행되면 작동되는 코드로 작성하였다.

FirstModule.Build.cs

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

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

		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput" });
	}
}
  • 이전 ThirdUserMap.Build.cs 복사 붙여넣기 후 클래스명만 변경하였다
  • 생성 후 FirstModule 디렉토리 모습
  • 추가한 파일과 폴더는 Visual Studio 솔루션 탐색기에 출력되지 않는데.
    다음 장에서 알아보도록 한다.

Visual Studio 솔루션 리로드하기

  • 신규 생성한 FirstModule 을 VS 솔루션에 포함하려면 *.uproject 파일을 Generate Visual Studio project files 클릭하여 다시 생성해주어야 한다.
  • VS 2022 열면 변경된 환경으로 인해 리로드가 필요하다고 표시된다.
  • Reload All 를 선택하여 로드하도록 한다.
  • 추가한 FirstModule 디렉토리가 VS 솔루션에 출력된다.

추가한 모듈 사용하기

추가한 모듈을 사용하겠다고 명시해주어야 한다. 아래 파일을 설정하도록 한다.

  • ThirdUserMap.uproject
  • ThirdUserMapEditor.Target.cs 또는 ThirdUserMap.Target.cs

ThirdUserMap.uproject

{
	...,
	"Description": "",
	"Modules": [
		{
			"Name": "ThirdUserMap",
			"Type": "Runtime",
			"LoadingPhase": "Default"
		},
        {
			"Name": "FirstModule",
			"Type": "Runtime",
			"LoadingPhase": "Default"
		}
	],
	...
}
  • Modules 리스트 첫 번째 ThirdUserMap 아래에 FirstModule를 등록하였다.

(선택사항) ThirdUserMapEditor.Target.cs

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;
using System.Collections.Generic;

public class ThirdUserMapEditorTarget : TargetRules
{
	public ThirdUserMapEditorTarget(TargetInfo Target) : base(Target)
	{
		Type = TargetType.Editor;
		DefaultBuildSettings = BuildSettingsVersion.V5;
		IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_4;
		ExtraModuleNames.Add("ThirdUserMap");
        ExtraModuleNames.Add("FirstModule");
    }
}
  • ExtraModuleNames 클래스에 앞서 만든 FirstModule 모듈을 등록하면 로딩 중에 실행한다.

파일이 변경된 디렉토리 Tree로 보기

/.
│  .vsconfig
│  ThirdUserMap.sln
│  ThirdUserMap.uproject (+)
│  ...
│  ...
└─Source
    │  ThirdUserMap.Target.cs
    │  ThirdUserMapEditor.Target.cs (+)
    │
    ├─FirstModule (+)
    │    FirstModule.Build.cs (+)
    │    FirstModule.cpp (+)
    │    FirstModule.h (+)
    │
    └─ThirdUserMap
            ThirdUserMap.Build.cs
            ThirdUserMap.cpp
            ThirdUserMap.h
            ThirdUserMapCharacter.cpp
            ThirdUserMapCharacter.h
            ThirdUserMapGameMode.cpp
            ThirdUserMapGameMode.h

파일 변동사항은 (+) 으로 표시하였다.

이제 VS2022 에서 에디터 빌드로 실행 하면 신규 모듈이 동작하게 되고. 만약 에디터 없이 일반 게임에서 모듈을 적용 하려면 ThirdUserMap.Target.cs 파일에서도 동일하게 ExtraModulesNames를 추가해주도록 한다.