[Unreal Engine] Data Asset

이매·2026년 3월 9일

Unreal Data Driven Design

목록 보기
3/12
post-thumbnail

1. Data Asset

Data Asset은 Unreal Engine에서 게임 데이터를 Asset 형태로 저장하고 관리하기 위한 데이터 컨테이너이다.

게임에서 사용하는 다양한 설정 값이나 데이터를 코드와 분리하여 독립적인 Asset 파일(.uasset) 로 관리할 수 있도록 설계된 시스템이다.
Data Asset은 엔진 내부적으로 하나의 UObject 기반 객체로 동작하며, 콘텐츠 브라우저에서 일반 Asset처럼 생성하고 관리할 수 있다.

예를 들어 아이템 데이터를 Data Asset으로 관리한다면 다음과 같은 구조가 된다.

Item Assets
 ├ DA_Sword
 ├ DA_Armor
 ├ DA_Potion
 └ DA_Shield

각 Asset은 하나의 데이터 단위를 나타내며, 해당 데이터에 필요한 다양한 정보를 포함할 수 있다.

예를 들어 Sword 아이템의 Data Asset은 다음과 같은 데이터를 가질 수 있다.

DA_Sword
 ├ ItemName
 ├ Attack
 ├ Icon
 ├ Mesh
 └ Description

이처럼 Data Asset은 게임에서 사용하는 하나의 데이터 객체를 Asset 형태로 표현하는 방식이라고 볼 수 있다.

Unreal Engine에서 Data Asset이 실제로 활용되는 대표적인 사례 중 하나가 Enhanced Input System이다.

Enhanced Input에서는 입력 데이터를 코드가 아닌 Data Asset 기반으로 관리한다.
대표적으로 다음과 같은 Asset들이 존재한다.

  • Input Action
  • Input Mapping Context

이들은 모두 내부적으로 Data Asset 기반 객체로 구현되어 있으며, 콘텐츠 브라우저에서 Asset 형태로 생성하고 관리할 수 있다.

이처럼 Enhanced Input System은 입력 로직을 코드가 아닌 Data Asset으로 분리하여 관리하는 구조를 사용하고 있으며, 이는 Data Driven Design의 대표적인 예시라고 볼 수 있다.

1-1. Data Asset의 특징

Data Asset은 일반적인 Unreal Engine의 Asset 시스템 위에서 동작하기 때문에 다음과 같은 특징을 가진다.

  • 독립적인 Asset 파일로 관리된다.
    Data Asset은 콘텐츠 브라우저에서 독립적인 .uasset 파일로 존재한다.
    이 때문에 특정 Actor나 Blueprint에 종속되지 않고 여러 시스템에서 공통으로 참조할 수 있다.

  • Blueprint와 C++에서 모두 사용할 수 있다.
    Data Asset은 UObject 기반이기 때문에 Blueprint와 C++에서 모두 쉽게 접근할 수 있다.

  • 다른 Asset을 직접 참조할 수 있다.

  • 에디터에서 직접 데이터를 수정할 수 있다.
    Data Asset은 에디터에서 직접 열어 데이터를 수정할 수 있다.
    코드를 수정하지 않고도 게임 데이터를 변경할 수 있기 때문에 디자이너, 기획자, 아티스트도 쉽게 데이터를 관리할 수 있다.

  • 협업 환경에서 작업 충돌이 적다.
    Data Asset은 데이터 하나당 하나의 Asset 파일로 관리된다.
    따라서 여러 명의 개발자가 작업할 때 서로 다른 Data Asset을 동시에 수정할 수 있고 Source Control 충돌이 비교적 적다.



2. Data Asset 사용 예시

앞서 Data Table은 여러 데이터를 테이블 형태로 관리하는 방식이었다면, Data Asset은 하나의 데이터 객체를 독립적인 Asset으로 관리하는 방식이라고 볼 수 있다.

예를 들어 레벨에 배치할 수 있는 아이템 오브젝트를 만든다고 가정해 보자.

각 아이템은 다음과 같은 데이터를 가진다.

  • Name
  • Description
  • Static Mesh

이러한 데이터를 Data Asset으로 관리하기 위해서는 일반적으로 다음과 같은 과정을 거친다.

  1. Primary Data Asset 생성
    아이템 데이터를 저장하기 위한 Primary Data Asset 클래스를 만든다.

  2. Data Asset 생성
    위에서 만든 Primary Data Asset 클래스를 기반으로 실제 데이터를 저장할 Data Asset을 생성한다.

  3. Data Load
    Blueprint 또는 C++에서 Data Asset을 참조하여 아이템 Actor에 데이터를 적용한다.

이제 Blueprint와 C++에서 각각 Primary Data Asset을 생성하고 Data Asset을 만들어 실제로 사용하는 방법을 살펴보자.

2-1. Blueprint

2-1-1. Primary Data Asset 클래스 생성

먼저 아이템 데이터를 저장하기 위한 Primary Data Asset 클래스를 생성한다.

이제 Data Asset 내부에 아이템 데이터를 저장할 변수를 추가한다.

2-1-2. Item Data Asset 생성

이제 실제 아이템 데이터를 저장할 Asset을 생성한다.

이렇게 하면 실제 아이템 데이터를 담을 Data Asset을 만들 수 있다.

2-1-3. Item Actor 생성

이제 레벨에 배치할 수 있는 아이템 Actor를 만든다.

변수를 추가하여 생성한 Primary Data Asset 타입으로 설정하고 설정한 Data Asset의 데이터를 불러와 설정하는 로직을 만들어주자.

