데이터 테이블과 블루프린트 연동
구조체 기반 데이터 테이블을 만들고 행 조회·반복 노드로 아이템 같은 정형 데이터를 블루프린트에 연결합니다.
게임 개발 시 플레이어의 능력치, 아이템 정보, 퀘스트 내용, 몬스터 스탯 등 수많은 데이터를 관리해야 합니다.
데이터를 여러 그래프의 상수로 흩어 놓으면 수정할 위치가 많아집니다. 에디터에서 바꿀 변수 기본값과 별개로, 많은 정형 행을 로직에서 분리해 관리할 때 데이터 테이블이 유용합니다.
또한, 기획자가 직접 데이터를 수정하기 어렵다는 문제도 있습니다.
이러한 문제들을 해결하기 위해 언리얼 엔진은 데이터 테이블(Data Table)이라는 강력한 기능을 제공합니다.
데이터 테이블은 스프레드시트(Excel, Google Sheets 등)와 유사한 형태로 데이터를 중앙 집중식으로 관리하고, 블루프린트에서 쉽게 접근하여 활용할 수 있게 해 줍니다.
데이터 테이블이란 무엇인가?
데이터 테이블은 게임 데이터를 행(Row)과 열(Column)의 형태로 정리하여 저장하는 언리얼 엔진의 에셋입니다.
각 행(Row)은 하나의 데이터 항목(예: 특정 아이템)을 나타내고, 각 열(Column)은 그 항목의 특정 속성(예: 아이템 이름, 공격력, 무게)을 나타냅니다.
데이터 테이블의 가장 큰 장점은 다음과 같습니다.
- 중앙 집중식 관리: 모든 관련 데이터를 한곳에 모아 관리할 수 있습니다.
- 쉬운 편집: 테이블 형태로 되어 있어 기획자나 디자이너가 블루프린트나 코드를 수정하지 않고도 데이터를 쉽게 추가, 수정, 삭제할 수 있습니다.
- 블루프린트 연동: 블루프린트에서 특정 행의 데이터를 쉽게 검색하고 가져와 사용할 수 있습니다.
- 확장성: 새로운 데이터 항목이나 속성을 추가하기 용이합니다.
데이터 테이블을 사용하려면, 먼저 해당 데이터의 구조를 정의하는 구조체(Struct)가 필요합니다.
1절에서 다루었던 구조체가 바로 데이터 테이블의 각 행이 가질 데이터 타입을 정의하는 역할을 합니다.
데이터 테이블 생성 및 설정
데이터 테이블을 생성하고 블루프린트와 연동하는 단계는 다음과 같습니다.
데이터 구조체 정의 (1절 복습)
- 먼저 데이터 테이블에 들어갈 데이터의 형식을 정의하는 구조체를 생성합니다.
- 콘텐츠 브라우저에서 우클릭 >
블루프린트(Blueprints)>구조체(Structure)를 선택합니다. - 이름을
F_ItemData(예시: 아이템 정보를 저장할 구조체)로 지정합니다. - 구조체 에디터를 열고 아이템이 가질 속성들을 변수로 추가합니다.
ItemName(Text)Description(Text)AttackPower(Integer)Weight(Float)ItemMesh(Static Mesh Reference)
- 저장 버튼을 클릭합니다.
- 콘텐츠 브라우저에서 우클릭 >
기타(Miscellaneous)>데이터 테이블(Data Table)을 선택합니다. - 팝업되는 창에서
Row Structure를 여러분이 방금 만든 구조체(F_ItemData)로 선택합니다. - 이름을
DT_Items와 같이 지정합니다. (일반적으로 DT_ 접두사를 사용합니다.) - 저장 버튼을 클릭합니다.
- 생성된
DT_Items데이터 테이블 에셋을 더블클릭하여 데이터 테이블 에디터를 엽니다. + 추가(+ Add)버튼을 클릭하여 새 행을 추가합니다.- 각 행의
Row Name을 고유하게 지정합니다. 이 이름이 나중에 블루프린트에서 데이터를 검색할 때 사용될 키(Key)가 됩니다. (예:Sword_Basic,Shield_Wooden,Potion_Health) - 각 열(구조체 멤버)에 맞는 데이터를 입력합니다.
-
Sword_Basic
- ItemName: 기본 검
- Description: 평범한 검입니다.
- AttackPower: 10
- Weight: 2.5
- ItemMesh:
Shape_Cylinder(예시)
-
Potion_Health
- ItemName: 체력 회복 물약
- Description: 체력을 회복시켜 줍니다.
- AttackPower: 0
- Weight: 0.1
- ItemMesh:
Shape_Sphere(예시)
-
Sword_Basic
- 모든 데이터 입력 후 저장 버튼을 클릭합니다.
블루프린트에서 데이터 테이블 연동 및 활용
행 조회 결과에 따른 적용 경로
DT_Items/Sword_Basic 조회 요청→Found/NotFound 결과→성공 Out Row 적용 또는 실패 정책의 실행 경계이다.
LOOKUP · FOUND / NOT FOUND
행을 찾은 경로에서만 Out Row를 적용합니다
Get Data Table Row에 DT_Items와 조회 키 Sword_Basic(Name)을 연결합니다. 한 조회의 실행 결과는 Row Found 또는 Row Not Found로 나뉩니다.
Get Data Table Row의 실행 결과입니다. Out Row를 사용하는 처리는 Row Found 쪽에만 연결합니다.
조회 키와 표시 이름을 구분합니다
Row Name은 Name 타입의 키입니다. 지역화 Text와 구별하고, 대소문자만 다른 행 이름으로 구분하지 않습니다. 실패 경로에는 오류 안내·취소·기본값 중 정한 정책을 연결합니다.
이 예의 조건
- 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
- 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| Row 요청 DT_Items에서 Sword_Basic을 조회한다. |
|
|
| 성공 경계 Found에서만 Out Row를 유효 결과로 취급한다. |
|
|
| 값 적용 Row Found에서 Sword_Basic의 표시명 기본 검과 공격력 10을 읽는다. |
|
|
행 조회 결과에 따른 적용 경로
DT_Items/Sword_Basic 조회 요청→Found/NotFound 결과→성공 Out Row 적용 또는 실패 정책의 실행 경계이다.
LOOKUP · FOUND / NOT FOUND
행을 찾은 경로에서만 Out Row를 적용합니다
Get Data Table Row에 DT_Items와 조회 키 Sword_Basic(Name)을 연결합니다. 한 조회의 실행 결과는 Row Found 또는 Row Not Found로 나뉩니다.
Get Data Table Row의 실행 결과입니다. Out Row를 사용하는 처리는 Row Found 쪽에만 연결합니다.
조회 키와 표시 이름을 구분합니다
Row Name은 Name 타입의 키입니다. 지역화 Text와 구별하고, 대소문자만 다른 행 이름으로 구분하지 않습니다. 실패 경로에는 오류 안내·취소·기본값 중 정한 정책을 연결합니다.
이 예의 조건
- 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
- 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| Row 요청 DT_Items에서 Sword_Basic을 조회한다. |
|
|
| 성공 경계 Found에서만 Out Row를 유효 결과로 취급한다. |
|
|
| 값 적용 Row Found에서 Sword_Basic의 표시명 기본 검과 공격력 10을 읽는다. |
|
|
데이터 테이블에 데이터가 준비되었다면, 이제 블루프린트에서 이 데이터를 가져와 사용할 수 있습니다.
블루프린트 열기: 데이터를 활용할 액터 블루프린트(예: BP_PlayerCharacter)를 엽니다.
Get Data Table Row 노드 사용- 이벤트 그래프의 빈 공간에서 마우스 오른쪽 버튼을 클릭합니다.
Get Data Table Row를 검색하여 노드를 추가합니다.Data Table핀에 여러분이 만든DT_Items데이터 테이블 에셋을 지정합니다. (드롭다운에서 선택)Row Name핀은Name타입입니다. 행 이름Sword_Basic을 선택·입력하거나Make Literal Name을 연결합니다.- 조회를 시작할 이벤트의 실행 선을 노드 입력에 연결합니다.
Get Data Table Row에는 두 개의 실행 출력 핀이 있습니다.Row Found: 지정된Row Name의 데이터를 성공적으로 찾았을 때 실행됩니다.Row Not Found: 지정된Row Name의 데이터를 찾지 못했을 때 실행됩니다. (오타나 존재하지 않는 이름 입력 시)
- 문자열을 입력받았다면
String To Name으로 변환합니다. 표시용 지역화Text와 조회 키Name을 혼동하지 않습니다.Name은 대소문자를 구별하지 않는 비교 특성이 있으므로 대소문자만 다른 행 이름으로 구분하지 않습니다.
Get Data Table Row노드의Out Row출력 핀은 여러분이 지정한F_ItemData구조체 타입의 데이터를 반환합니다.- 이
Out Row핀에서 드래그하여Break F_ItemData노드를 검색하고 선택합니다. Row Found경로에서만 구조체 멤버를 적용합니다.Row Not Found에는 오류 안내·요청 취소 또는 기본값 사용 중 프로젝트 정책에 맞는 처리를 연결합니다.- 예시:
Row Found실행 핀 뒤에Print String노드를 연결하고,Break F_ItemData에서ItemName을 디버그 출력용 문자열로 변환하여Print String의In String에 연결합니다. 또한,AttackPower를 가져와 플레이어 캐릭터의 공격력 변수에Set할 수 있습니다.
- 아이템 생성: 게임 시작 시
DT_Items에서Row Name을 통해 특정 아이템 데이터를 가져와 해당 아이템 액터의 속성을 설정할 수 있습니다. - NPC 대화:
DT_Dialogue와 같은 데이터 테이블에 NPC의 대화 내용을 저장하고, 퀘스트 진행 상황에 따라 해당 대화 데이터를 가져와 출력합니다. - 레벨 디자인: 특정 오브젝트의 배치나 속성을 데이터 테이블에 저장하여, 디자이너가 블루프린트 수정 없이 레벨의 다양한 요소를 조정할 수 있게 합니다.
데이터 테이블은 게임 데이터를 효율적으로 관리하고, 기획자와 프로그래머 간의 협업을 원활하게 하며, 게임의 확장성과 유지보수성을 크게 높여주는 매우 중요한 기능입니다.
첫 조회는 BeginPlay → Get Data Table Row → Row Found의 Print String으로 시작할 수 있습니다. Sword_Basic에서 “기본 검”과 AttackPower=10을 읽는지 확인한 뒤 키를 바꿔 실패 경로도 봅니다. ItemName은 표시 문구이며 조회 키 Sword_Basic과 같은 값일 필요가 없습니다. Weight는 사용자 정의 필드이므로 kg 등 단위를 프로젝트에서 정하고, 엔진이 자동으로 이 숫자의 의미를 결정한다고 가정하지 않습니다.
없는 행을 찾았을 때 기존 상태 판단하기
현재 플레이어 AttackPower는 7입니다. 테이블에 없는 Sword_Missing을 조회했고, Row Not Found 경로는 오류 문구만 출력하며 공격력은 변경하지 않도록 정했습니다. 성공 경로에서만 Out Row를 적용합니다. 조회 뒤 공격력은 0이 될까요, 7이 유지될까요?
실패 정책과 상태 변경 경로 따라가기
7이 유지됩니다. 실패 경로가 공격력을 변경하지 않는 조건이기 때문입니다. 0 같은 기본값으로 바꾸는 정책을 선택했다면 그 실패 경로에 명시적인 Set이 필요합니다. 조회 실패의 출력 구조체를 성공한 행처럼 적용하지 않습니다. 본문 예제의 Sword_Basic 성공값 10과 이번 없는 행 조건도 구분합니다.