TSoftObjectPtr
와 TSubclassOf
는 Unreal Engine에서 애셋과 클래스를 참조하는 데 사용되는 두 가지 서로 다른 방법입니다. 이 두 가지 방법은 다른 용도로 사용되며, 그에 따라 다른 방식으로 작동합니다. 이 글에서는 이 두 가지 방법의 차이점과 사용 예시를 코드로 설명하겠습니다.
TSoftObjectPtr
는 소프트 오브젝트 포인터로, 에디터와 런타임 모두에서 애셋을 지연 로딩할 수 있게 해줍니다. 소프트 오브젝트 포인터는 경로를 통해 애셋을 참조하며, 필요할 때 로드할 수 있습니다. TSoftObjectPtr
는 실제로 로드된 객체를 가리킬 때 Get()
메서드를 사용하여 액세스할 수 있습니다.
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spawn Data")
TSoftObjectPtr<AActor> SpawnPointActor;
위 코드에서 TSoftObjectPtr<AActor>
는 특정 액터의 소프트 레퍼런스를 나타냅니다. 이 포인터는 실제 액터 인스턴스와 연결되므로 GetActorTransform()
및 GetActorLocation()
과 같은 인스턴스 메서드에 접근할 수 있습니다.
TSubclassOf
는 클래스를 참조하는 템플릿입니다. 특정 클래스 또는 해당 클래스의 하위 클래스를 지정할 수 있습니다. 주로 스폰할 클래스를 지정할 때 사용됩니다. TSubclassOf
는 클래스의 형식을 지정하며, 객체 인스턴스가 아니므로 위치나 트랜스폼에 접근할 수 없습니다.
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spawn Data")
TSubclassOf<AActor> ItemClass;
위 코드에서 TSubclassOf<AActor>
는 특정 액터 클래스의 형식을 나타냅니다. 이는 클래스의 청사진일 뿐 실제 인스턴스가 아니기 때문에 인스턴스 메서드에 접근할 수 없습니다.
TSoftObjectPtr<AActor>
는 특정 액터의 소프트 레퍼런스를 나타냅니다. 이 포인터는 실제 액터 인스턴스와 연결되므로 GetActorTransform()
및 GetActorLocation()
과 같은 인스턴스 메서드에 접근할 수 있습니다.TSubclassOf<AActor>
는 특정 액터 클래스의 형식을 나타냅니다. 이는 클래스의 청사진일 뿐 실제 인스턴스가 아니기 때문에 인스턴스 메서드에 접근할 수 없습니다.TSubclassOf
로 스폰할 액터를 가져오고, TSoftObjectPtr
로 정의된 스폰 위치에 접근해서 스폰할 수 있습니다.
다음은 예시 코드입니다.
USTRUCT(BlueprintType)
struct FItemSpawnData : public FTableRowBase
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spawn Data")
FString ItemID;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spawn Data")
TSubclassOf<AActor> ItemClass;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spawn Data")
TSoftObjectPtr<AActor> SpawnPointActor;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spawn Data")
int32 Quantity;
};
void AItemSpawnManager::SpawnItemsFromTable()
{
const FString ContextString(TEXT("ItemSpawnDataTableContext"));
TArray<FItemSpawnData*> AllRows;
ItemSpawnTable->GetAllRows(ContextString, AllRows);
for (FItemSpawnData* Row : AllRows)
{
if (Row)
{
// SpawnPointActor로부터 트랜스폼 정보 가져오기
if (Row->SpawnPointActor.IsValid())
{
AActor* SpawnPointActor = Row->SpawnPointActor.Get();
FTransform SpawnTransform = SpawnPointActor->GetActorTransform();
// ItemClass를 사용하여 액터 스폰하기
if (Row->ItemClass)
{
AActor* SpawnedItem = GetWorld()->SpawnActor<AActor>(Row->ItemClass, SpawnTransform);
// 추가적인 스폰 후 로직
// 예: 인벤토리에 아이템 추가
}
}
}
}
}
TSoftObjectPtr
는 애셋을 지연 로딩하고 인스턴스 메서드에 접근할 수 있습니다.TSubclassOf
는 클래스 형식을 지정하며 인스턴스가 아니므로 인스턴스 메서드에 접근할 수 없습니다.TSoftObjectPtr
로 스폰 위치를 지정하고, TSubclassOf
로 클래스를 지정하여 액터를 스폰하는 방식으로 구현할 수 있습니다.