icon안동민 개발노트

빌드 및 배포 기본


 언리얼 엔진 C++ 프로젝트의 빌드 및 배포 과정은 게임 개발의 중요한 부분입니다.

 이 절에서는 프로젝트를 효과적으로 빌드하고 다양한 플랫폼에 배포하는 기본적인 프로세스를 살펴보겠습니다.

개발, 테스트, 출시 빌드 구성

 언리얼 엔진은 다양한 빌드 구성을 제공합니다.

  1. 개발 빌드 : 디버깅 정보 포함, 최적화 최소화
  2. 테스트 빌드 : 일부 최적화 적용, 프로파일링 정보 포함
  3. 출시 빌드 : 최대 최적화, 디버깅 정보 제거

 빌드 구성 설정 예시 (Build.cs)

public class MyProject : ModuleRules
{
    public MyProject(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
 
        PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
 
        if (Target.Configuration == UnrealTargetConfiguration.Development)
        {
            PublicDefinitions.Add("WITH_EDITOR=1");
        }
        else if (Target.Configuration == UnrealTargetConfiguration.Shipping)
        {
            OptimizeCode = CodeOptimization.InShippingBuildsOnly;
        }
    }
}

다양한 플랫폼에 대한 빌드 설정

 각 플랫폼별 빌드 설정

 PC

if (Target.Platform == UnrealTargetPlatform.Win64)
{
    PrivateDependencyModuleNames.Add("WindowsPlatformFeatures");
}

 콘솔 (예 : PlayStation)

if (Target.Platform == UnrealTargetPlatform.PS4)
{
    PrivateDependencyModuleNames.Add("PS4PlatformFeatures");
}

 모바일

if (Target.Platform == UnrealTargetPlatform.IOS || Target.Platform == UnrealTargetPlatform.Android)
{
    PrivateDependencyModuleNames.Add("MobilePlatformFeatures");
}

언리얼 빌드 툴(UBT) 및 언리얼 헤더 툴(UHT) 활용

 UBT는 프로젝트 빌드를, UHT는 언리얼 엔진의 리플렉션 시스템을 위한 코드 생성을 담당합니다.

 UBT 커맨드 라인 사용 예시

UE4Editor-Cmd.exe MyProject.uproject -Run=Cook -TargetPlatform=Windows

 UHT는 UCLASS(), USTRUCT(), UFUNCTION() 등의 매크로를 처리합니다.

UCLASS()
class MYPROJECT_API AMyActor : public AActor
{
    GENERATED_BODY()
 
public:
    UFUNCTION(BlueprintCallable, Category = "MyFunctions")
    void MyCustomFunction();
};

쿠킹 프로세스

 쿠킹은 게임 콘텐츠를 대상 플랫폼에 최적화하는 과정입니다.

UE4Editor-Cmd.exe MyProject.uproject -Run=Cook -TargetPlatform=Android -FilesForCooking=MyMap

패키징 옵션 설정

 프로젝트 설정에서 패키징 옵션을 구성할 수 있습니다.

  1. Edit > Project Settings > Packaging
  2. 맵 & 모드, 쿠킹, 스테이징 등의 옵션 설정

배포용 빌드 최적화 기법

  1. 사용하지 않는 에셋 제거
  2. 쉐이더 사전 컴파일
  3. 텍스처 압축 최적화

 코드 예시 (Build.cs)

if (Target.Configuration == UnrealTargetConfiguration.Shipping)
{
    bUseUnityBuild = true;
    bUsePCHFiles = true;
    bUseInlining = true;
}

자동화된 빌드 파이프라인 구축

 Jenkins나 TeamCity와 같은 CI / CD 도구를 사용하여 자동화된 빌드 파이프라인을 구축할 수 있습니다.

 Jenkins 파이프라인 스크립트 예시

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                bat 'UE4Editor-Cmd.exe MyProject.uproject -Run=Compile -TargetPlatform=Win64'
            }
        }
        stage('Cook') {
            steps {
                bat 'UE4Editor-Cmd.exe MyProject.uproject -Run=Cook -TargetPlatform=Win64'
            }
        }
        stage('Package') {
            steps {
                bat 'UE4Editor-Cmd.exe MyProject.uproject -Run=Package -TargetPlatform=Win64'
            }
        }
    }
}

빌드 버전 관리 전략

  1. 시맨틱 버저닝 사용 (MAJOR.MINOR.PATCH)
  2. 빌드 번호 자동 증가

 DefaultGame.ini 예시

[/Script/EngineSettings.GeneralProjectSettings]
ProjectVersion=1.2.3

 빌드 스크립트에서 버전 증가

import configparser
 
