본문으로 건너뛰기
Unreal Engine C++ 기초집LESSON 17

DataAsset으로 데이터 중심 설계

난이도초급
예상 시간45분
선수지식16강의 HealthComponent

17강. DataAsset으로 데이터 중심 설계

1. 이번 강의에서 해결할 문제

적 종류를 늘릴 때마다 EnemyBase 자식 C++ 클래스를 만들고 숫자를 다시 컴파일합니다. 같은 행동 코드를 유지하면서 이동 속도, 체력, 공격력과 점수만 에셋으로 교체합니다.

2. 학습 목표

3. 핵심 개념

DataAsset은 특정 시스템의 설정 데이터를 저장하는 Unreal 에셋입니다. 코드에서 기본 범위와 유효성 규칙을 정의하고, Blueprint나 DataAsset에서 값을 조정합니다. 공식 Data Assets 문서는 UDataAsset과 UPrimaryDataAsset의 차이, Asset Manager 확장을 설명합니다.

이번 과정은 작은 프로젝트이므로 동기 참조로 단순하게 시작합니다. 대규모 프로젝트에서 많은 자산을 필요할 때만 비동기 로딩과 Asset Manager를 확장합니다.

4. 단계별 실습

파일 경로: Source/TopDownSurvival/Data/EnemyDataAsset.h

EnemyDataAsset.h
#pragma once

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

class AEnemyBase;

UCLASS(BlueprintType)
class TOPDOWNSURVIVAL_API UEnemyDataAsset : public UPrimaryDataAsset
{
GENERATED_BODY()

public:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Enemy")
TSubclassOf<AEnemyBase> EnemyClass;

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Enemy",
meta = (ClampMin = "1.0"))
float MaxHealth = 50.0f;

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Enemy",
meta = (ClampMin = "0.0", Units = "cm/s"))
float MoveSpeed = 300.0f;

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Enemy",
meta = (ClampMin = "0.0"))
float AttackDamage = 10.0f;

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Enemy",
meta = (ClampMin = "0"))
int32 ScoreValue = 100;
};

파일 경로: Source/TopDownSurvival/Enemies/EnemyBase.h · 추가

EnemyBase.h · 추가
class UEnemyDataAsset;

void InitializeFromData(UEnemyDataAsset* NewData);

UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category = "Enemy")
TObjectPtr<UEnemyDataAsset> EnemyData;

파일 경로: Source/TopDownSurvival/Enemies/EnemyBase.cpp · 추가

EnemyBase.cpp · 초기화
#include "Data/EnemyDataAsset.h"
#include "GameFramework/CharacterMovementComponent.h"

void AEnemyBase::InitializeFromData(UEnemyDataAsset* NewData)
{
if (!IsValid(NewData))
{
return;
}

EnemyData = NewData;
GetCharacterMovement()->MaxWalkSpeed = EnemyData->MoveSpeed;
HealthComponent->ConfigureHealth(EnemyData->MaxHealth);
}

Unreal Editor

  1. Content/Data에서 EnemyDataAsset 타입 DA_EnemyBasic을 만듭니다.
  2. EnemyClass는 BP_EnemyBase, Health 50, MoveSpeed 300, Damage 10, Score 100으로 설정합니다.
  3. 빠른 적 DA_EnemyFast를 복제해 Health 30, Speed 450, Score 150으로 바꿉니다.

Spawner는 EnemyData를 보관하고 EnemyData->EnemyClass로 Spawn한 뒤 InitializeFromData를 호출합니다.

5. 코드가 동작하는 이유

행동은 EnemyBase C++ 한 곳에 있고 여러 DataAsset이 값만 제공합니다. HealthComponent와 CharacterMovement가 자신의 책임에 해당하는 값을 받아 초기화합니다. const 포인터는 Enemy가 실행 중 DataAsset을 수정하지 않는다는 의도를 보여 줍니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

DataAsset으로 데이터 중심 설계 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“DataAsset으로 데이터 중심 설계” 기능을 확장하기 좋은 구조로 설명한 것은 무엇인가요?
  2. 문제 2“DataAsset으로 데이터 중심 설계”의 작업 기준으로 ‘DataAsset 값을 런타임 상태로 변경’을 진단하거나 바로잡은 선택은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

17강. DataAsset으로 데이터 중심 설계 미완료 상태