리얼 개발

[UE5] 언리얼 빌드 시스템 본문

Unreal Engine5

[UE5] 언리얼 빌드 시스템

econo-my 2024. 9. 12. 11:16

Unreal Build System 은 언리얼 엔진 빌드 프로세스를 자동화시키는 툴 모음을 말한다. 일반적인 수준에서 Unreal Build Tool과 Unreal Header Tool 은 언리얼 빌드 시스템을 지원한다.

 

 

Unreal Build Tool (UBT)

UBT는 언리얼 프로젝트 C++ 소스들의 빌드 과정을 총괄하는 프로그램이다. 바이너리 파일 위치는

(언리얼 버전)\\Engine\\Binaries\\DotNET\\UnrealBuildTool\\UnrealBuildTool.exe

다음과 같으며 언리얼 엔진을 빌드할 때 Unreal Build Tool도 C# 컴파일러를 이용해서 같이 빌드된다.

 

Unreal Build Tool 동작 방식

언리얼 기본 C++ 프로젝트를 생성하면 다음 3개의 C# 파일이 프로젝트에 같이 생성된다.

(프로젝트명).build.cs
(프로젝트명).target.cs
(프로젝트명Editor).target.cs

build.cs는 빌드 옵션을 관리한다.(PCH를 사용할 것인지, 외부 모듈을 사용할 것인지 등등)

target.cs는 빌드 타입을 정의한다.(어떤 모듈들을 빌드에 포함시킬것인지, 어떤 타입의 빌드 결과물을 만들어낼 것인지(dll,exe))

 

비주얼 스튜디오의 상단 툴바를 보면 개발버전 설정이 있다.

Editor로 끝나는 설정은 에디터용 dll 파일을 생성하는 구성이고, Editor가 없는 설정은 게임 패키지용 exe파일을 생성하는 구성이다. 두 가지 구성을 위해 두 개의 target.cs 파일을 구비해놓은 것으로 보인다.

 

.uproject를 실행하거나 .sln 프로젝트에서 build 명령을 내리면 UBT 프로그램이 실행되면서 언리얼 프로젝트의 build.cs, target.cs 파일들이 C# 컴파일러에 의해 컴파일된다. 그 후 .cs 파일에 작성한 사양대로 빌드과정이 진행된다.

 

자세히 알아보자면 UBT가 실행되면 먼저 프로젝트의 Source 폴더를 찾아 Target.cs 파일을 조사하면서 하위에 모듈이 있는지 검사한다. UBT가 Source 폴더의 조사를 끝내면, Intermediate 폴더 안의 ProjectFiles 폴더에 자신이 조사한 언리얼 소스 구조를 정리해 프로젝트 파일을 생성함과 동시에 언리얼 엔진 설치 폴더로부터 소스 코드에 대한 프로젝트 파일도 복사해온다. 마지막으로 이 둘을 합친 솔루션 파일을 프로젝트 폴더에 생성해, 바로 프로그래밍 할 수 있도록 편의를 제공해준다.

 

Unreal Build Tool 의 존재 이유

UBT는 추상적인 소스 코드 구조를 만들고, 이를 기반으로 플랫폼에 맞게 프로젝트를 재생성한다. 언리얼 엔진 4부터는 개발 환경이 맥, 윈도우 두 가지 플랫폼을 지원하도록 설계되었다. 하지만 두 플랫폼의 개발 환경(IDE) 가

 

맥 - 엑스코드(XCode)

윈도우 - 비주얼 스튜디오(Visual Studio)

 

로 나뉘었고, 이 툴들은 서로 다른 체계로 프로젝트를 관리했다. 이러다 보니, 추상적인 소스 코드 구조를 만들고 이를 기반으로 플랫폼에 맞게 프로젝트를 재생성하는 기능이 필요하게 되었다. 즉, 여러 플랫폼에서 언리얼을 통해 개발을 진행할 수 있도록 UBT가 실행되면 현재 프로젝트의 폴더 구조와 소스 파일들을 분석하고 현재 작업하는 플랫폼에 맞게 개발 도구 환경을 자동으로 생성해주는 역할이다.

 

Unreal Build Tool 이 실행되는 시기

.uproject 파일을 통해 실행할 때, VS의 .sln 파일에서 솔루션 빌드할 때,
Generate Visual Studio project files 메뉴를 선택할 때

 

Unreal Header Tool (UHT)

언리얼 헤더 툴은 언리얼의 C++코드들을 컴파일 하기 전에 모든 .h헤더파일들을 순회하면서 언리얼 리플렉션 시스템에 필요한 정보들을 읽어들인 후 .generated.h파일과 .gen.cpp파일을 Intermediate폴더에 생성하는 소프트웨어이다.

