참고 자료
포트나이트 워크플로 - UnrealGameSync를 활용한 대규모 팀의 협업 Working with Custom Unreal Engine Builds & Unreal Game Sync - Perforce U
개인 개발 VS 대규모 팀 개발
개인 혹은 소규모로 개발하는 상황에서는 다음과 같은 요소들을 크게 고려하지 않아도 된다.
- 개발 환경
- 코드와 에셋 관리 방식
- 패키징 및 빌드 공유 과정
- 이슈 트래킹 및 협업 프로세스
이런 상황에서는 문제가 발생하더라도 원인 파악이 빠르고 수정 후 바로 검증이 가능하며 영향 범위도 매우 제한적이기 때문이다. 따라서 코드 수정 → 빌드 → 실행 → 테스트의 과정이 매우 단순하다.
하지만 팀 규모가 커지고 프로젝트가 복잡해질수록 상황은 완전히 달라진다.
- 프로젝트 용량 증가 (수십 ~ 수백 GB)
- 빌드 시간 증가 (수십 시간 이상)
- 다양한 직군 참여 (프로그래머 / 아티스트 / 기획 / QA 등)
- 동시에 여러 기능이 병렬로 개발됨
이때부터는 단순한 개발 과정이 아니라 협업을 위한 CI/CD 환경 위에서 프로젝트가 돌아가는 상황을 이해해야 한다.
기존 Workflow의 한계
대규모 팀에서도 일반적으로 개개인이 하는 작업은 다르지 않다.
- Sync → 개발 → 빌드 → 실행 → 테스트 → Submit
하지만 협업 환경에서는 이 단순한 흐름이 여러 구조적인 문제를 만들어낸다.
1. 콘텐츠 중심 vs 코드 중심 충돌
Unreal Engine은 코드 + 에셋(콘텐츠)이 강하게 결합된 구조를 가진다.
- C++ 코드 → 클래스 정의 (UCLASS, UPROPERTY)
- uasset → 해당 클래스 구조를 기반으로 직렬화된 데이터
즉, 에셋이 코드에 종속된 데이터라고 볼 수도 있다.
문제는 이 두 요소가 서로 다른 방식으로 관리된다는 점이다.
- 코드 → 컴파일 필요
- 콘텐츠 → 바이너리 에셋 (uasset)
예를 들어,
- Perforce에는 최신 빌드 바이너리가 존재하고
- 개발자는 로컬에서 별도로 빌드한 에디터를 사용하는 경우
동일한 에셋이라도 서로 다른 방식으로 해석될 수 있다. 이때 다음과 같은 문제가 발생할 수 있다.
- 바이너리 불일치
- 메모리 손상 (Memory Corruption)
- 원인 추적 어려운 크래시
2. 코드 변경과 콘텐츠 변경의 비동기성
Unreal에서는 코드 변경이 곧 콘텐츠 변경을 요구하는 경우가 많다.
예를 들어, 기획에 따라 클래스에 새로운 프로퍼티를 추가하면 해당 구조를 반영하기 위해 에셋을 다시 저장해야 한다. 하지만 협업 환경에서는 이 과정이 항상 동시에 이루어지지 않는다.
이런 상황에서 만약
- 코드 변경 → 에셋 수정 필요
- 하지만 팀 전체 빌드가 아직 반영되지 않음 / 담당 직무자가 바로 업무를 수행하기 어려움.
이라면 결과적으로 작업 흐름이 끊기고, 팀 간 의존성이 증가하면서 생산성이 저하된다.
3. 버전 불일치로 인한 데이터 손상
Unreal Engine의 직렬화 시스템은 유연하지만, 버전이 섞이는 순간 치명적인 문제가 발생할 수 있다.
예를 들어
- 최신 코드에서 프로퍼티 추가
- 최신 에디터로 에셋 저장
- 구버전 에디터에서 해당 에셋 로드
이때 구버전 에디터는 새로 추가된 프로퍼티를 인식하지 못한다. 결과적으로 해당 데이터를 “존재하지 않는 값”으로 판단하고 무시하게 된다.
거기다 이 상태에서 에셋을 다시 저장하면 새로 추가된 데이터가 완전히 삭제된다.
Unreal Game Sync
이 모든 문제는 결국 하나의 공통된 원인에서 발생한다.
코드, 에디터(엔진), 에셋이 서로 다른 버전을 사용하고 있다
Unreal Game Sync의 목적
Epic Games는 이런 기존 포트나이트 개발 과정에서의 비효율을 해결하기 위해 소규모 프로젝트인 배틀브레이커스의 워크플로를 참고했다.
배틀브레이커스 팀은
- 모든 팀원이 직접 에디터를 빌드
- 코드, 에셋, 실행 환경을 스스로 관리
= 문제 발생 시 즉각적인 커뮤니케이션
하는 형식으로 작업을 진행했다. 그리고 그 결과
- 빠른 반복 작업
- 높은 생산성
- 직군 간 소통 증가
이 가능했다.
하지만 대규모 팀에서는 이 방식을 그대로 확장하면 다음과 같은 문제를 고려해야헸다.
- 안정성 저하 (검증되지 않은 빌드 사용)
- 데이터 손상 가능성
- 빌드 시간 증가
- 개인의 툴 사용 난이도 증가 (Visual Studio 등)
- 글로벌 협업 환경에서의 커뮤니케이션 한계
Unreal Game Sync의 주요 기능(Feature)
Unreal Game Sync는 단순히 Sync와 Build를 자동화하는 도구가 아니라, 대규모 팀에서 발생하는 다양한 협업 문제를 해결하기 위해 발전해온 워크플로 시스템이다.
1. 빌드 상태 공유 및 협업 UI(중앙 피드백 시스템)
| 구분 | 기능 | 핵심 역할 | | -- | -------------- | ----------------------------------- | | 1 | 멀티 탭 | 여러 프로젝트/스트림을 동시에 확인 | | 2 | 상태 패널 & 스트림 전환 | 프로젝트 정보, SDK 버전 표시 및 안정적인 스트림 전환 지원 | | 3 | 빌드 배지 | 빌드 상태 표시 및 로그 이동, 실패 시 자동 알림 제공 |
UGS는 문제 공유 및 협업을 위한 커뮤니케이션 허브 역할을 제공한다.
2. QA를 위한 바이섹트(Bisect) 모드
테스트 중 다음과 같은 상황이 자주 발생한다.
“어느 시점부터 버그가 생겼는지 모르겠다”
이때 사용하는 기능이 Bisect 모드이다.
정상 동작 changelist와 문제 발생 changelist 지정
↓
UGS가 중간 지점으로 자동 sync
↓
테스트 후 정상/비정상 판별
↓
범위를 절반씩 줄이며 반복이러한 기능을 통해 QA는 수십 개의 변경사항을 하나씩 확인할 필요 없이 최소한의 테스트로 문제 발생 지점을 빠르게 특정할 수 있다
3. 워크스페이스 관리 자동화 (Clean Workspace)
언리얼 엔진 프로젝트는 빌드 과정에서 수많은 중간 파일을 생성한다. 이 파일들은 프로젝트 곳곳에 흩어져 있기 때문에 관리가 어렵다.
UGS의 Clean Workspace 기능은 이를 자동으로 정리해준다.
- 중간 파일 자동 탐지 및 제거
- 누락된 파일 검출
- 로컬과 서버 상태 비교
4. 클라이언트 기반 선택적 Sync (필터 시스템)
대규모 프로젝트에서는 모든 에셋을 동기화하는 것이 오히려 비효율적이다.
특히 파라곤처럼 고해상도 캐릭터 에셋이 많은 경우
- 불필요한 데이터 다운로드
- VPN 환경에서의 심각한 속도 저하
- 작업 시간 증가
기존에는 Perforce 스트림을 분리하는 방식으로 해결하려 했지만, 브랜치 수가 기하급수적으로 증가하는 문제가 발생했다.
UGS는 이를 클라이언트 측 필터링 방식으로 해결한다.
- 서버에서 전체 목록 조회
- 클라이언트에서 필요한 파일만 선택적으로 sync
- 나머지는 자동 제외
사용자는 UI에서 다음과 같은 필터를 설정할 수 있다.
- 특정 플랫폼 제외 (예: 콘솔, 모바일)
- 특정 지역(Localization) 에셋 제외
이로 인하여
- 브랜치 구조 단순화
- 사용자 맞춤형 워크스페이스 구성
- 네트워크 및 저장공간 최적화
등이 가능해졌다.
5. 프리컴파일 바이너리 배포 (압축 빌드 시스템)
UGS는 프리컴파일된 바이너리 배포 방식을 도입했다.
빌드 서버에서 에디터를 자동으로 빌드
↓
결과물을 ZIP 파일로 압축
↓
해당 파일을 changelist 기준으로 업로드사용자는 다음과 같은 흐름으로 작업한다.
UGS에서 특정 changelist 선택
↓
바이너리 다운로드 및 압축 해제
↓
즉시 실행이 방식의 핵심은 다음과 같다.
- 소스 빌드 없이 바로 작업 가능
- 빌드 환경 불일치 제거
- changelist와 정확히 일치하는 실행 환경 보장
또한 해당 바이너리와 일치하지 않는 변경사항은 UI에서 자동으로 비활성화되어 버전 불일치로 인한 문제를 예방해준다.
해당 포스팅은 참고자료들을 토대로 작성자가 이해한 대로 작성한 글입니다.
잘못된 내용이 있을 수 있으니 주의바랍니다.
문제가 되는 부분을 말씀주시면 확인하는 대로 수정하겠습니다.