DOTY

TSubclassOf vs TObjectPtr 본문

Unreal Engine

TSubclassOf vs TObjectPtr

증식세포 2024. 4. 19. 15:40
728x90
반응형

TSubclassOf

타입 정보 저장: 

TSubclassOf<T>는 특정 클래스 T의 서브클래스를 참조하기 위한 포인터 유형.

클래스 타입 자체를 참조하는 것으로, 인스턴스가 아닌 클래스의 템플릿을 나타냄.

즉, 이를 통해 T의 인스턴스를 생성할 때 사용할 수 있는 특정 서브클래스의 타입을 지정 가능


클래스 템플릿 역할:

이는 인스턴스를 직접 포함하는 것이 아니라, 그 인스턴스를 생성할 수 있는 클래스의 타입 정보를 보유.

따라서, 다양한 서브클래스 중에서 어떤 클래스가 인스턴스로 생성될지를 결정하는 데 사용


TObjectPtr

실제 객체의 인스턴스 참조:

TObjectPtr<T>는 객체의 실제 인스턴스를 참조하기 위해 사용

이는 실행 시점에서 특정 객체를 가리키며, 이 객체는 메모리에 이미 할당되어 있어야 한다.


메모리 관리:

Unreal Engine 5에서 도입된 TObjectPtr는 자동으로 객체의 생명 주기를 관리하고 객체가 유효한지를 보장하는 스마트 포인터.

가비지 컬렉션과 호환되며, 해당 객체에 대한 안전한 참조를 제공합니다.

(이전에는 AT* T; 와 같이 사용했다.)

 

 

예시 : 게임 내 다양한 HUD (Head-Up Display) 사용


1. TSubclassOf 사용
목적: 게임 내에서 사용할 수 있는 다양한 HUD 타입 중 하나를 선택하고 설정하기 위함.
시나리오: 게임에서는 플레이어의 캐릭터 타입에 따라 다른 HUD를 보여줄 수 있다. 예를 들어, 전사, 마법사, 궁수 등의 캐릭터 클래스마다 다른 HUD를 표시가 가능하다.

// .h 파일
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HUD")
TSubclassOf<class UMyHUDWidget> HUDWidgetClass;

// .cpp 파일
void AMyPlayerCharacter::BeginPlay()
{
    // HUDWidgetClass는 에디터에서 선택된 HUD 위젯의 클래스를 참조
    if (HUDWidgetClass != nullptr)
    {
        UMyHUDWidget* MyHUD = CreateWidget<UMyHUDWidget>(GetWorld(), HUDWidgetClass);
        MyHUD->AddToViewport();
    }
}


HUDWidgetClass는 에디터를 통해 각 캐릭터 클래스에 맞는 HUD 위젯 클래스로 설정될 수 있으며, 게임 플레이가 시작될 때 해당 HUD 위젯 인스턴스를 생성하고 뷰포트에 추가.

2. TObjectPtr 사용
목적: 실제로 생성된 객체 인스턴스에 대한 참조를 유지하고, 게임 로직에서 이 객체를 직접 사용하기 위함.
시나리오: 생성된 HUD 위젯에 특정 정보를 업데이트하거나 상태를 변경해야 할 때.

// .h 파일
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="HUD")
TObjectPtr<UMyHUDWidget> ActiveHUDWidget;

// .cpp 파일
void AMyPlayerCharacter::UpdateHealth(int NewHealth)
{
    if (ActiveHUDWidget != nullptr)
    {
        ActiveHUDWidget->SetHealth(NewHealth);
    }
}


ActiveHUDWidget은 실제로 화면에 표시되고 있는 HUD 위젯의 인스턴스를 참조.

플레이어의 체력이 변경될 때, UpdateHealth 함수를 통해 HUD에 새로운 체력 값을 업데이트할 수 있다.

TSubclassOf는 어떤 클래스의 객체를 생성할지 결정하는 데 사용되며, 게임 설정이나 개발자의 요구에 따라 다양한 구현을 가능하게 한다.
TObjectPtr는 생성된 객체 인스턴스에 대한 참조를 제공하며, 이를 통해 실행 시간에 객체를 효율적으로 사용하고 관리할 수 있다.

728x90
반응형
Comments