게임 엔진/Unreal

[Unreal] 언리얼 오브젝트

겜도리도리 2023. 12. 22. 16:24
반응형

앞서

이 포스팅은 이득우의 언리얼 프로그래밍 Part1을 수강하고 작성한 내용입니다.

 

개요

C++과 C#이나 JAVA와 같은 하이레벨 언어를 비교하면 다음과 같다.

 

C++의 특징

메모리를 직접 제어

캐시 활용 극대화

저수준 API 호출

복사 작업 최소화

 

하이레벨 언어의 특징

유지보수성 향상

크래시로부터 보호

자동 메모리 관리

고질적 실수 예방

 

언리얼 오브젝트

언리얼 C++은 C++의 특징을 가지면서도 하이레벨 언어의 장점을 흡수하고자 했다.

이런 내부적인 기능을 자동으로 만들어질 수 있도록 UClASS() 매크로를 사용해줘야 한다.

UCLASS()에는 클래스를 정의하는 프로퍼티와 함수 세트가 들어있다.

 

언리얼에서는 일반 C++ 오브젝트와 언리얼 오브젝트 모두 사용 가능하다. 일반 C++ 오브로젝트에는 접두사 F, 언리얼 오브젝트는 접두사 U를 사용한다.

일반적인 C++ 객체는 new로 생성하고 오브젝트 생성 시에는 NewObject로 생성한다.

 

언리얼 오브젝트에는 다음과 같은 기능이 제공된다.

가비지 컬렉션

레퍼런스 업데이트

리플렉션

시리얼라이제이션

자동 프로퍼티 초기화

자동 에디터 통합

네트워크 리플리케이션

 

실제 구현

UObject를 상속받는 새로운 C++ 클래스 MyObject를 만들면 헤더의 내용은 다음과 같다.

 

CoreMinimal과 UObject/NoExportTypes는 언리얼 오브젝트가 되기 위해서 기본적으로 포함해야 하는 헤더들이다.

 

클래스 위에는 앞서 언급되었듯 내부적인 기능을 자동으로 만들기 위해 UCLASS() 매크로를 사용해주어야 한다.

 

프로젝트이름_API는 다른 곳에서 MyObejct를 사용할 수 있도록 해준다.

삭제한다면 다른 모듈에서 MyObject를 참조할 수 없고 모듈 내에서 밖에 사용할 수 없게 된다.

 

GENERATED_BODY() 매크로가 있는데 선언을 따라가 보면 아래와 같다.

 

다시 BODY_MACRO_COMBINE으로 들어가 보면 BODY_MACRO_COMBINE_INNER로 연결되는데, 선언은 다음과 같다.

 

BODY_MACRO_COMBINE은 매크로가 가지고 있는 토큰을 사용해 인자 A( CURRENT_FILE_ID ), B( 언더바 ( _ ) ), C( 현재 라인 정보 ), D( GENERATED_BODY )를 묶어 긴 문자를 만든다.

 

generated.h

이렇게 만들어진 문자는 generated.h 파일에서 쓰인다. 일반적으로 만든 C++ 클래스는 Source폴더 안에 있는데 generated.h 파일 같은 경우에는 Intermediate - Build - Win64 - UnrealEditor - Inc - 프로젝트명 - UHT에 있다.

 

generated.h파일을 보면 아까 인자 A로 쓰였던 CURRNET_FILE_ID 매크로를 확인할 수 있다.

 

인자 A, B, C, D가 모두 합쳐져 만들어진 문장은 위와 같이 된다.

 

 

앞서 봤던 문장들이 또 다른 복잡한 매크로 문장으로 되어 있는데, 이러한 코드들은 언리얼 엔진이 자동으로 객체지향 설계를 위해 제공되는 여러 기능들을 생성해 주는 데 사용된다.

 

정리

언리얼 엔진에서 소스 코드를 컴파일하면 바로 컴파일되는 것이 아니라 코드를 분석하는 단계가 먼저 있고, 언리얼 헤더툴(UHT)이 코드를 분석하면서 헤더의 매크로들을 참조해 generated.h 파일을 자동으로 생성한다. generated.h 파일은 Unreal Object가 언리얼 엔진의 다양한 기능이 지원될 수 있도록 한다.

반응형