[UE5] 비동기 애셋 로딩 : TSoftObjectPtr와 TSubclassOf의 차이점

ChangJin·2024년 7월 12일
0

Unreal Engine5

목록 보기
79/114
post-thumbnail

TSoftObjectPtr와 TSubclassOf의 차이점

TSoftObjectPtrTSubclassOf는 Unreal Engine에서 애셋과 클래스를 참조하는 데 사용되는 두 가지 서로 다른 방법입니다. 이 두 가지 방법은 다른 용도로 사용되며, 그에 따라 다른 방식으로 작동합니다. 이 글에서는 이 두 가지 방법의 차이점과 사용 예시를 코드로 설명하겠습니다.

TSoftObjectPtr

TSoftObjectPtr는 소프트 오브젝트 포인터로, 에디터와 런타임 모두에서 애셋을 지연 로딩할 수 있게 해줍니다. 소프트 오브젝트 포인터는 경로를 통해 애셋을 참조하며, 필요할 때 로드할 수 있습니다. TSoftObjectPtr는 실제로 로드된 객체를 가리킬 때 Get() 메서드를 사용하여 액세스할 수 있습니다.

예시 코드

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spawn Data")
TSoftObjectPtr<AActor> SpawnPointActor;

위 코드에서 TSoftObjectPtr<AActor>는 특정 액터의 소프트 레퍼런스를 나타냅니다. 이 포인터는 실제 액터 인스턴스와 연결되므로 GetActorTransform()GetActorLocation()과 같은 인스턴스 메서드에 접근할 수 있습니다.

TSubclassOf

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로 클래스를 지정하여 액터를 스폰하는 방식으로 구현할 수 있습니다.

참고 자료


profile
게임 프로그래머

0개의 댓글