언리얼 엔진에서 게임플레이 모듈이란 DLL에 컴파일되는 게임 프로젝트에 속하는 게임플레이 클래스의 모음입니다.
엔진 자체가 여러 모듈로 이루어져 있는 것과 마찬가지로, 각 게임은 하나 이상의 게임플레이 모듈로 이루어져 있습니다.
이들은 관련 클래스들의 모음을 담는 그릇이라는 점에서 이전 버전 엔진에서의 패키지와 비슷합니다.
언리얼 엔진 4에서는 게임플레이가 모두 C++로 처리되기에, 모듈은 별도의 패키지 파일이라기 보다는 사실상 DLL에 가깝습니다.
1. 모듈 생성
게임플레이 모듈에는 반드시 최소한 하나의 헤더(.h) 파일, C++(.cpp) 파일, 빌드(.Build.cs) 파일이 들어있어야 합니다.
헤더 파일은 모듈 디렉터리의 Public 폴더, 즉 [게임프로젝트명]\Source\[모듈명]\Public 디렉터리 안에 있어야 합니다.
#include "Engine.h"
#include "EnginePrivate.h"
#include "<ModuleName>Classes.h"
해당 헤더 파일에는 모듈의 자동 생성 헤더 파일과 모듈에 들어있는 클래스를 컴파일하는데 필요한 헤더 파일들이 포함됩니다.
C++ 파일은 모듈 디렉터리의 Private 폴더, 즉 [게임프로젝트명]\Source\[모듈명]\Private 디렉터리 안에 들어가며, 모듈을 등록하고 구현합니다.
// 게임의 헤더 파일 포함
#include "<ModuleName>.h"
// 모듈을 Primary 로 지정
IMPLEMENT_PRIMARY_GAME_MODULE( <ModuleName>, "<GameName>" );
IMPLEMENT_PRIMARY_GAME_MODULE 매크로를 사용해서 모듈을 등록해야 합니다. 그 이후의 모듈은 대안으로 IMPLEMENT_GAME_MODULE 매크로를 사용할 수 있습니다. 하나의 게임 프로젝트에서 여러개의 게임플레이 모듈을 사용할 수 있습니다.
using UnrealBuildTool;
public class <ModuleName> : ModuleRules
{
public <ModuleName>( TargetInfo Target )
{
PublicDependencyModuleNames.AddRange( new string[] { "Core", "Engine" } );
PrivateDependencyModuleNames.AddRange( new string[] { "RenderCore" } );
}
}
빌드 파일은 게임플레이 모듈의 루트 디렉터리, 즉 [게임프로젝트명]\Source\[모듈명]에 들어가며, 언리얼 빌드 툴이 모듈을 컴파일하는데 사용되는 약간의 정보를 정의할 수 있습니다.
2. INI 파일 셋업
새로 생성한 게임플레이 모듈은 UObject 코드를 가질 것이기에 약간의 환경설정이 필요합니다.
DefaultEngine.ini 파일의 여러 부분에 모듈을 추가시켜야 합니다.
- [UnrealEd.EditorEngine] 섹션의 EditPackages 배열
[UnrealEd.EditorEngine] +EditPackages=<ModuleName>
- [Launch] 섹션
[Launch] Module=<ModuleName>
- [/Script/Engine.UObjectPackages] 섹션의 NativePackages 배열
[/Script/Engine.UObjectPackages] +NativePackages=<ModuleName>
3. 다중 게임플레이 모듈
게임을 다수의 DLL 파일로 나누는 것은 그 이득보다 문제가 많을 수가 있지만, 이것은 각 팀의 요구와 원칙에 따라 결정해야 할 것입니다. 다중 게임플레이 모듈을 사용하면 링크 시간이나 코드 반복처리 시간이 빨라지겠지만, DLL 익스포트 및 인터페이스 클래스를 처리해야 하는 모듈 수가 늘어나게 됩니다. 이러한 상충 관계는 엔진이나 에디터 코드에 대해서는 올바른 것이나, 게임플레이에 대해서는 좋은 것이 아닙니다.
primary 게임 모듈을 만든 이후에 추가적인 게임 전용 모듈을 몇이든 추가할 수 있습니다. 이러한 새 모듈에 대해 .Build.cs 파일을 만들고, 이 모듈에 대한 레퍼런스를 자기 게임의 Target.cs 파일(OutExtraModuleNames 배열)에 추가합니다. C++ 코드에서 게임 모듈에 적합한 매크로를 사용했는지 확인해야 합니다. 최소한 하나의 모듈에는 IMPLEMENT_PRIMARY_GAME_MODULE 매크로를 사용해서 primary 게임 모듈을 등록해야 하고, 다른 모든 모듈들은 IMPLEMENT_GAME_MODULE 매크로를 사용해서 등록해야 합니다. 이렇게 하면 언리얼 빌드 툴은 자동으로 모듈을 발견하여 부가 게임 DLL 파일을 컴파일합니다.
서로 의존적인 모듈 생성을 지원은 하나, 컴파일 시간 측면에서 이상적이지는 않으며, 변수의 정적인 초기화에 가끔 문제를 일으킬 수 있습니다. 게임플레이 모듈들을 서로 의존적이지 않게 디자인하고 유지하기란 어려운 일이지만 코드는 더욱 깔끔해 질 것입니다.
'언리얼 C++ 프로그래밍' 카테고리의 다른 글
[언리얼 C++] 프로퍼티 선언 (0) | 2021.07.29 |
---|---|
[언리얼 C++] 인터페이스 클래스 (0) | 2021.07.28 |
[언리얼 C++] UFunction 선언 (0) | 2021.07.26 |
[언리얼 C++] 게임플레이 클래스 구현 (0) | 2021.07.25 |
[언리얼 C++] 게임플레이 클래스 생성 (0) | 2021.07.24 |