플랫폼별 빌드와 패키징
프로젝트와 콘텐츠를 점검한 뒤 Windows·Android·iOS별 실행 파일로 빌드하고 패키징합니다.
이전 장에서 성능 최적화를 마쳤다면, 이제 플레이어에게 실제로 전달하는 단계로 넘어가야 합니다.
이번 절의 주제는 배포(Deployment)입니다.
개발 환경의 프로젝트를 플레이어가 실행 가능한 독립 형태로 만드는 과정입니다. 코드 빌드는 그 일부이며, 패키징에는 플랫폼용 콘텐츠와 배포 파일을 준비하는 단계도 포함됩니다.
이번 절에서는 언리얼 엔진에서 게임을 다양한 플랫폼(Windows, Android, iOS 등)에 맞춰 빌드하고 패키징하는 기본적인 과정과 각 플랫폼별로 고려해야 할 사항들에 대해 자세히 살펴보겠습니다.
빌드와 패키징의 이해
코드 컴파일과 콘텐츠 변환, 배포 폴더 구성을 구분합니다.
| 단계 | 만드는 결과 | 실패 시 확인 |
|---|---|---|
| Build | 타깃 플랫폼·구성의 코드 바이너리 | 컴파일러, Target·Build.cs와 모듈·플러그인 의존성 |
| Cook | 해당 플랫폼 런타임용 맵·에셋 | 쿠킹 대상, 동적 로드 경로, 에셋 참조와 지원 형식 |
| Stage | 실행 파일·콘텐츠·설정 등을 모은 디렉터리 | 필수 파일, 플러그인 런타임 파일과 포함 경로 |
| Package | 플랫폼별 배포 형식과 콘텐츠 컨테이너 | 플랫폼 도구, 압축·컨테이너 및 서명 설정 |
| Archive | 선택한 보관 경로의 산출물 사본 | 같은 빌드 번호의 파일·로그·심볼 보존 정책 |
- Build
- 만드는 결과: 타깃 플랫폼·구성의 코드 바이너리실패 시 확인: 컴파일러, Target·Build.cs와 모듈·플러그인 의존성
- Cook
- 만드는 결과: 해당 플랫폼 런타임용 맵·에셋실패 시 확인: 쿠킹 대상, 동적 로드 경로, 에셋 참조와 지원 형식
- Stage
- 만드는 결과: 실행 파일·콘텐츠·설정 등을 모은 디렉터리실패 시 확인: 필수 파일, 플러그인 런타임 파일과 포함 경로
- Package
- 만드는 결과: 플랫폼별 배포 형식과 콘텐츠 컨테이너실패 시 확인: 플랫폼 도구, 압축·컨테이너 및 서명 설정
- Archive
- 만드는 결과: 선택한 보관 경로의 산출물 사본실패 시 확인: 같은 빌드 번호의 파일·로그·심볼 보존 정책
단계 완료는 실제 기기 실행·스토어 심사 통과를 뜻하지 않습니다. 플랫폼과 UAT 설정에 따라 수행되는 단계가 달라집니다.
패키징된 게임은 언리얼 엔진 에디터가 설치되어 있지 않은 환경에서도 독립적으로 실행될 수 있습니다.
패키징 전 준비 사항
성공적인 패키징을 위해서는 몇 가지 중요한 사전 설정이 필요합니다.
프로젝트 설정 (Project Settings)
-
Maps & Modes (맵 & 모드)
Default Maps->Editor Startup Map: 에디터 시작 시 로드될 맵.Default Maps->Game Default Map: 게임 시작 시 로드될 기본 맵. (매우 중요)Default Maps->Transition Map: seamless travel의 맵 전환 과정에 사용하는 작은 중간 맵. 일반 로딩 화면을 자동 구현하는 설정은 아닙니다.
-
Packaging (패키징)
Build Configuration:Development,Shipping,DebugGame등 빌드 목적에 맞는 구성을 선택합니다. 일반적으로 최종 배포용은Shipping을 사용합니다.Shipping은 배포용 최적화를 적용하고 일반 콘솔·통계 기능을 제한합니다. 디버그 심볼 생성·보관 여부는 별도이며, 실제 성능은 대상 장비에서 확인합니다.Full Rebuild: 코드 빌드 범위를 새로 수행하는 옵션입니다. 모든 Cook 캐시·사용자 데이터까지 초기화하는 기능으로 해석하지 않습니다.For Distribution: 마켓플레이스나 앱 스토어에 배포할 경우 체크합니다. 플랫폼별 서명 등 추가 요구사항이 활성화됩니다.Cook Content for Windows/Android/iOS/etc.: 패키징할 타겟 플랫폼을 선택합니다.Compress Content: 콘텐츠 파일을 압축하여 최종 빌드 크기를 줄입니다.
- Supported Platforms (지원 플랫폼): 프로젝트가 지원할 플랫폼을 여기서 활성화/비활성화합니다.
- Target Hardware (타겟 하드웨어):
Desktop,Console,Mobile등 타겟 디바이스의 종류를 설정하여 렌더링 품질 및 기능 제한에 영향을 줍니다. - Description (설명): 게임 이름, 버전, 저작권, 아이콘 등 기본 정보를 설정합니다.
- iOS/Android/Linux 등 플랫폼 설정: 각 플랫폼별로 SDK 경로, 서명 정보, 앱 아이콘, 스플래시 화면 등 고유한 설정이 필요합니다.
플러그인 관리 (Plugins)
- 사용하지 않는 플러그인은 비활성화하여 빌드 크기를 줄이고 빌드 시간을 단축합니다.
- 써드파티 플러그인의 경우, 해당 플러그인이 타겟 플랫폼을 지원하는지 확인해야 합니다.
콘텐츠 최적화 (Optimized Content)
- 9장 성능 최적화에서 다룬 모든 최적화 기법(LOD, 텍스처 압축, 머티리얼 최적화 등)이 패키징된 빌드에 직접적인 영향을 미칩니다. 에디터와 패키지의 콘텐츠·품질·진단 오버헤드는 다르므로, 최종 성능은 대상 패키지로 측정해야 합니다.
패키징 실행
언리얼 엔진 에디터에서 패키징을 실행하는 방법은 간단합니다.
UE5 메인 툴바의 Platforms 메뉴를 엽니다.
타깃 플랫폼과 빌드 구성·타깃을 확인합니다.
선택한 플랫폼의 Package Project를 실행합니다. 메뉴 이름과 지원 항목은 설치한 엔진·SDK에 따라 다릅니다.
저장될 출력 디렉토리를 선택합니다.
패키징 과정은 시간이 오래 걸릴 수 있으며, 특히 프로젝트 규모가 크거나 처음 빌드할 때는 더욱 그렇습니다.
출력 로그를 주시하여 에러나 경고 메시지를 확인하는 것이 중요합니다.
플랫폼별 특이 사항 및 고려 사항
플랫폼마다 개발 환경·서명·실제 배포 산출물을 구분해 확인합니다.
Windows (PC)
- 가장 일반적인 타겟: 가장 많이 사용되는 플랫폼이며, 패키징 과정이 비교적 간단합니다.
- 결과물: 실행 파일(
.exe)과 데이터 폴더가 포함된 디렉토리가 생성됩니다. -
필수 요구사항
- DirectX 또는 Vulkan 런타임: 사용자 시스템에 필요한 그래픽 API 런타임이 설치되어 있어야 합니다. 언리얼 엔진은 일반적으로 자체 인스톨러에 포함시키거나, 게임 설치 시 필요한 런타임을 함께 설치하도록 권장합니다.
- Visual C++ Redistributable: 게임이 빌드된 Visual Studio 버전에 맞는 C++ 재배포 패키지가 사용자 시스템에 설치되어 있어야 합니다. 언리얼 엔진 빌드 시 함께 배포되도록 설정할 수 있습니다.
- Steam, Epic Games Store 등: 각 스토어 플랫폼의 SDK를 통합하고, 그들의 배포 도구를 사용해야 합니다.
Android (모바일)
안드로이드 플랫폼은 설정할 것이 많고 복잡할 수 있습니다.
- SDK 및 NDK 설정: 사용 중인 엔진 버전이 요구하는 Android SDK·NDK·JDK 조합을 설치하고 경로를 설정합니다. 최신 도구라는 이유만으로 호환된다고 가정하지 않습니다.
Project Settings->Platforms->Android에서 SDK, NDK, JDK 경로를 설정합니다.
- 배포 형식과 서명: 직접 설치용 APK와 스토어 제출용 AAB를 구분합니다. 키스토어를 생성·보관하고 Android의 Distribution Signing 설정에 연결합니다. 제출 형식과 서명 요건은 대상 스토어의 현재 요구사항을 확인합니다.
- 권한 (Permissions): 앱이 카메라, 저장 공간, 인터넷 등 특정 기능을 사용하려면 AndroidManifest.xml에서 해당 권한을 선언해야 합니다. 언리얼 엔진은 일부 필수 권한을 자동으로 추가하지만, 커스텀 권한이 필요할 수 있습니다.
- ASTC 텍스처 압축: 모바일에서는 일반적으로 ASTC (Adaptive Scalable Texture Compression)를 사용하여 텍스처 메모리 사용량을 최적화합니다.
Project Settings->Android->Build에서Support ASTC를 활성화합니다. - 실행 파일 크기: 모바일 앱은 다운로드 크기 제한이 있는 경우가 많으므로, 불필요한 콘텐츠를 제거하고 압축을 최대한 활용하여 빌드 크기를 줄여야 합니다.
- 개발자 옵션: 개발 중에는 안드로이드 기기의 개발자 옵션을 활성화하여 USB 디버깅을 허용하고 앱을 직접 설치할 수 있습니다.
iOS (모바일)
iOS는 Apple의 생태계로 인해 특정한 요구사항이 있습니다.
- macOS 도구 체인: 이 교재의 C++ 프로젝트는 호환되는 Mac·Xcode 환경에서 iOS 바이너리를 빌드해야 합니다. Windows 개발 시에는 원격 Mac 빌드 구성을 검토합니다.
- Xcode 및 SDK: 엔진 버전의 개발 요구사항과 배포 대상이 요구하는 Xcode·iOS SDK 조합을 사용합니다.
- 개발자 계정 및 프로비저닝 프로파일: Apple Developer Program에 가입하고, 앱 ID, 개발 인증서, 프로비저닝 프로파일(Provisioning Profile)을 생성하여 앱 서명에 사용합니다.
Project Settings->Platforms->iOS에서 Bundle Identifier, Signing Certificate, Provisioning Profile을 설정합니다.
- 디바이스 테스트: 빌드된
.ipa파일을 실제 iOS 기기에 설치하여 테스트해야 합니다. - 앱 스토어 배포: TestFlight를 통한 베타 테스트 및 App Store Connect를 통한 최종 앱 스토어 제출 과정을 거쳐야 합니다.
콘솔
콘솔 플랫폼은 개발 키트와 NDA(비밀 유지 협약)가 필요하며, 일반적으로 더 엄격한 가이드라인과 인증 프로세스를 거쳐야 합니다.
- 개발자 등록: 각 콘솔 제조사의 개발자 프로그램에 정식으로 등록해야 합니다.
- 개발 키트 (Dev Kit): 게임 개발 및 테스트를 위해 전용 개발 키트 하드웨어가 필요합니다.
- SDK 통합: 각 플랫폼별 SDK를 언리얼 엔진 프로젝트에 통합해야 합니다.
- 플랫폼별 요구사항: 메모리 사용량, 로딩 시간, 프레임 속도, 특정 UI 가이드라인 등 각 콘솔이 요구하는 성능 및 기능 기준을 충족해야 합니다.
- 인증 (Certification): 최종 게임은 제조사의 엄격한 인증 테스트를 통과해야만 배포될 수 있습니다.
빌드 자동화 및 CI/CD
대규모 프로젝트나 지속적인 업데이트가 있는 프로젝트에서는 빌드 및 패키징 과정을 자동화하는 것이 필수적입니다.
- Command Line Builds: 언리얼 엔진은 명령 프롬프트에서
RunUAT.bat스크립트를 사용하여 패키징을 자동화할 수 있는 강력한 기능을 제공합니다.- Windows Game 타깃의 시작 예시:
RunUAT.bat BuildCookRun -project="[ProjectPath].uproject" -noP4 -platform=Win64 -clientconfig=Development -build -cook -stage -pak -archive -archivedirectory="[OutputPath]" - 실제 프로젝트의 맵·타깃·플러그인과 플랫폼 요구사항에 맞춰 인자를 정합니다. Server 타깃과 스토어 서명 옵션을 무조건 한 명령에 합치지 않습니다.
- Windows Game 타깃의 시작 예시:
- CI/CD (Continuous Integration / Continuous Deployment) 파이프라인: Jenkins, TeamCity, GitHub Actions 등 CI/CD 툴과 연동하여 코드 변경 시 자동으로 빌드, 테스트, 패키징 및 배포를 수행하는 시스템을 구축합니다. 이는 개발 효율성을 극대화하고 에러를 조기에 발견하는 데 도움이 됩니다.
자동화된 패키징 로그는 한 덩어리로 보지 말고 Build, Cook, Stage, Archive 단계별 실패 원인을 분리해서 읽어야 복구가 빠릅니다.
패키징 후 테스트
패키징된 빌드는 에디터에서 실행되는 것과 다를 수 있습니다.
- 모든 플랫폼에서 테스트: 각 타겟 플랫폼의 실제 하드웨어에서 패키징된 빌드를 철저히 테스트하여 예상치 못한 버그나 성능 문제를 확인합니다.
- QA (Quality Assurance): QA 팀이나 테스터에게 빌드를 배포하여 광범위한 테스트를 수행합니다.
- 측정과 출하 확인: 상세 계측은 도구가 포함된 Development·Test 구성 등을 사용하고 최종 Shipping 산출물의 실행·성능도 별도로 확인합니다. 기본 Shipping에서 개발용 콘솔·stat 명령이 그대로 동작한다고 가정하지 않습니다.
빌드 번호·플랫폼·서명 상태·심볼을 산출물과 함께 보관하고, 같은 산출물이 깨끗한 대상 환경에서 시작 맵과 필수 콘텐츠를 로드하는지 확인합니다.