Unreal Build Tool (UBT) 이란?

언리얼 빌드툴은 언리얼 엔진 4의 다양한 빌드 옵션을 통해 빌드하는 것을 관리하기 위한 프로세스중 하나이다.

BuildConfiguration.cs 파일에서 다양한 빌드 옵션을 설정할 수 있다.

UBT의 모듈 구조

언리얼 엔진 4는 다양한 모듈로 나누어져 있다.

각각의 모듈마다 ModuleName.build.cs 파일이 해당 모듈을 어떻게 빌드해야 할지에 대한 옵션들을 설정할 수 있다. 옵션들에는 아래와 같은 항목들이 들어갈 수 있다.

  • 모듈의 종속성들 (Module Dependencies)
  • 추가적인 라이브러리들 (Additional Libraries)
  • 인클루드 경로들 (Include Paths)
  • 기타 등등

기본적으로, 이런 모듈들은 각각 DLL 파일들에 컴파일 되어 하나의 실행가능한 형태로 로드된다.

BuildConfiguration.cs 파일에서 옵션을 수정해 하나의 파일로 빌드하는 것도 가능하다.

언리얼의 빌드 프로세스가 개발 환경의 모든 프로젝트 파일(.sln 이나 .vcproj 등)에서 종속되지 않고, 독립적으로 따로 실행되는 것을 알아두어야 한다.

프로젝트 파일은 편집 목적으로 아주 유용하고, 필수적이기 때문에 동적으로 생성하기 위한 도구가 UE4 에서 제공된다.

UE4 엔진 디렉토리에 있는 GenerateProject.bat을 사용하면 배치파일이 실행되어 도구를 실행할 수 있다. 가끔씩 GeneratedProject.bat 을 사용해 코드 에디터의 상태를 최신으로 유지하는 것이 좋다. 간혹 프로젝트에서 삭제되거나 추가된 코드들이 프로젝트에 반영되지 않는 경우가 있는데 이때, 문제를 느꼈다면 한 번씩 해보는 것이 좋다.

간단하게 하는 방법은 .uproject 파일을 오른쪽 클릭해보면, Generate Project File 버튼을 눌러 실행할 수도 있다.

UBT의 Target

언리얼 빌드툴은, 빌드 목적에 맞게 여러 빌드 타겟 타입(Target Type)을 지원한다.

Game쿠킹된 게임 빌드를 뽑기 위해 사용된다.
ClientGame 타겟과 똑같지만, 서버 코드를 전혀 넣지 않는다.
네트워크 게임에서 클라이언트를 만들 때 유용한 옵션이다.
ServerGame 타겟과 똑같지만, 클라이언트 코드를 전혀 넣지 않는다.
네트워크 게임에서 Dedicated 서버들을 만들때 유용한 옵션이다.
Editor언리얼 에디터의 확장 기능을 위한 타겟이다.
Program독립적인 언리얼 엔진 위에서 돌아가는 유틸리티 프로그램을 빌드하기 위한 타겟이다.

타겟들은 프로젝트의 Source 폴더 안에 담긴 [TargetName].target.cs 에 C# 언어로 선언되어 있다.

각각의 .target.cs 파일들은 TargetRules 기본 클래스에서 파생된 클래스를 선언하고, 생성자로부터 작성되는 방법을 제어하는 속성을 설정한다.

빌드 타겟에 대한 빌드 요청이 들어가면 UBT는 target.cs 파일을 컴파일하고, 그 안에 클래스를 구성하여 설정을 결정한다.

타겟 클래스의 이름은 반드시 파일 이름과 똑같은 이름에서 뒤에 ‘Target’을 붙여야 한다.

예를 들면 “MyProject.target.cs” 파일이 존재한다면, 그 내부의 클래스 이름은 “MyProjectTarget”이 되어야한다. 코드로 본다면 아래와 같다.

using UnrealBuildTool;
using System.Collections.Generic;
public class MyProjectTarget : TargetRules
{
    public MyProjectTarget(TargetInfo Target) : base(Target)
    {
        Type = TargetType.Game;
        // Other properties go here
    }
}

관련된 타겟의 설정 프로퍼티들은 공식 문서에 정리되어있다.

https://docs.unrealengine.com/ko/Programming/BuildTools/UnrealBuildTool/TargetFiles/index.html

UBT의 Module

모듈은 언리얼 엔진4를 빌드하는 하나 하나의 레고같은 것들이라고 봐도 좋다.

언리얼 엔진은 하나의 거대한 엔진을 여러 모듈들이 모여 구현되며, 게임도 하나의 모듈로써 게임 자체의 모듈들을 추가해 엔진의 모듈들과 함께 사용된다.

각각의 모듈은 특정한 기능들에 특화되어 캡슐화 되어있으며, 공개된 인터페이스와 컴파일 환경 (매크로, 인클루드 경로 등등)을 다른 모듈에서 사용할 수 있도록 제공해줄 수 있다.

모듈들은 프로젝트의 Source 폴더 안에 담긴 [ModuleName].build.cs 에 C# 언어로 선언되어 있다.

모듈에 속하는 C++ 소스 코드들은 .build.cs 파일이 들어있는 폴더에 저장되거나, 그 하위 폴더들에 저장된다.

각각의 .build.cs 파일들은 ModuleRules 기본 클래스에서 파생된 클래스를 선언하고, 생성자로부터 작성되는 방법을 제어하는 속성을 설정한다.

이러한 .build.cs 파일들은 UBT에서 컴파일 되고, 전반적인 컴파일 환경을 결정하기 위해 만들어졌다.

기본적인 .build.cs 파일들은 아래와 같은 형식을 가진다.

using UnrealBuildTool;
using System.Collections.Generic;
public class MyModule : ModuleRules
{
    public MyModule(ReadOnlyTargetRules Target) : base(Target)
    {
        // Settings go here
    }
}

관련된 모듈의 설정 프로퍼티들은 공식 문서에 정리되어있다.

https://docs.unrealengine.com/ko/Programming/BuildTools/UnrealBuildTool/ModuleFiles/index.html