[언리얼] 언리얼 빌드 과정 이해(UBT,UHT)

윤태웅·2023년 8월 30일
3

언리얼 엔진

목록 보기
5/5
post-thumbnail

개요

언리얼 c++ 빌드 과정

Unreal Build Tool

Unreal Build Tool은 무엇인가

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

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

이다. 언리얼 엔진을 빌드할 때 UnrealBuildTool도 C#컴파일러를 이용해서 같이 빌드된다.

Unreal Build Tool 동작 방식

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

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

build.cs는 빌드 옵션을 관리한다.(PCH를 사용할 것인지, 외부 모듈을 사용할 것인지 등등)
target.cs는 빌드 타입을 정의한다.(어떤 모듈들을 빌드에 포함시킬것인지, 어떤 타입의 빌드 결과물을 만들어낼 것인지(dll,exe))
https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Networking/HowTo/DedicatedServers/
위 링크는 DedecatedServer용 target.cs를 새로 만드는 방법을 소개한 언리얼 공식 글인데, target.cs를 이해하기 좋아서 링크로 남겨놓는다.

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

Unreal Build Tool의 존재 이유

언리얼은 멀티 플랫폼에서 개발(윈도우,리눅스,맥)가능하고 멀티 플랫폼 빌드(playstation,XBOX,Windows,Mac)를 목표로 하는 게임엔진이다.
이 목적을 달성하기 위해서 빌드과정을 유연하게 프로그래밍 할 수 있는 툴이 필요해졌을 것이고 자연스럽게 UBT의 형태로 구현되었다고 할 수 있다.

Unreal Build Tool이 C++가 아닌 C#코드를 실행하는 이유

https://stackoverflow.com/questions/54714116/why-does-unreal-engine-use-c-sharp-to-provide-some-functionality-and-features-l
위 글에 따르면, UBT같이 런타임에 실행되는 프로그램이 아니라 컴파일 타임에 실행되는 프로그램인 경우 성능상 느린게 크게 문제가 되지 않기 때문에, 복잡한 C++보다는 개발 편의성이 보장된 C# .NET프레임워크로 개발을 한 것 같다는 의견을 볼 수 있다.
맞는 말 같다.

Unreal Build Tool이 실행되는 시기

.uproject 실행할때, VS의 .sln파일에서 솔루션 빌드할 때

Unreal Header Tool

Unreal Header Tool은 무엇인가?

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

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

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

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

Unreal Header Tool 동작방식

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

#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++컴파일러 실행

0개의 댓글

관련 채용 정보