게임 데이터 설계 [TIL 30일차]

장민제·2025년 5월 23일

내일배움캠프

목록 보기
33/41
post-thumbnail

🔧 변하지 않는 데이터 vs 변하는 데이터

게임 데이터를 설계할 때는 불변 데이터와 변동 데이터를 구분하는 것이 중요하다.

구분설명예시
변하지 않는 데이터게임 룰, 밸런스처럼 게임 실행 중에는 바뀌지 않는 데이터캐릭터 레벨별 스탯, 몬스터 출현 정보, 스테이지 구성
변하는 데이터플레이어의 상태처럼 플레이 도중 바뀌는 데이터현재 경험치, 체력, 아이템, 퀘스트 진행도, 클리어한 스테이지, 설정값 등

🗂️ 기획 테이블 활용 방식

기획자 중심의 콘텐츠 제작을 위해 데이터 수정이 쉽고 직관적이어야 하며, 보통 다음과 같은 형태로 데이터를 관리한다.

✅ CSV (엑셀 기반)

  • 기획자가 엑셀로 작성한 데이터를 CSV로 저장 후 Unity에서 파싱
  • 가장 쉬운 접근법이며 가볍고 빠름

✅ JSON 파일

  • CSV보다 구조화된 데이터 표현이 가능
  • 중첩된 배열, 복잡한 구성에 적합
// 저장
PlayerSaveData data = new PlayerSaveData();
string json = JsonUtility.ToJson(data);
File.WriteAllText(path, json);

// 불러오기
if (File.Exists(path)) {
    string json = File.ReadAllText(path);
    PlayerSaveData data = JsonUtility.FromJson<PlayerSaveData>(json);

✅ ScriptableObject

  • Unity 에디터 상에서 직접 데이터를 관리할 수 있는 에셋
  • 변하지 않는 데이터 관리에 적합
  • Resources 또는 Addressables를 통해 로드
  • 외부 JSON을 파싱한 데이터를 ScriptableObject에 적용하는 방식도 가능

✅ 서버 데이터

  • 실시간 변경이 필요한 데이터는 서버에서 관리
  • 원격 수정 및 유저 개인화 데이터에 적합 (예: 이벤트 정보, 랭킹 등)

직렬화용 클래스를 따로 만들어 데이터 포맷을 관리하고 검증 필요


📝 파싱과 참조 설계

게임 데이터를 저장하거나 불러올 때는
전체 데이터를 복사하거나 중복 저장하는 대신, 참조 기반 구조로 설계하는 것이 좋다.

예를 들어, 아이템의 이름, 설명, 기본 능력치 등은
변하지 않는 기준 데이터ScriptableObjectJSON 파일을 통해 관리하고,

플레이어가 실제로 획득한 아이템은
해당 기준 데이터를 참조하는 인스턴스 클래스(ItemInstance 등)로 관리

이 인스턴스는 플레이 중 바뀌는 값만 따로 저장한다.

즉, "불변 데이터는 참조로, 변하는 값만 별도로 저장하는 구조"가 좋다.


📌 정리

  • 게임 데이터는 불변 데이터(룰, 밸런스 등)와 가변 데이터(플레이어 상태 등)를 구분하여 설계해야 유지보수성확장성이 높아진다.

  • CSV, JSON, ScriptableObject, 서버 데이터 등 다양한 방식으로 기획 데이터를 관리하며, 각 방식의 특성과 용도에 맞게 선택해야 한다.

  • 직렬화 클래스를 따로 두어 데이터를 안정적으로 저장하고, 검증을 통해 데이터 무결성을 보장해야 한다.

profile
Unity, C#

0개의 댓글