바이너리 파일 위치는 다음과 같다

(언리얼 버전)\\Engine\\Binaries\\DotNET\\UnrealBuildTool\\EpicGames.UHT.dll

exe파일이 아니라 dll파일인 것에서 알 수 있듯이 독립적으로 실행되는 프로그램이 아니라 UBT같은 다른 프로그램의 모듈방식으로 포함되는 프로그램이다.

 

Unreal Header Tool 동작방식

UHT 하는 일을 구체적으로 예를 들어보자면 다음과 같은 헤더파일이 있다면

#pragma once

#include "CoreMinimal.h"
#include "AbilitySystem/Abilities/UBaseGameplayAbility.h"
#include "UGameplayAbility_AutoAttack.generated.h"/**
 *
 */
UCLASS()
class CREDERE_API UGameplayAbility_AutoAttack : public UBaseGameplayAbility
{
	GENERATED_BODY()
public:
	UGameplayAbility_AutoAttack();

	virtual bool CanActivateAbility(
		const FGameplayAbilitySpecHandle Handle,
		const FGameplayAbilityActorInfo* ActorInfo,
		const FGameplayTagContainer* SourceTags = nullptr,
		const FGameplayTagContainer* TargetTags = nullptr,
		OUT FGameplayTagContainer* OptionalRelevantTags = nullptr
	) const override;

	virtual void ActivateAbility(
		const FGameplayAbilitySpecHandle Handle,
		const FGameplayAbilityActorInfo* ActorInfo,
		const FGameplayAbilityActivationInfo ActivationInfo,
		const FGameplayEventData* TriggerEventData
	) override;

	virtual void EndAbility(
		const FGameplayAbilitySpecHandle Handle,
		const FGameplayAbilityActorInfo* ActorInfo,
		const FGameplayAbilityActivationInfo ActivationInfo,
		bool bReplicateEndAbility,
		bool bWasCancelled
	) override;
private:
	UFUNCTION()
	void AttackRepeat(int32 ActionNumber);

	void Attack();
	void ApplyDamageGameplayEffectToOpponent(AActor* OverlappedOpponent);
	void RotatePlayerToOpponent(const AActor* OverlappedOpponent) const;
	void PlayAttack1Montage() const;
private:
	TSubclassOf<UGameplayEffect> GE_DamageBPClass;

	UPROPERTY(VisibleAnywhere)
	TObjectPtr<class ATriggerDetector> TriggerDetector;

	TObjectPtr<class UAbilityTask_Repeat> RepeatAbilityTask;
	float AutoAttackInterval;
	FDateTime LastAttackTime;

};

프로그래머가 빌드를 시작하면 UBT이 실행이 되고 UBT은 c++컴파일러 실행전에 UHT(Unreal Header Tool)을 실행한다. UHT은 이 헤더파일을 Parsing하고

UGameplayAbility_AutoAttack.generated.h
UGameplayAbility_AutoAttack.gen.cpp

위 두 파일에 UPROPERTY, UFUNCTION, UCLASS매크로 선언된 정보들을 저장하는 역할을 수행한다. 이 과정이 마무리되면 UHT의 작업은 끝나게 되고 일반 c++컴파일러가 UHT이 생성한 코드를 포함해서 c++컴파일을 수행한다.

 

Unreal Header Tool 존재 이유

언리얼은 일반적인 C++프로그램들과 다르게 자체적으로 리플렉션 시스템을 구현하기 위해서UCLASS(),UPROPERTY(),UFUNCTION() 등의 매크로를 사용하는데 이 매크로를 해석해서 c++컴파일러가 알아들을 수 있게 코드를 재생성(.generated.h , .gen.cpp) 해주는 작업이 필요하기 때문이다.

 

Unreal Header Tool 실행 시기

프로그래머 빌드 명령 - UBT 실행 - .build.cs, .target.cs 컴파일 - UHT 실행 - C++ 컴파일러 실행

Unreal Build System 은 언리얼 엔진 빌드 프로세스를 자동화시키는 툴 모음을 말한다. 일반적인 수준에서 Unreal Build Tool과 Unreal Header Tool 은 언리얼 빌드 시스템을 지원한다.

 

 

 

'Unreal Engine5' 카테고리의 다른 글

[UE5] AIPerception  (1) 2024.11.05
[UE5] 모션워핑과 풀바디 IK  (0) 2024.10.16
[UE5] 무기 선택 창으로 무기 교체하기  (0) 2024.09.11
[UE5] Vector 클래스 분석  (0) 2024.09.04
[UE5] 보간 함수를 이용한 회전  (1) 2024.09.02