해당 포스팅은 Stuart Butler , Tom Oliver의 Game Development Patterns with Unreal Engine 5를 바탕으로 작성한 내용입니다.
추가 참고 자료 : UE5 Type Object 패턴 - seunghyun
타입 오브젝트(Type Object) 패턴이란?
타입 오브젝트 패턴(Type Object Pattern)은 객체의 “종류(Type)”를 클래스 상속이 아니라 객체로 분리하는 설계 패턴이다.
기존 상속 기반 설계에서는 새로운 타입이 추가될 때마다 새로운 클래스를 만들어야 했다.
이 구조는 타입이 늘어날수록 다음과 같은 문제가 생긴다.
- 클래스 수가 기하급수적으로 증가
- 런타임 중 타입 변경 불가
- 데이터 수정이 코드 수정으로 이어짐
- 디자이너 중심 워크플로우에 부적합
하지만 타입 오브젝트 패턴은 타입 자체를 객체로 만들고, 실제 인스턴스는 그 타입을 참조하도록 한다.
이를 통해 프로그래머가 직접 새로운 코드를 작성하지 않더라도, 디자이너 혹은 기획자가 데이터 수정만으로 다양한 클래스 변형(타입) 을 정의할 수 있게 된다.
즉, 타입 객체 패턴은 협업 친화적인 구조를 만드는 데 매우 큰 장점을 가진다.
플라이웨이트 패턴과의 차이점
타입 객체 패턴은 종종 플라이웨이트 패턴(Flyweight Pattern, 경량 패턴) 과 혼동된다.
두 패턴이 유사해 보이는 이유는, 타입 객체 패턴이 플라이웨이트 패턴의 ‘암시적 데이터 / 명시적 데이터’ 개념을 게임플레이 영역으로 확장한 구조이기 때문이다.
Unreal Engine에서의 타입 오브젝트 패턴
타입 객체 패턴이 Unreal Engine에서 제대로 작동하려면, 런타임에 RAM으로 로드될 수 있는 타입 데이터를 수집하고 참조할 수 있어야 한다.
Unreal은 이를 위해 이미 여러 형태의 데이터 컨테이너를 제공하고 있으며, 이들은 타입 객체 패턴을 구현하는 데 매우 잘 어울린다.
대표적으로 다음 세 가지 방식이 있다.
- Variant & Variant Manager
- Data Table
- Data Asset
Variant & Variant Manager
Unreal Engine의 Variant Manager는 에디터 내에서 여러 가지 구성(Variant)을 만들고 관리할 수 있는 기능이다. 이를 통해 레벨에 있는 액터들의 속성(property)이나 동작을 다양한 설정 조합으로 캡처하고 전환할 수 있다.
주로 건축 시각화 프로젝트나 자동차 설계 등의 제품 기반의 애플리케이션 같은 상호 작용적 경험에서 주로 사용된다.
자세한 내용은 공식 문서의 베리언트 매니저 템플릿 개요를 참고하면 좋다.
Data Table
Data Table은 CSV / JSON 기반의 대량 타입 데이터 관리에 특화된 방식이다.
특징으로는 다음과 같다.
- 대량의 타입 데이터를 효율적으로 관리 가능
- CSV / JSON 기반으로 기획자 · 디자이너 친화적
- 수치 변경이 쉬워 밸런싱 작업에 매우 유리
- 구조화된 테이블 형태로 검색, 정렬, 언어 현지화(Localization)에 강점이 있음
하지만 한계점도 존재하는데
- 모든 Row 데이터가 한 번에 메모리에 로드됨
→ 일부 타입만 필요해도 → 테이블 전체가 RAM에 올라감
- 행동(로직)을 담기 어려움
즉, “저수준 타입 / 수치 데이터 레이어”에 매우 적합하다.
Data Asset
타입 객체 패턴을 Unreal에서 가장 정석적으로 구현하는 방식은 Data Asset + UObject 기반 타입 객체 조합이다.
프라이머리 데이터 에셋에서 상속하면 프라이머리 에셋 ID(Primary Asset Id)가 구현되고 에셋 번들이 지원되므로 에셋 매니저에서 수동으로 로드 및 언로드할 수 있다.
Data Asset 사용 예시
1. Data Asset 생성
// 이 클래스를 기반으로 데이터 에셋을 생성할 준비
UCLASS(BlueprintType)
class UExampleDataAsset : public UDataAsset
{
GENERATED_BODY()
public:
UPROPERTY(EditDefaultsOnly)
float MaxHP;
UPROPERTY(EditDefaultsOnly)
float AttackPower;
UPROPERTY(EditDefaultsOnly)
float MoveSpeed;
};2. 커스텀 데이터 에셋 생성
언리얼 에디터에서 콘텐츠 브라우저(Content Browser) 를 우클릭한 다음 기타(Miscellaneous) > 데이터 에셋(Data Asset) 을 선택한다.
이렇게 만든 에셋은 프로젝트에 저장되는 독립된 타입 객체가 된다.
3. Data Asset의 로딩/사용
생성된 에셋은 코드/블루프린트 변수로 참조할 수 있다:
UPROPERTY(EditAnywhere)
UExampleDataAsset* EnemyType;사용 시점에 이 에셋이 메모리로 로드되며, 그 값을 그대로 레벨/게임플레이 로직에서 사용할 수 있다.
Data Table과의 차이점?구조체는 타입 자체가 메모리에 올라가지 않고, 이를 사용하는 인스턴스만 로드된다.
반면 Data Asset은 에셋 자체가 필요할 때 로드되는 객체이다. (즉, Data Table보다 훨씬 유연하다.)
더 자세한 내용은 공식 문서의 데이터 에셋을 참고하자.