Unreal 게임 개발 과정 TIL

Today's I Learning

본캠프 TIL

07.07 Unreal 본캠프) Data Asset으로 재구성

Sunlight__ 2026. 7. 7. 23:53

 

초기 무기 시스템으로 AWeaponBase 클래스 내부에 데미지, 쿨타임 등의 변수를 직접 선언하고 관리하는 구조였다.

처음에는 직관적이고 편해 보였지만, 프로젝트가 다음과 같은 치명적인 문제들이 발생했다.

  1. 클래스 증식 (Class Explosion) : '나무 활', '철 활', '마법 활' 등을 만들려면 BowBase를 상속받는 자식 블루프린트를 계속해서 새로 만들어야 했다. 무기가 100개면 100개의 블루프린트가 필요해지는 끔찍한 구조였다.
  2. 메모리 낭비 : 고블린 100마리가 같은 '철검'을 들고 스폰되면, 100개의 무기 액터가 각자 데미지와 이펙트 변수를 메모리에 개별적으로 들고 있는 비효율이 발생했다.
  3. 협업의 불편함 : 기획자가 데미지 수치나 효과음을 바꾸려면 프로그래머가 만든 블루프린트를 직접 열어서 수정해야 했다. 이는 실수로 코드나 로직(노드)을 건드릴 위험성을 동반했다.

 

- 해결 방법 : 데이터 에셋 기반의 '데이터 주도 설계'

 이번 리팩토링을 통해 단순히 코드를 고친 것을 넘어, 데이터 주도 설계(Data-Driven Design)의 강력함을 배웠다.

 

1. 무한한 확장성과 클래스 증식 방지

 : 더이상 무기가 추가될 떄마다 블루프린트를 만들 필요가 없어졌다.

   C++ 클래스는 BP_BowBase 딱 하나만 두고, 언리얼 에디터에서 DA_WoodBow, Da_IronBow처럼 데이터 에셋 파일만 생성해서 넣으면 완전히 다른 무기가 완성된다. (다형성의 극대화)

 

2. 완벽한 메모리 최적화 (단일 진실 공급원, SSOT)

 : 데이터 에셋은 액터가 아니라 '파일'이다.

   고블린 100마리가 스폰되어도 DA_GoblinSword라는 데이터 에셋 파일은 메모리에 단 1개만 로드된다.

   100개의 무기 액터는 모두 이 하나의 파일을 가리키기만(포인터 참조) 하므로 메모리 최적화가 획기적으로 이루어졌다.

 

3. 직관적인 밸런스 패치와 협업 효율 극대화

 : 다른 팀원은 이제 복잡한 블루프린트를 열어볼 필요가 없다.

   액셀 표처럼 깔끔하게 정리된 데이터 에셋 파일만 열어서 숫자나 사운드를 교체하면 끝난다.

   밸런스 수정 시, 데이터 에셋 숫자 하나만 바꾸면 그 무기를 들고 있는 게임 내 모든 몬스터에게 즉각 반영된다.

 

4. 유연한 런타임 데이터 교체 (보스 페이즈 변화 등)

 : "보스 몬스터가 2페이즈에 돌입하면 공격력이 세지고 불타는 검을 휘두른다." 는 기믹을 만들 때, 예전처럼 복잡한 분기문(if문)을 짤 필요가 없다.

   전투 중인 컴포넌트의 데이터 에셋 포인터를 DA_BossSword_Phase1 에서 DA_BossSword_Phase2단 한 줄의 코드로 교체하기만 하면, 데미지부터 애니메이션, 파티클 이펙트까지 한 번에 바뀐다.

 


 

- 구현 핵심 로직 요약

 : 무기가 스폰되는 즉시, 컴포넌트가 무기에게 자신의 '스탯(데이터 에셋)' 을 주입하는 방식으로 구조를 변경했다.

// CombatComponent.cpp (스폰 및 주입)
EquippedWeapon = GetWorld()->SpawnActor<AWeaponBase>(WeaponData->WeaponClass, ...);
if (EquippedWeapon)
{
	// 무기야, 너는 이 데이터를 기반으로 싸워라!
    EquippedWeapon->InitializeWeapon(WeaponData);
}

// WeaponBase.cpp (데이터 참조)
void AWeaponBase::PerformAttack()
{
	if (WeaponStat)	// 주입받은 데이터 에셋 확인
    {
    	float Damage = WeaponStat->AttackDamage;
        // 데미지 처리 및 공격 로직...
    }
}

 

 


 

- 오늘의 깨달음

 : 초기에는 그냥 변수 몇 개 선언하는 것이 빠르고 편해 보이지만, "무엇이 변하는 것이고, 무엇이 변하지 않는 것인가?" 를 고민하여 설계하는 것이 객체 지향 프로그래밍의 핵심임을 깨달았다.

   데이터 에셋을 활용한 분리 설계는 단순한 코드 정리를 넘어 프로젝트의 유지보수성과 팀 협업을 좌우하는 강력한 아키텍처다.