언리얼 오토메이션 툴 (Unreal Automation Tool, UAT)
- 언리얼 엔진과 관련된 반복적이고 복잡한 작업들을 자동으로 처리하기 위해 만들어진 C#기반의 커맨드라인 툴.
- 역할
- UAT의 주된 목적은 프로젝트 빌드, 패키징, 배포, 테스트 실행, 컨텐츠 쿠킹 등 다양한 개발 파이프라인 작업을 자동화해서 개발자가 수동으로 해야 하는 반복적인 작업을 줄여준다. 언리얼엔진5부터는 SDK 설치, 개발 키트 플래싱 등 플랫폼 지원 설정에 필요한 대부분의 단계를 UAT를 통해 수행하게 됐다.
- 작동
- C# 스크립트 파일을 실행해서 명령을 수행하는데, 이 스크립트는 내부적으로 UBT를 호출하여 C++ 코드를 컴파일하거나, 에디터의 기능을 사용해서 애셋을 쿠킹하고 패키징하는 등의 작업을 지시할 수 있다.
- 주요 기능 및 사용처
- 빌드 & 패키징 자동화 : 게임을 특정 플랫폼에 맞게 최종 빌드하고, 플레이 가능한 형태로 패키징하는 과정을 자동화한다. 이 과정을통해 게임을 다른 사람들에게 배포할 수 있는 상태로 만든다.
- 컨텐츠 쿠킹 (Content Cooking) : 언리얼 엔진의 애셋들을 각 플랫폼에 최적화된 형식으로 변환하는 작업을 자동화해준다. 게임 실행 시 필요한 애셋만 로드되도록 효율적으로 관리한다.
- 자동화된 테스트 : 게임의 특정 기능이나 전체 게임이 제대로 작동하는지 자동으로 테스트하는 스크립트를 실행할 수 있다. 대규모 프로젝트에서 버그를 조기에 발견하고 수정하는 데 아주 중요.
- 배포 (Deployment) : 빌드된 게임을 테스트 기기나 스토어에 업로드하는 과정까지 자동화할 수 있다.
- CI/CD 파이프라인 통합 : 지속적 통합(CI) 및 지속적 배포(CD). 이런 시스템과 연동되어 코드가 변경될 때마다 자동으로 빌드, 테스트, 배포를 수행하는 핵심 도구로 활용된다.
- 필요한 이유
- 혼자 작은 게임을 만들 때는 에디터에서 런치 버튼만 눌러도 충분하지만, 팀 단위로 복잡한 게임을 개발하거나 여러 플랫폼에 대응해야 할 때는 수동으로 모든 작업을 하는 건 거의 불가능하다. UAT는 이런 반복 작업을 효율적으로 자동화해서 개발자들이 더 중요한 일에 집중할 수 있도록 도와줘서 생산성을 크게 높여준다.
언리얼 헤더 툴 (Unreal Header Tool, UHT)
- 역할
- 언리얼 엔진의 C++ 코드가 실제로 컴파일되기 전에, 내가 만든 C++ 헤더 파일들(.h 파일)을 스캔해서 특별한 정보들을 추출하고, 필요한 코드들을 미리 생성해주는 도구.
- 필요성
- C++은 원래 리플렉션 기능을 기본적으로 제공하지 않는데, UHT가 바로 그 역할을 가능하게 해주는 다리 역할을 한다.
- 작동
- UCLASS(), UFUNCTION(), UPROPERTY(), USTRUCT()와 같은 특별한 매크로들을 찾아내서 해당 코드에 대한 메타데이터(부가 정보)를 생성한다.
- 그리고 이 정보를 바탕으로 .generated.h 파일이나 다른 필요한 C++ 코드들을 자동으로 생성해준다. 이 generated.h 파일 안에는 UPROPERTY나 UFUNCTION같은 매크로들이 컴파일러가 이해할 수 있는 실제 C++ 코드로 변환되어 있다.
언리얼 빌드 툴 (Unreal Build Tool, UBT)
- UBT는 언리얼 엔진 프로젝트 전체의 ‘총괄 지휘자’같은 역할을 한다.
- 역할
- 언리얼 엔진 프로젝트를 구성하는 모든 C++소스 코드를 컴파일하고, 링크해서 최종 실행 파일이나 라이브러리를 만드는 전 과정을 자동화하고 관리하는 도구.
- UHT와의 관계
- UBT가 바로 UHT를 호출해서 헤더 파일들을 전처리하도록 지시한다. UHT가 먼저 작업한 결과를 가지고서 UBT가 이어서 전체 C++코드를 컴파일하고 빌드한다.
- 작동
- 프로젝트 내의 각 모듈마다 있는 .build.cs 파일을 읽어서 모듈 이름, 의존성(어떤 다른 모듈이 필요한지), 빌드 설정(어떤 플랫폼으로 빌드할지, 디버그/릴리즈 버전인지 등)을 파악한다.
- 이 정보를 바탕으로 각 모듈의 C++ 코드를 컴파일러를 이용해서 컴파일하고, 컴파일된 객체 파일들을 링크해서 하나의 실행파일이나 라이브러리로 만들어준다.
UHT, UBT, UAT
- UHT (Unreal Header Tool)
- C++ 헤더 파일을 미리 분석해서 언리얼 엔진의 특별한 매크로들을 리플렉션 시스템이 이해할 수 있는 코드로 변환하고, .generated.h 같은 중간 코드를 생성하는 ‘전처리 및 코드 생성 담당’
- UBT (Unreal Build Tool)
- UHT가 준비한 것을 포함해서 프로젝트의 모든 C++ 코드들을 총괄적으로 컴파일하고 링크해서 실행 파일이나 라이브러리를 만드는 ‘빌드 총괄 지휘자’ 역할
- UAT (Unreal Automation Tool)
- 빌드, 패키지 쿠킹, 테스트 등 언리얼 프로젝트의 반복적인 작업들을 C# 스크립트로 자동화하는 ‘종합 자동화 시스템’ 역할
언리얼 빌드 시스템 (Unreal Build System)
- 언리얼 엔진 프로젝트 빌드를 도와준다.
- 작성한 C++ 코드를 실행 가능한 프로그램으로 만들어주는 전체 과정을 총괄한다.
- 역할 : C++ 소스 코드 파일들을 컴파일하고, 필요한 라이브러리와 링크해서 최종적으로 .exe 파일 같은 실행 파일을 만들어주는 역할을 한다.
- 핵심 : UnrealBuildTool.exe라는 프로그램이 이 시스템의 핵심이다. 이 툴이 각 모듈의 설정 파일(.build.cs 파일)을 읽어서 빌드 과정으로 최적화하고 관리해 준다.
- 주요 기능
- 증분 빌드(Incremental Build) : 변경된 파일만 다시 빌드해서 시간을 절약해준다.
- 핫 리로드(Hot Reload) : 에디터를 끄지 않고도 C++ 코드 변경 사항을 바로 적용할 수 있게 한다.
이 시스템 덕분에 복잡한 빌드 스크립트를 직접 짤 필요 없이, 언리얼 엔진의 규칙에 맞춰 개발하면 엔진이 알아서 빌드 과정을 처리해 준다.UHT는 Unreal Object 기능들을 지원하기 위해 .h 파일 분석 및 generated.h 파일 생성.
- UBT는 언리얼의 모듈 기반 빌드 처리, 프로젝트 파일(ex. sln) 생성 등의 역할.
- 언리얼 빌드 시스템은 Unreal Header Tool(UHT)과 Unreal Build Tool(UBT)로 구성됨.
언리얼 모듈 시스템 (Unreal Module System)
- 언리얼 엔진 프로젝트를 효율적으로 관리하기 위한 단위
- 모듈(Module)
- 개념
- 특정 기능이나 목적을 가진 C++ 코드, 리소스(애셋) 등을 하나로 묶어놓은 논리적인 단위. ex) 게임의 UI 관련 기능들을 모아놓은 모듈, 전투 관련 기능들을 모아놓은 모듈.
- 구조
- 각 모듈은 ModuleName.build.cs 파일을 가지고 있다. 이 파일 안에서 모듈의 이름, 공개할 헤더 파일 경로, 어떤 다른 모듈에 의존하는지, 어떤 외부 라이브러리를 사용하는지 등 빌드에 필요한 모든 설정들을 정의해 놓는다.
- 장점
- 모듈화(Modularization) : 프로젝트를 작은 단위로 나누어 관리하고 개발할 수 있게해서 협업이 쉬어지고 코드의 재사용성이 높아진다.
- 확장성 : 새로운 기능을 플러그인(Plug-in) 형태로 쉽게 추가하고 제거할 수 있다. 언리얼 엔진에서는 이 모듈 시스템을 기반으로 소스코드와 플러그인 구조를 직접 제작할 수 있다.
- 관리 용이성 : 각 기능별로 분리되어 있어서 특정 기능을 수정하거나 추가할 때 다른 부분에 미치는 영향을 최소화할 수 있다.
- 언리얼에서 관리되는 빌드 결과 파일(.dll, .lib)을 일컫는다.
- 개념
프로젝트 폴더 > Source 폴더 내에 있는 폴더들은 모두 모듈 폴더이다..Build.cs 파일에는 해당 모듈의 종속성과 필요한 라이브러리, 인클루드 경로 등이 적혀있다주 게임 모듈 (Primary Game Module) : 메인 게임 로직이 포함된 모듈.
- 주 게임 모듈에 필요한 다른 모듈들을 포함시키면서 게임을 개발하게 된다.
- 게임 모듈 (Game Module) : 소스코드에 게임 로직이 포함된 모듈.
- 각 모듈 폴더에는 .Build.cs 파일이 하나씩 있다.
- 언리얼 빌드 시스템과 언리얼 모듈 시스템의 관계
- 모듈 시스템은 언리얼 프로젝트의 ‘설계도’이자 ‘구조’를 담당한다. 어떤 코드들이 어떤 기능으로 묶여 있고, 서로 어떻게 연결되는지 정의한다.
- 빌드 시스템은 그 설계도를 바탕으로 정의된 각 모듈들을 빠르고 효율적으로 공사해서 최종 건물을 완성하는 역할을 한다.
- 모듈 시스템으로 게임의 기능을 논리적으로 잘 분리해 놓으면, 빌드 시스템이 그 모듈들을 알아서 잘 엮어서 하나의 게임으로 만들어 준다!!