[Unreal] 언리얼 빌드 시스템
Table of Contents
모듈이란? #
- 언리얼 엔진은 게임 제작에 필요한 기능(소스코드)을 모듈(Module) 이라는 단위로 제공하고 있다.
- 소스코드를 모듈 단위로 구성해서 컴파일 하면 다음과 같은 결과물이 나오는데, 이걸 사용해서 모듈을 로딩한다.
- 에디터용으로 빌드하면 DLL 동적 라이브러리가 나온다.
- 게임용으로 빌드하면 정적 라이브러리가 나온다.
프로젝트 폴더안에 있는 것들 #
디렉터리 구조 #
폴더명 | 설명 | 지워도 다시 생성되는가? |
---|---|---|
Binaries | 모듈 목록이 적힌 파일(.modules) 과 모듈별로 소스코드를 컴파일한 결과인 DLL파일(에디터용) 이 들어있다. |
O |
Build | 패키징 결과물이 들어있다. | O |
Config | 프로젝트의 설정 값이 들어있다. | X |
Content | 에셋(.uasset 파일)이 들어있다. | X |
DerivedDataCache | 여러 버전의 애셋을 언리얼 엔진과 그 타깃 플랫폼에서 사용되는 포맷으로 저장한 결과물이 들어있다. |
O |
Intermediate | 빌드 도중 생성된 임시 파일이 들어있다. | O |
Saved | 자동저장, 환경설정(.ini), 스크린샷, 로그 파일이 들어있다. | O |
Source | 소스코드가 들어있다. | X |
.sln 파일 #
- 비주얼 스튜디오의 솔루션 파일이다.
- .uproject 파일을 우클릭해서 Generate Visual Studio project file 메뉴를 선택하면 언제든 재생성할 수 있다.
.uproject 파일 #
- 에디터를 띄울 때 필요한 정보들이 JSON형식으로 저장되어 있다.
- 어떤 버전의 에디터를 띄울 것인가?
- .uproject 파일은 윈도우 레지스트리에 UnrealVersionSelector라는 프로그램과 연동되어 있다. 그래서 .uproject 파일을 더블 클릭하면 적절한 에디터가 띄워진다.
- 아래 파일 내용에서 EngineAssociation값이 5.1이므로 5.1버전 에디터를 실행시켜야 한다. 언리얼 엔진이 설치된 폴더에는 5.1버전의 에디터가 어디에 설치되었는지 기록되어 있는데 이것을 참고해서 에디터 위치를 파악하고 실행한다.
- 어떤 모듈을 함께 로딩할 것인가?
- Modules는 해당 모듈을 에디터를 띄울 때 함께 로딩하라는 것이다. 언리얼 에디터는 Binaries 폴더에서 UnrealEditor-{모듈이름}.dll 파일을 찾아서 로딩한다.
{
"FileVersion": 3,
"EngineAssociation": "5.1",
"Category": "",
"Description": "",
"Modules": [
{
"Name": "{모듈 이름}",
"Type": "Runtime",
"LoadingPhase": "Default",
"AdditionalDependencies": [
"Engine",
"CoreUObject"
]
}
]
}
Source 폴더 안에 있는 것들 #
전체 구조 #
- {프로젝트 이름}.Target.cs
- {프로젝트 이름}.Editor.Target.cs
- 모듈 폴더
- {모듈 이름}.Build.cs
- {모듈 이름}.h
- {모듈 이름}.cpp
- 추가적으로 제작한 소스 코드들...
설정 파일이 C#으로 만들어진 이유? #
- 특정 플랫폼에 종속되지 않는 멀티 플랫폼 빌드 시스템을 지원하기 위해서이다.
- C#은 런타임에 코드를 컴파일하고 그 결과를 반영(compile on-the-fly)할 수 있기 때문에. 이를 활용해서 런타임에 cs 파일을 읽어 빌드 환경을 구축하고 컴파일을 진행한다.
- 이러한 실제 빌드를 담당하는 것이 Unreal Build Tool(UBT)이라는 C# 프로그램이다. UBT는 Source 폴더에 있는 소스 코드들을 분석해서 컴파일을 진행해준다.
{프로젝트 이름}.Target.cs, {프로젝트 이름}.Editor.Target.cs #
- 각각 게임 빌드와 에디터 빌드에서 다룰 타겟을 지정한다.
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
using System.Collections.Generic;
using System;
// 게임 빌드 : UnrealBuildSystemTarget
// 에디터 빌드 : UnrealBuildSystemEditorTarget
public class UnrealBuildSystemTarget : TargetRules
{
public UnrealBuildSystemTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Game;
DefaultBuildSettings = BuildSettingsVersion.V2;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
ExtraModuleNames.Add("{모듈 이름}");
}
}
{모듈 이름}.Build.cs #
- 모듈을 빌드하기 위한 C++ 프로젝트 설정 정보.
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
public class {모듈 이름} : ModuleRules
{
public {모듈 이름}(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
PrivateDependencyModuleNames.AddRange(new string[] { });
// Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}
{모듈 이름}.h, {모듈 이름}.cpp #
- 모듈 선언과 구현파일.
#pragma once
#include "CoreMinimal.h"
#include "{모듈 이름}.h"
#include "Modules/ModuleManager.h"
IMPLEMENT_PRIMARY_GAME_MODULE(FDefaultGameModuleImpl, {모듈 이름}, "{모듈 이름}");
C++ 프로젝트의 빌드 구성 #
항목 | 설명 |
---|---|
DebugGame | 디버깅이 가능하게 최적화를 덜 했다. .exe 파일을 생성한다. |
DebugGame Editor | 디버깅이 가능하게 최적화를 덜 했다. 에디터용 DLL파일을 생성한디. (디버깅하면서 개발할 땐 이걸 쓰자.) |
Development | 중간 수준으로 최적화를 해서 디버깅으로 모든 변수를 살펴 볼 수는 없다. .exe 파일을 생성한다. |
Development Editor | 중간 수준으로 최적화를 해서 디버깅으로 모든 변수를 살펴 볼 수는 없다. 에디터용 DLL파일을 생성한디. |
Shipping | 소스 코드를 빌드해서 사용자에게 배포할 최종 게임 코드를 만든다. .exe 파일을 생성한다. |
패키징이란? #
- 게임 빌드 설정을 해서 모듈을 컴파일 하면, 정적 라이브러리로 만들어지고 실행 파일에 포함된다. (빌드)
- 실행 파일을 만든 후에는 게임 에셋을 배포할 플랫폼에 맞춰서 에셋을 튜닝해주어야 한다. (쿠킹)
- → 실행 파일 빌드와 쿠킹된 에셋을 묶어서 하나의 프로그램으로 만든다 (패키징)