Unreal Build System (언리얼 빌드 시스템)은 언리얼 엔진 4 (UE4) 빌드 프로세스를 자동화시키는 툴 모음이다. 일반적인 수준에서 UnrealBuildTool 과 UnrealHeaderTool 은 언리얼 빌드 시스템을 지원한다.
UnrealBuildTool
UnrealBuildTool (UBT)는 다양한 빌드 구성으로 UE4 소스 코드를 빌드하는 프로세스를 관리해 주는 커스텀 툴이다. BuildConfiguration.cs 파일에서 다양한 사용자 환경설정 가능 빌드 옵션을 살펴볼 수 있다.
UnrealHeaderTool
UnrealHeaderTool (UHT) 는 UObject 시스템을 지원하는 커스텀 파싱 및 코드 생성 툴이다. 코드 컴파일은 두 단계로 이루어진다:
- UHT 를 실행한다. 언리얼 관련 클래스 메타데이터에 대한 C++ 헤더를 파싱하고, 다양한 UObject 관련 기능 구현을 위한 커스텀 코드를 생성하는 툴이다.
- 보통 C++ 컴파일러를 실행하여 그 결과를 컴파일한다.
모듈식 아키텍처
UE4 는 다수의 모듈로 나뉘어 있다.
각 모듈에는 .build.cs 파일이 있으며, 이를 통해 그 빌드 방식을 제어하고, 모듈 종속성, 부가 라이브러리, 인클루드 경로 등의 정의를 위한 옵션도 포함되어 있다. 기본적으로, 이 모듈은 DLL 에 컴파일되어 하나의 실행파일로 로드된다. BuildConfiguration.cs 파일에서 monolithic 실행파일 빌드를 선택할 수 있다.
언리얼 빌드 시스템 사용
언리얼 빌드 시스템을 사용하기에 앞서, 개발 환경에 대해 (Visual Studio 의 경우) .sln 이나 .vcproj 파일처럼 프로젝트 파일 개별적으로 빌드 프로세스가 실행된다는 것을 이해하는 것이 중요하다.
이 파일을 갖고 있으면 편집 목적 상 유용하긴 하지만, 프로젝트 디렉터리 구조 내용에 따라 동적으로 생성하는 툴이 제공되어 있다. 이 툴은 [Root UE4] 디렉터리의 GenerateProject.bat 파일로 실행시킬 수 있다.
처음에는 비어 있던 폴더에 단지 uproject 파일만 제작했을 뿐인데, 현재 많은 폴더와 상당한 용량을 차지하고 있는 것을 볼 수 있다.
Config(있는 경우에만), Content , Source를 제외한 모든 폴더와 ArenaBattle.uproject 파일을 제외한 모든 파일을 제거해보자. (CCS만 살린다)
이제 uproject 파일을 마우스 우 클릭하고, Generate Visual Studio project files 메뉴를 눌러주자.
그러면 다이얼로그가 뜨면서 아래와 같이 비주얼 스튜디오 관련 파일 및 폴더와 Intermediates 폴더가 자동으로 생성된다.
솔루션 파일 ArenaBattle.sln 파일을 더블 클릭해 열어보자.
그러면 지웠던 솔루션 파일이 원상복구 되어 있음을 확인할 수 있다.
언리얼 빌드 시스템
추상적인 소스 코드 구조를 만들고, 이를 기반으로 플랫폼에 맞게 프로젝트를 재생성하는 기능
분명히 삭제한 솔루션 파일이 완벽하게 복원이 되었는데, 어떻게 이것이 가능한지 이해하려면 언리얼의 빌드 시스템에 대해 알아야 한다.
언리얼 엔진 4부터는 개발 환경이 맥(Mac)하고 윈도우(Window), 두 가지 플랫폼을 지원하도록 설계되어 있다.
두 플랫폼의 개발 환경(IDE)이 동일하면 좋겠지만,
1. 맥에서는 엑스코드(XCode),
2. 윈도우에는 비주얼 스튜디오(Visual Studio)
라는 막강한 툴이 있어서, 현실적으로 이를 고려하지 않고 개발하기가 어렵다.
그런데 이 툴은 서로 다른 체계로 프로젝트를 관리한다.
이러다 보니, 추상적인 소스 코드 구조를 만들고, 이를 기반으로 플랫폼에 맞게 프로젝트를 재생성하는 기능이 필요하게 되었다.
이를 위해서 에픽 게임스가 제작한 프로그램이 언리얼 빌드 툴(Unreal Build Tool)이다.
방금 실행한 Generate Visual Studio project files 메뉴는 이 언리얼 빌드 툴을 실행하는 명령이다.
언리얼 빌드 툴이 실행되면 현재 프로젝트의 폴더 구조와 소스 파일들을 분석하고 현재 작업하는 플랫폼에 맞는 개발 도구 환경을 자동으로 생성해준다.
우리는 현재 윈도우에서 실행했기 때문에 비주얼 스튜디오에 맞는 개발 도구 환경이 생성되게 된 것이다.
언리얼 빌드 툴이 실행되면 먼저 프로젝트의 Source 폴더를 찾는다.
Source 폴더 아래에 빌드 할 대상 정보를 지정한 Target.cs 파일을 조사하면서 하위에 모듈이 있는지 검사한다.
모듈은 항상 독립된 폴더 단위로 나뉘어 있어야 하며, 이 모듈도 언리얼 엔진이 지정한 특정한 룰을 따라야 한다.
언리얼 빌드 툴은 Source 폴더의 조사가 끝나면,
Intermediate폴더 안의 ProjectFiles 폴더에 자신이 조사한
1. 언리얼 소스 구조를 정리해 프로젝트 파일을 생성함과
2. 동시에 언리얼 엔진 설치 폴더로부터 소스 코드에 대한 프로젝트 파일도 복사해온다.
마지막으로 이 둘을 합친 솔루션 파일을 프로젝트 폴더에 생성해, 바로 프로그래밍을 할 수 있도록 편의를 제공해준다.
이것이 언리얼 빌드 툴이 하는 역할이다.
아래는 언리얼 빌드 툴에 의해 제작된 비주얼 스튜디오 솔루션의 모습이다.
두 프로젝트(UE4, GAME)은 Intermediate 폴더에 있음을 꼭 기억해야한다.
참고로 Generate Visual Studio project files 메뉴로 프로젝트를 생성하는 경우, 간혹가다 우리가 작업 하는 ArenaBattle이 시작 프로젝트로 설정되어 있지 않고 소스 코드 참고용 프로젝트인 UE4가 시작 프로젝트로 설정될 때가 종종 발생한다.
컴파일이 동작하지 않는 경우에는 아래 그림처럼 시작 프로젝트를 확인해주시고 게임 프로젝트인 ArenaBattle을 기본 프로젝트로 설정해주어야 정상 동작하게 된다. (엔진 빌드 말고 게임솔루션을 빌드 해야함)
개발버전 설정
이번에는 비주얼 스튜디오의 툴바 상단을 보겠다.
솔루션 구성과 플랫폼을 보면 Editor와 Editor가 아닌 목록이 번갈아 들어 있음을 볼 수 있다.
Editor로 끝나는 설정은 에디터용 dll 파일을 생성하는 구성이고 Editor가 없는 설정은 게임 패키징용 exe 파일을 생성하는 구성이다.
현재 기본 값은 Development Editor로 되어 있다. 이는 디버깅이 가능한 개발 버전으로 컴파일해 에디터용 dll 파일을 제작하라는 의미다.
F7 키를 눌러 Development Editor 구성으로 빌드 하면, 아래 그림과 같이 UE4Editor-ArenaBattle.dll이 생성되는 것을 로그로 확인할 수 있는데, 이 파일은 프로젝트 폴더의 Binaries > Win64 폴더에 생성된다.
이번에는 빌드 구성을 바꾸어 Development로 변경해 빌드를 진행해보자.
F7 키를 눌러 빌드 하면 출력 로그에는 이번에는 동일한 폴더 위치에 exe 파일이 생성된 것을 볼 수 있다.
Editor가 없는 구성은 게임을 만드는 빌드 설정이고, 우리가 지정한 플랫폼은 Win64이기 때문에 최종적으로 exe 파일이 만들어진 것이다.
참고로 컴퓨터에 안드로이드 개발 환경이 설치되어 있다면 Win64외에도 Android를 플랫폼 목록에서 확인할 수 있다. 아래와 같이 Development 와 Android 가 선택된 상태에서 빌드를 수행하면 exe 파일 대신 안드로이드에서 동작하는 apk 파일이 자동으로 만들어진다. ( Android 메뉴는 안드로이드 개발 환경이 설치되어 있을 때만 자동 생성된다. )
다시 돌아와서, Win64 빌드로 생성된 exe 파일을 실행하면, 게임이 실행되는데 현재 이 실행파일이 참고할 아무런 리소스가 없다 보니 아래와 같은 에러를 띄우고 프로그램은 바로 종료된다.( 게임이 올바르게 실행되려면 exe파일외에도 리소스 파일과 관련 파일들이 exe파일이 인지할 수 있는 경로에 있어야 한다. )
Target.cs 파일
빌드 구성을 지정하는데 사용되는 설정 파일
지금까지 언리얼 빌드 툴이 생성한 비주얼 스튜디오 솔루션이 두 개의 다른 유형의 빌드를 생산할 수 있도록 설계된 것을 확인했다. (윈도우, 안드로이드) 이 설정 또한 언리얼 엔진 규칙에 의해 정의된 것이며, 이는 프로젝트의 Source 폴더의 ArenaBattle.target.cs와 ArenaBattleEditor.target.cs 파일에 지정되어 있다.
Target.cs 파일은 빌드 구성을 지정하는데 사용되는 설정 파일이다.
그림에서 보이다시피 C# 언어의 클래스로 구성되어 있다. 이 두 파일을 열어보면 생성자 구문에 C#의 생성자 구문에 Type 정보가 기록되어 있다.
Editor는 Type이 Editor로 되어 있고, Game은 Type이 Game으로 되어 있는데, 이 항목이 빌드의 구성을 결정하는 중요한 설정값이다. ( 이 파일이 지원하는 다른 Type 값으로는 Program과 Server가 있는데, 엔진에서 보조로 사용할 콘솔 프로그램을 제작하거나 서버 빌드를 제작하는데 사용된다.)
using UnrealBuildTool;
using System.Collections.Generic;
public class ArenaBattleTarget : TargetRules
{
public ArenaBattleTarget(TargetInfo Target)
{
Type = TargetType.Game; // Target.cs 파일
}
//
// TargetRules interface.
//
public override void SetupBinaries(
TargetInfo Target,
ref List<UEBuildBinaryConfiguration> OutBuildBinaryConfigurations,
ref List<string> OutExtraModuleNames
)
{
OutExtraModuleNames.AddRange( new string[] { "ArenaBattle" } );
}
}
지금까지 살펴본 언리얼 엔진의 빌드 구조는 아래와 같이 정리할 수 있다.
정리하면 언리얼 전체 프로젝트에서 중요한 폴더는 Config , Content , Plugins, Source 폴더와 uproject 파일뿐이다. 나머지 폴더와 파일은 제거하더라도 언리얼 빌드 툴에 의해서 재생성이 가능하다.
따라서 협업을 위해 소스 코드를 관리할 때나 다른 프로젝트로 파일을 옮길 때 무리하게 빌드 된 결과물을 옮길 필요 없이, 위에서 언급한 폴더와 파일만 공유하면 된다.
'게임엔진 > Unreal' 카테고리의 다른 글
[Unreal] 가비지 컬렉터 (GC) 정리 (0) | 2023.10.26 |
---|---|
[Unreal] 클래스 기본 객체 (CDO) + 로딩과정 + 로그디버깅 + 인스턴스 생성 (0) | 2023.08.31 |
[Unreal] 스레드와 단일 스레드로 실행시키기 (-norenderthread) (0) | 2023.08.12 |
[Unreal] UENUM 메타데이터 종류 (0) | 2023.07.07 |
[Unreal] UENUM에서의 비트마스크 사용 (0) | 2023.07.06 |