게임 개발/Unreal

언리얼 오브젝트 리플렉션 시스템 I

신정훈 2024. 1. 27. 14:05

리플렉션 시스템

  • 프로그램 실행 시간에 객체의 정보를 조사할 수 있는 기능.
  • 언리얼 엔진의 기능과 에디터 기능 구축의 근간
  • C++ 자체는 리플렉션을 지원하지 않아 언리얼 엔진이 이를 구현한다.

언리얼 엔진에서는 일반 c++객체와 언리얼 오브젝트 객체 두가지로 나눌 수 있으며, 리플렉션 시스템을 옵션으로 필요에 따라 선택적으로 사용할 수 있다.

 

언리얼 엔진의 UHT는 프로젝트를 컴파일하기 전에 관련된 헤더 파일과 cpp 파일을 분석한다. 이 과정에서 생성된 정보는 generated.h 라는 특수한 파일에 저장된다. 이 파일에는 리플렉션 시스템에 대한 정보도 포함되어 있습니다.

언리얼 엔진에서 기본 오브젝트를 생성할 때, generated.h 는 자동으로 포함된다. 이 특수 헤더 파일은 언리얼 엔진 헤더 툴이 리플렉션 시스템을 위해 필요한 정보를 관리하는 데 필수적이다.

사용자는 특정 객체에 대해 UCLASS(), USTRUCT(), UENUM(), UINTERFACE()와 같은 매크로를 사용하여 리플렉션 시스템에 해당 객체를 포함시킬 수 있다.

이 매크로들은 언리얼 엔진 헤더 툴이 객체를 인식하고, 필요한 리플렉션 시스템을 위한 소스코드를 자동으로 생성하는데 사용됩니다. 

 

UPROPERTY 매크로는 클래스의 멤버 변수에 사용되며, 이 변수는 프로퍼티로 정의된다.(언리얼 엔진의 리플렉션 시스템에 의해 추적되고 런타임에 클래스의 정보를 조회하고 수정할 수 있는 기능을 제공한다) 

 

추가적인 메타데이터: UPROPERTY 매크로는 변수에 대한 추가적인 메타데이터를 제공한다. 이 메타데이터는 변수가 어떻게 사용되어야 하는지, 어떤 범위의 값이 유효한지, 에디터에서 어떻게 표시될지 등의 정보를 포함할 수 있다.

예: UPROPERTY(EditAnywhere, Category=Pawn) EditAnywhere은 에디터 내에서 어디에서든 이 속성을 편집할 수 있음을 의미하고 Category=Pawn은 이 속성이 Pawn 카테고리에 속함을 나타낸다.

 

에디터 내 시각화: UPROPERTY로 정의된 프로퍼티는 언리얼 엔진의 에디터에서 시각적으로 표시되고, 사용자가 직접 조작할 수 있다. 예를 들어, 변수를 에디터의 인스펙터창에서 볼 수 있게 하고, 그 값을 변경할 수 있다.

 

메모리 관리: UPROPERTY로 표시된 변수는 언리얼 엔진의 가비지 컬렉션 시스템에 의해 자동으로 메모리 관리가 됩니다. 이는 특히 포인터와 같이 동적으로 할당된 메모리를 사용하는 경우 중요하다.

 

리플렉션 시스템에 대한 계층구조

 

UField

UStruct

UClass (C++ class)

UScriptStruct (C++ struct)

UFunction (C++ function)

UEnum (C++ enumeration)

UProperty (C++ member variable or function parameter)

 

UField

  • 언리얼 엔진에서 모든 메타데이터 타입의 기본 클래스이다.
  • 필드의 공통적인 특성을 정의한다.
  • 구체적인 데이터 구조를 정의 하지 않으며, 추상적인 수준으로 존재한다.

 

UStruct

  • UField를 상속받으며, 좀더 구체적인 데이터 구조를 정의한다.
  • 구조체, 클래스, 인터페이스와 같은 복잡한 데이터 타입을 표현할 수 있다.
  • 클래스의 구조와 멤버 변수등을 나타낸다.
  • 언리얼 엔진의 리플렉션 시스템에서 대부분의 타입은 UStruct를 통해 정의되고 관리된다.

 

UClass

  • UStruct를 상속받으며, 언리얼 오브젝트를 정의하는 클래스에 해당한다.
  • UClass는  UStruct의 기능에 함수 정보를 추가하여 전체 클래스 정보를 구축한다.
  • 인스턴스화 할 수 있는 실체를 정의한다.
  • UClass는 StaticClass함수 혹은 Get 클래스라는 함수를 사용하여 해당 클래스의 인스턴스나 메타데이터에 접근할 수 있다.

 

언리얼 오브젝트의 구성

 

언리얼 오브젝트에는 특별한 프로퍼티와 함수를 지정할 수 있다.

  • 관리되는 클래스 멤버 변수: UPROPERTY
  • 관리되는 클래스 멤버 함수: UFUNCTION
  • 에디터와 연동되는 메타데이터를 심을 수 있다.

모든 언리얼 오브젝트는 클래스 정보와 함께 한다.

  • 클래스를 사용해 자신이 가진 프로퍼티와 함수 정보를 컴파일 타임과 런타임에서 조회할 수 있다.

 

이렇게 다양한 기능을 제공하는 언리얼 오브젝트는 언리얼 오브젝트는 NewObjectAPI를 사용해 생성해야 한다.

 

언리얼 오브젝트의 클래스 기본 오브젝트

 

언리얼 클래스(UClass) 정보에는 클래스 기본 오브젝트(Class Default Object)가 함께 포함되어 있다.

클래스 기본 오브젝트는 줄여서 CDO라고 부른다.

CDO는 언리얼 객체가 가진 기본 값을 보관하는 템플릿 객체이다.

한 클래스로부터 다수의 물체를 생성해 게임 콘텐츠에 배치할 때 일관성 있게 기본 값을 조정하는데 유용하게 사용된다.

CDO는 클래스 정보로부터 GetDefaultObject 함수를 통해 얻을 수 있다.

UClass 및 CDO는 엔진 초기화 과정에서 생성되므로 콘텐츠 제작에서 안심하고 사용할 수 있다.

 

언리얼 오브젝트(UObject)의 처리

 

클래스, 프로퍼티, 함수에 적합한 매크로로(UClass, UProperty, UFunction) 마킹해 주면 언리얼 엔진이 접근할 수있어, 다수의 내부적인 처리기능을 구현할 수 있다.

 

#이득우의 언리얼 프로그래밍 Part1