DOTY
TSubclassOf vs TObjectPtr 본문
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는 생성된 객체 인스턴스에 대한 참조를 제공하며, 이를 통해 실행 시간에 객체를 효율적으로 사용하고 관리할 수 있다.
'Unreal Engine' 카테고리의 다른 글
InitializeComponent vs BeginPlay (0) | 2024.04.19 |
---|---|
3D 모델 구하는 곳 (0) | 2024.03.15 |
Error) UE5. the following modules are missing or built with a different engine version (0) | 2023.04.09 |