1-5강 Unreal Reflection System#1

Ryan Ham·2024년 7월 3일
0

이득우 Unreal

목록 보기
12/23

Unreal Reflection System

Unreal의 Reflection은 프로그램이 실행시간에 자기 자신을 조사하는 기능이다. 이는 엄청나게 유용하고, Unreal Engine 기술의 근간을 이룬다(<- 실제로 언리얼 관계자가 한말!).

UPROPERTY(EditAnywhere, Category = Pawn)

Reflection 시스템은 옵션이다. Reflection 시스템에 등록하기 위해서는 위 코드와 같이 관련 변수나 함수 위에 UENUM(), UCLASS(), USTRUCT(), UFUNCTION(), UPROPERTY()와 같은 macro들을 작성해주면, UHT(Unreal Header Tool)가 그 프로젝트를 컴파일할때 해당 정보를 수집한다.

여기서 “EditAnywhere, Category = Pawn”와 같은 정보를 metadata라고 하는데, 이런 metadata들은 에디터와 직접 연동해서 우리가 게임을, 실제 콘텐츠를 제작할 때 활용한다.

모든 변수가 언리얼의 Reflection system에 등록될 필요는 없다. 하지만, reflection된 property가 아닌 것은 해당 reflection에 의존하는 시스템 전부테 보이지 않는다는 점만 주의하자. 참고로, UObject 타입이라고 해서 reflection에 등록되는 것이 아니라 위에서 설명한 macro를 붙여주어야 드디어 reflection system에 등록이 되는 것이다.

Reflection system에 접근하는 방법

Reflection system에 접근하는 방법은 StaticClass()GetClass()통해 가능하다. Compiletime에는 StaticClass(), Runtime에는GetClass()를 사용.

// StaticClass로 접근
#include "MyReflectedObject.h"

// Accessing class information at compile-time
void AccessReflectionAtCompileTime()
{
    // Using StaticClass() to get UClass pointer
    UClass* Class = UMyReflectedObject::StaticClass();

    if (Class)
    {
        UE_LOG(LogTemp, Log, TEXT("Class Name: %s"), *Class->GetName());
        UE_LOG(LogTemp, Log, TEXT("Is Blueprintable: %d"), Class->HasAnyClassFlags(CLASS_Blueprintable));
    }
}

StaticClass() is used at compile-time to get the UClass object representing the class type. This is a static method generated by the Unreal Header Tool (UHT) for all reflected classes.

// GetClass로 접근
#include "MyReflectedObject.h"

// Accessing class information at runtime
void AccessReflectionAtRuntime()
{
    // Creating an instance of UMyReflectedObject
    UMyReflectedObject* MyObject = NewObject<UMyReflectedObject>();

    if (MyObject)
    {
        // Using GetClass() to get UClass pointer
        UClass* Class = MyObject->GetClass();

        if (Class)
        {
            UE_LOG(LogTemp, Log, TEXT("Class Name: %s"), *Class->GetName());
            UE_LOG(LogTemp, Log, TEXT("Is Blueprintable: %d"), Class->HasAnyClassFlags(CLASS_Blueprintable));
        }
    }
}

GetClass() is used at runtime to get the UClass object of an instance of the class. This method can be used on any UObject instance to get its class type.


언리얼 오브젝트의 구성(중요!)

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

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

모든 Unreal 오브젝트는 클래스(UClass) 정보와 함께 한다.

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

일반 객체는 new로 동적 할당을 한다면 Unreal 시스템에서는 NewObject()로 동적 할당을 한다.


CDO(Class Default Object)

  • CDO는 언리얼 객체가 가진 기본 값을 보관하는 template 객체

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

  • CDO는 UClass 정보로부터 GerDefaultObject()를 통해 접근 가능.

  • CDO의 생성 시점은 엔진이 초기화 되는 시점이다. 즉, CDO가 다 만들어지고 우리가 에디터의 UI를 성공적으로 본다고 생각하면 된다.


언리얼 오브젝트 처리

Reference 자동 업데이트

  • AActor 또는 UActorComponent가 소멸되거나 다른 식으로 플레이에서 제거되면, reflection 시스템에 보이고 있는 그에 대한 모든(TArray 같은 언리얼 엔진 컨테이너 클래스에 저장된 포인터와 UProperty 포인터 등의) reference는 자동으로 null이 된다. … 여기서 한가지 중요한 점은, 이 기능은 UPROPERTY로 마킹되어 있거나 언리얼 엔진 컨테이너 클래스에 저장된 UActorComponent 또는 AActor reference에만 적용된다는 점이다.

직렬화(Serialization)

  • Unreal 오브젝트 객체를 우리가 지정된 포맷에 맞게 저장하거나 불러들이는 것을 일관적으로 진행할 수가 있는데, 이 저장되는 정보들은 우리가 UPROPERTY라는 것으로 명시를 해줘야 이것들만 Unreal 오브젝트에서 빼내가지고 자동으로 디스크에 저장하고 불러들일 수가 있게 된다.

Garbage Collection

  • 더 이상 사용되지 않는 언리얼 오브젝트는 언리얼 시스템이 자동으로 회수해서 메모리에서 회수한다.

Network replicaiton

  • 직렬화와 유사한 기능. 네트워크 통신에 대해서도 UPROPERTY로 지정한 객체들에 대해서 자동으로 전송하고 받을 수 있는 언리얼 시스템

최종 정리

  • 언리얼 오브젝트에는 항상 클래스 정보를 담은 UClass 객체가 매핑되어 있다.
  • UClass로부터 언리얼 오브젝트의 정보를 파악할 수 있다.
  • UClass에는 CDO가 연결되어 있어 이를 활용해 개발의 생산성을 향상시킬 수 있다.
  • 클래스 정보와 CDO는 엔진 초기화 과정에서 생성되므로 게임 개발에서 안전하게 사용 가능.

tip : header 정보를 변경하거나 생성자 정보를 변경하면 editor를 끄고 컴파일 할 것!


기타

2014년도에 작성된 UE Reflection에 관한 글 [링크]

profile
🏦KAIST EE | 🏦SNU AI(빅데이터 핀테크 전문가 과정) | 📙CryptoHipsters 저자

0개의 댓글