나만의 작은 도서관
[TIL][C++] 250814 MMO 서버 개발 80일차: [언리얼] 빌드 이후에 JSON 파일 없이 JSON으로 정의된 게임 데이터를 가지고 있고 싶다, [언리얼] 데이터 테이블 사용방법 본문
Today I Learn
[TIL][C++] 250814 MMO 서버 개발 80일차: [언리얼] 빌드 이후에 JSON 파일 없이 JSON으로 정의된 게임 데이터를 가지고 있고 싶다, [언리얼] 데이터 테이블 사용방법
pledge24 2025. 8. 15. 00:10주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다.
[언리얼] 빌드 이후에 JSON 파일 없이 JSON에 정의된 게임데이터를 사용하고 싶다.
- 고민했던 부분 중 하나이다. 언리얼은 프로젝트를 빌드(패키징)할 때, 콘텐츠 폴더 내의 에셋들을. pak 파일이라는 압축된 형식으로 묶는다.
- 문제는 Content 폴더 안에 json을 넣더라도, json은 .uasset 파일(언리얼 에디터가 인식하는 고유 에셋 형식)이 아닌 일반 텍스트 파일이기 때문에 에셋으로 간주되지 않는다. 결국 빌드 이후에도 json파일을 따로 배포 파일에 포함시켜야 한다.
- 이는 보안적인 측면에서 그리 좋지 못한 방법이다. 게임 진행에 있어 치명적인 데이터들은 서버만 들고 있어서(올바른 방식으로 설계를 했을 경우겠지만) 클라이언트 뜯기, 일명 클뜯을 해도 큰 문제는 발생하지 않겠지만 그래도 최대한 외부에 노출되지 않는 것이 좋다.
- 그래서 내가 원했던 것은 “JSON 파일로 게임 데이터가 정의되어 있는데, 빌드 이후에 JSON 파일을 따로 넣지 않을 수 있도록. uasset으로 포함되게 하는 것”이었다.
- 그래서 이것저것 찾아본 결과, 언리얼에 데이터 테이블을 이용하면 된다는 것을 알게 되었다.
[언리얼] 데이터 테이블
- 언리얼의 “데이터 테이블”이란, 표 형태의 구조화된 데이터를 저장하는 데 사용하는 에셋으로, csv 또는 json 파일의 데이터를 언리얼 엔진에서 쉽게 관리하고 사용할 수 있도록 변환하여 사용한다.
- 이 데이터 테이블을 이용하면, 빌드 이후에도 따로 json 파일을 추가하지 않고서 게임 데이터를 클라이언트가 가질 수 있도록 할 수 있다.
데이터 테이블 사용방법
1- 블루프린트 구조체를 정의한다.
- 콘텐츠 브라우저에서 오른쪽 마우스 클릭 → 블루프린트 → 구조체를 클릭해서 구조체를 생성한다.
- 블루프린트 구조체는 데이터 테이블의 헤더에 해당하는 부분을 정의한다.
- 예를 들어, JSON에 item_id, item_name, … 과 같은 속성이 있다면, 이에 해당하는 부분을 구조체로 만든다고 보면 된다.
- 주의할 점은 JSON에 적은 속성 이름과 “완전히” 똑같아야 인식이 된다는 것이다. 이 점 주의하자.
2- 데이터 테이블을 만든다.
- 콘텐츠 브라우저에서 오른쪽 마우스 클릭 → Miscellaneous → 데이터 테이블을 선택
- 창이 하나 뜰 텐데, 미리 만들어둔 블루프린트 구조체를 선택하면 된다. 선택을 했다면 OK 클릭
- 열린 데이터 테이블 창에서 상단 import(또는 reimport)을 클릭해서 게임데이터를 정의한 json 또는 csv 파일을 선택한다.
- 이름 실수를 하지 않았다면 데이터 테이블에 게임 데이터가 정상적으로 들어갔을 것이다.
Row0 missing key field 'name’ 오류 해결법
- JSON에서 하나의 행에 해당하는 중괄호(’{}’) 내부에는 Name이라는 속성이 반드시 있어야 한다. 해당 Name이라는 속성이 없어서 문제가 발생한 것이므로, 각 JSON 파일에 Name 속성을 추가해 주면 된다.
- Name은 나중에 데이터 테이블에서 행을 가져올 때 사용할 기본 키와 같은 역할을 하므로, 각 행을 구분할 수 있는 고유 번호 같은 게 게임데이터에 있다면, 해당 속성을 Name으로 이름을 바꿔 쓰는 것을 추천한다.
JSON + 데이터 테이블을 사용할 때 주의할 점 정리
1 - 블루프린트 구조체를 먼저 만들어야 한다.
2 - 만든 블루프린트의 필드이름은 JSON의 속성 이름과 개수가 동일해야 된다. 그렇지 않으면 원하는 대로 데이터를 가져올 수 없다.
3 - JSON에서 각 행에 해당하는 데이터에는 Name이라는 이름의 속성이 반드시 필요하다. Name은 나중에 데이터 테이블에서 행을 읽을 때 사용한다.
참고하면 좋은 자료
https://youtu.be/TNeMpOgT5ro?si=G3qsLMgN9mEmIdqY
