Skip to main content

[Unreal] 언리얼 빌드 시스템




모듈이란? #

  • 언리얼 엔진은 게임 제작에 필요한 기능(소스코드)을 모듈(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 파일을 생성한다.



패키징이란? #

  • 게임 빌드 설정을 해서 모듈을 컴파일 하면, 정적 라이브러리로 만들어지고 실행 파일에 포함된다. (빌드)
  • 실행 파일을 만든 후에는 게임 에셋을 배포할 플랫폼에 맞춰서 에셋을 튜닝해주어야 한다. (쿠킹)
  • → 실행 파일 빌드와 쿠킹된 에셋을 묶어서 하나의 프로그램으로 만든다 (패키징)



References #