config = configparser.ConfigParser()
config.read('DefaultGame.ini')
 
version = config['Script/EngineSettings.GeneralProjectSettings']['ProjectVersion']
major, minor, patch = map(int, version.split('.'))
patch += 1
 
config['Script/EngineSettings.GeneralProjectSettings']['ProjectVersion'] = f"{major}.{minor}.{patch}"
 
with open('DefaultGame.ini', 'w') as configfile:
    config.write(configfile)

다양한 배포 채널에 대한 배포 프로세스

 스팀

  1. Steamworks SDK 통합
  2. 스팀 빌드 툴을 사용하여 디포 생성 및 업로드

 에픽 게임즈 스토어

  1. 에픽 게임즈 스토어 SDK 통합
  2. 에픽 게임즈 런처를 통한 빌드 업로드

 콘솔 디지털 스토어

  1. 각 콘솔 제조사의 SDK 및 인증 프로세스 따르기
  2. 제조사 제공 툴을 사용하여 빌드 제출

 대규모 프로젝트의 효율적인 빌드 관리

  1. 모듈화 : 프로젝트를 여러 모듈로 분리
  2. 병렬 빌드 활용
  3. 분산 빌드 시스템 구축 (예 : Incredibuild)

 Build.cs 예시

public class MyLargeProject : ModuleRules
{
    public MyLargeProject(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
        bUseUnity = true;  // Unity 빌드 활성화
        MinFilesUsingPrecompiledHeader = 4;  // PCH 사용 최적화
    }
}

빌드 시간 최적화 전략

  1. 프리컴파일드 헤더(PCH) 최적화
  2. Unity 빌드 활용
  3. 불필요한 ##include 제거

 PCH 최적화 예시

// MyProjectPCH.h
##include "CoreMinimal.h"
##include "EngineMinimal.h"
// 자주 사용하는 헤더 파일들 포함

 Unity 빌드 설정 (Build.cs)

public class MyModule : ModuleRules
{
    public MyModule(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
        bUseUnity = true;
        MinGameModuleSourceFilesForUnityBuild = 32;
    }
}

 언리얼 엔진 C++ 프로젝트의 빌드 및 배포 프로세스는 복잡하지만 체계적인 접근으로 효율적으로 관리할 수 있습니다. 개발, 테스트, 출시 단계에 따라 적절한 빌드 구성을 사용하고, 각 대상 플랫폼의 특성을 고려한 빌드 설정을 적용해야 합니다.

 언리얼 빌드 툴(UBT)과 언리얼 헤더 툴(UHT)은 빌드 프로세스의 핵심 도구로, 이들을 효과적으로 활용하면 빌드 과정을 크게 최적화할 수 있습니다. 쿠킹 프로세스를 통해 게임 콘텐츠를 대상 플랫폼에 최적화하고, 적절한 패키징 옵션을 설정하여 최종 배포 파일을 생성합니다.

 자동화된 빌드 파이프라인을 구축하면 반복적인 빌드 작업을 효율적으로 관리할 수 있습니다. CI/CD 도구를 활용하여 코드 변경사항이 발생할 때마다 자동으로 빌드, 테스트, 패키징 과정을 수행할 수 있습니다.

 빌드 버전 관리는 프로젝트의 진행 상황을 추적하고 문제 발생 시 특정 버전으로 롤백하는 데 중요합니다. 시맨틱 버저닝과 같은 체계적인 버전 관리 전략을 채택하고, 빌드 번호를 자동으로 증가시키는 시스템을 구현하는 것이 좋습니다.

 다양한 배포 채널에 대한 프로세스는 각 플랫폼의 요구사항에 맞춰 조정해야 합니다. 스팀, 에픽 게임즈 스토어, 콘솔 디지털 스토어 등 각 플랫폼별로 SDK 통합, 빌드 업로드, 인증 프로세스 등이 다르므로 이에 대한 이해와 준비가 필요합니다.

 대규모 프로젝트의 경우, 모듈화, 병렬 빌드, 분산 빌드 시스템 등을 활용하여 빌드 시간을 관리해야 합니다. 프리컴파일드 헤더 최적화, Unity 빌드 활용, 불필요한 ##include 제거 등의 기법을 통해 빌드 시간을 단축할 수 있습니다.

 효율적인 빌드 및 배포 프로세스는 개발 생산성과 제품 품질에 직접적인 영향을 미칩니다. 따라서 지속적으로 프로세스를 개선하고 최적화하는 노력이 필요합니다. 팀의 규모, 프로젝트의 복잡도, 대상 플랫폼 등을 고려하여 가장 적합한 빌드 및 배포 전략을 수립하고 실행해야 합니다.