이 방식의 장점은 하나의 Actor Blueprint만으로도 Data Asset을 교체하는 것만으로 다양한 아이템을 생성할 수 있다는 점이다.

2-2. C++

Blueprint와 동일한 구조를 C++에서도 구현할 수 있다.

C++에서는 먼저 Primary Data Asset 클래스를 정의한 뒤, Actor에서 해당 Asset을 참조하여 데이터를 사용하는 방식으로 구현한다.

2-2-1. Primary Data Asset 클래스 생성

ItemData.h

#pragma once

#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "ItemData.generated.h"

/**
 * 
 */
UCLASS(BlueprintType)
class DATADRIVENDESIGN_API UItemData : public UPrimaryDataAsset
{
	GENERATED_BODY()
	
public:
	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	FString ItemName;

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	FString ItemDescription;

	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	UStaticMesh* ItemMesh;
};

2-2-2. Item Data Asset 생성

이제 Blueprint와 동일하게 실제 아이템 데이터를 저장할 Asset을 생성한다.

이렇게 하면 실제 아이템 데이터를 담을 Data Asset을 만들 수 있다.

2-2-3. Item Actor 생성

이제 아이템 Actor에서 Data Asset을 참조하도록 만든다.

ItemActor.h

UCLASS()
class DATADRIVENDESIGN_API AItemActor : public AActor
{
	GENERATED_BODY()
	
    ...
    
public:	
	virtual void OnConstruction(const FTransform& Transform) override;
	
	UPROPERTY(EditAnywhere, BlueprintReadOnly)
	class UItemData* ItemData;
    
protected:

	UPROPERTY(VisibleAnywhere)
	class UStaticMeshComponent* MeshComponent;

	UPROPERTY(VisibleAnywhere)
	class UTextRenderComponent* NameText;

	UPROPERTY(VisibleAnywhere)
	class UTextRenderComponent* DescriptionText;
};    

ItemActor.cpp

#include "ItemData.h"
#include "Components/StaticMeshComponent.h"
#include "Components/TextRenderComponent.h"

AItemActor::AItemActor()
{
 	...
	
	MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent"));
	RootComponent = MeshComponent;

	NameText = CreateDefaultSubobject<UTextRenderComponent>(TEXT("NameText"));
	NameText->SetupAttachment(RootComponent);
	NameText->SetRelativeLocation(FVector(0.f, 0.f, 240.f));

	DescriptionText = CreateDefaultSubobject<UTextRenderComponent>(TEXT("DescriptionText"));
	DescriptionText->SetupAttachment(RootComponent);
	DescriptionText->SetRelativeLocation(FVector(0.f, 0.f, 220.f));

}

void AItemActor::OnConstruction(const FTransform& Transform)
{
	Super::OnConstruction(Transform);
	
	if (ItemData == nullptr)
	{
		return;
	}
	
	MeshComponent->SetStaticMesh(ItemData->Mesh);
	NameText->SetText(FText::FromString(ItemData->Name));
	DescriptionText->SetText(FText::FromString(ItemData->Description));
}


3. Data Asset 사용 시 고려 사항

Data Asset은 게임 데이터를 관리하는 데 매우 유용한 시스템이지만, 모든 상황에 적합한 것은 아니다.
특히 데이터의 성격과 프로젝트 규모에 따라 다른 데이터 관리 방식이 더 적합할 수 있다.

Data Asset을 사용할 때는 다음과 같은 점들을 고려할 필요가 있다.

3-1. Asset 수 증가

Data Asset은 데이터 하나당 하나의 Asset 파일(.uasset) 로 관리된다.
데이터가 몇 개 정도라면 문제가 되지 않지만, 수백 개 이상의 데이터를 Data Asset으로 관리하게 되면 다음과 같은 문제가 발생할 수 있다.

  • 콘텐츠 브라우저에서 Asset 수 증가
  • Asset 관리 복잡도 증가
  • 폴더 구조 관리 필요

이러한 이유로 대량의 데이터를 관리하는 경우에는 Data Table이 더 적합할 수 있다.

3-2. 단순 데이터에는 과한 구조

Data Asset은 UObject 기반 Asset이기 때문에 다음과 같은 특징을 가진다.

  • 별도의 Asset 파일 생성
  • UObject 메모리 관리
  • Asset 로딩 과정

따라서 단순한 데이터 조각을 관리하는 경우에는 오히려 구조가 과해질 수 있다.

3-3. 데이터 변경 관리

Data Asset은 UObject 기반 Asset이기 때문에 런타임에서도 데이터를 참조하고 수정할 수 있는 유연한 구조를 가진다.

또한 Blueprint에서 직관적으로 데이터를 수정할 수 있으며, Struct 내부에 다른 Struct가 포함된 Nested Struct 구조와 같은 복잡한 데이터 구조도 비교적 쉽게 구성할 수 있다.

이러한 특징 덕분에 Data Asset은 다음과 같은 장점을 가진다.

  • 런타임에서 데이터 수정 가능
  • 에디터에서 직관적인 데이터 편집
  • 복잡한 데이터 구조 관리 가능

하지만 이러한 유연성 때문에 데이터 변경 관리에 주의가 필요하다.

Data Asset은 여러 시스템에서 동시에 참조되는 경우가 많기 때문에, 하나의 Data Asset을 수정하면 이를 사용하는 모든 시스템에 영향을 줄 수 있다.

profile
언리얼 엔진 주니어(신입) 개발자 | 소설 쓰는 취준 개발자

0개의 댓글