Unreal Engine

Unreal Engine - Data Table

gbleem 2025. 2. 3. 19:55

1. Data Table 만들기


Data Table은 언리얼에서 많은 데이터를 처리할 때 사용하기 유용한 방식이다. (CSV 사용 가능)

이번 예시는 data table에 actor를 스폰할 위치를 지정해두고, spawner를 통해 해당 위치에 스폰하는 것을 구현해 볼 것이다.

 

  • 먼저 Data Table을 만들려고 하면, 아래 사진과 같이 먼저 행 구조를 선택하라고 한다.

  • 행 구조는 FTableRowBase를 상속받아서 만든 구조체를 사용하면 된다.
    • 이때 구조체는 UE 에디터에서 만들 수 없어서, VS에서 따로 파일을 추가하여 만들어 주면 된다.
      • USTRUCT() 매크로와
      • 구조체 앞에 F를 붙여주어야 한다.
    • 이번 예시에서는 actor가 스폰될 위치와 회전값을 저장했다.
#pragma once

#include "CoreMinimal.h"
#include "PlatformSpawnData.generated.h"

USTRUCT(BlueprintType)
struct SCC_CH3_6_API FPlatformSpawnData : public FTableRowBase
{
	GENERATED_BODY()

public:
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	FVector Position;

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	FRotator Rotator;
};

 

 

 

2. Data Table 값 작성


  • 위에서 행 구조를 만들고 나면, 데이터 테이블 생성시 우리가 만든 행 구조 이름이 뜨는 것을 볼 수 있다.

  • 행을 선택하여 데이터 테이블을 만들게 되면, 아래와 같이 값을 넣을 수 있다.

  • 이 값을 JSON이나 CSV로 익스포트 한 다음 수정하여, 리임포트 할 수도 있다.

CSV로 저장하여 확인해 본 모습

 

 

3. Data Table 사용하기


이번 예시에서는 Spawner라는 클래스를 만들고, 해당 클래스에서 Falling Platform 이라는 Actor를 생성할 것이다.

  • PlatformSpawner.h 파일
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "PlatformSpawner.generated.h"

class AFallingPlatform;
class UDataTable;

UCLASS()
class SCC_CH3_6_API APlatformSpawner : public AActor
{
	GENERATED_BODY()
	
public:	
	APlatformSpawner();

protected:
	virtual void BeginPlay() override;

public:
	UFUNCTION()
	void SpawnPlatform();

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PlatformSpawn")
	UDataTable* SpawnDataTable;
};
  • PlatformSpawner.cpp 파일
#include "PlatformSpawner.h"
#include "Engine/DataTable.h"
#include "PlatformSpawnData.h"
#include "FallingPlatform.h"

APlatformSpawner::APlatformSpawner()
	:SpawnDataTable(nullptr)
{
	PrimaryActorTick.bCanEverTick = false;
}

void APlatformSpawner::BeginPlay()
{
	Super::BeginPlay();
	
	SpawnPlatform();
}


void APlatformSpawner::SpawnPlatform()
{
	if (!SpawnDataTable)
	{
		return;
	}

	TArray<FName> RowNames = SpawnDataTable->GetRowNames();
	for (const FName RowName : RowNames)
	{
		FPlatformSpawnData* Row = SpawnDataTable->FindRow<FPlatformSpawnData>(RowName, "");
		if (Row)
		{
			FActorSpawnParameters SpawnParams;
			SpawnParams.Owner = this;

			GetWorld()->SpawnActor<AFallingPlatform>(
				AFallingPlatform::StaticClass()
				, Row->Position
				, Row->Rotator
				, SpawnParams
			);
		}
	}
}
  • 아래 사진처럼 우리가 원하는 위치에 Actor가 스폰된 것을 볼 수 있다.