완벽한 정보는 아닐 수 있다. 개발하면서 겪은 시행착오를 통해 얻은 내용을 정리한 글이다.
1. TSubclassOf
주로 이 타입으로 선언하는 변수는 BP를 불러올 때 사용한다.
예를 들어, UI를 만들 때 BP로 만든 위젯 BP를 불러와서 사용하고 싶을때 사용한다.
- PlayerController에 아래와 같은 변수를 선언하고
TSubclassOf<UUserWidget> HUDWidgetClass;
- 생성자에서 아래와 같이 BP를 불러와서 사용할 수 있다.
static ConstructorHelpers::FClassFinder<UUserWidget>HUDWidgetBP(TEXT("/Game/HJ/UI/WBP_HUD.WBP_HUD_C"));
if (HUDWidgetBP.Succeeded())
{
HUDWidgetClass = HUDWidgetBP.Class;
}
- 이후 우리가 코드로써 작업하기 편하기 위해 ~instance 라는 변수도 추가하여 CreateWidget을 하여 생성한 실체를 가지도록 한다.
//헤더
TObjectPtr<UUserWidget> HUDWidgetInstance;
//cpp
{
if (HUDWidgetClass)
{
HUDWidgetInstance = CreateWidget<UUserWidget>(this, HUDWidgetClass);
if (HUDWidgetInstance)
{
HUDWidgetInstance->AddToViewport();
bShowMouseCursor = false;
SetInputMode(FInputModeGameOnly());
ADefaultGameState* DefaultGameState = GetWorld() ? GetWorld()->GetGameState<ADefaultGameState>() : nullptr;
if (DefaultGameState)
{
DefaultGameState->UpdateHUD();
}
}
}
}
또한 BP로 만든 액터를 가져올 때 아래와 같이 사용할 수 있다.
- TSubclassOf로 선언한 변수를 UPROPERTY를 통해 디테일 창에서 볼 수 있게 만들면, BP에서 클래스를 지정할 수 있게 된다.
- 이후 아래와 같이 생성할 수 있다.
TSubclassOf<AWeaponShell> WeaponShellClass;
AWeaponShell* ShellActor = GetWorld()->SpawnActor<AWeaponShell>(WeaponShellClass, ShellLocation, ShellRotation, SpawnParams);
2. StaticClass
우리가 동적으로 생성하고 싶은 클래스가 액터를 상속받아 만든 클래스 일때 사용할 수 있다.
특히 C++로만 동작을 하도록 할 때 사용한다.
결론적으로 StaticClass()는 클래스 타입을 반환하는 역할을 한다.
주로 클래스의 인스턴스를 생성하거나 리플렉션을 통해 클래스에 대한 정보를 동적으로 가져올 때 사용한다.
위에서 언급한 TSubclassOf와 차이점은 아래와 같이 사용한다는 점이다.
- 변수를 따로 선언하지 않고,
- StaticClass를 통해 정보를 가져오고, 동적으로 객체를 생성할 수 있게 해준다.
- 참고) SpawnActor 함수의 첫번째 인자 파라메터 타입이 UClass* 이다.
AWeaponShell* ShellActor = GetWorld()->SpawnActor<AWeaponShell>(AWeaponShell::StaticClass(), ShellLocation, ShellRotation, SpawnParams);
'Unreal Engine' 카테고리의 다른 글
Unreal Engine - 애님 몽타주 (0) | 2025.03.05 |
---|---|
Unreal Engine - 캐릭터 앉기 및 구르기 (0) | 2025.03.05 |
Unreal Engine - 총기 반동, 데칼, 탄피 효과 (0) | 2025.02.27 |
UE5 Issues : 총기 스폰 및 포인터 (0) | 2025.02.27 |
UE5 Issues : 인벤토리 UI (0) | 2025.02.26 |