게임 데이터를 설계할 때는 불변 데이터와 변동 데이터를 구분하는 것이 중요하다.
| 구분 | 설명 | 예시 |
|---|---|---|
| 변하지 않는 데이터 | 게임 룰, 밸런스처럼 게임 실행 중에는 바뀌지 않는 데이터 | 캐릭터 레벨별 스탯, 몬스터 출현 정보, 스테이지 구성 |
| 변하는 데이터 | 플레이어의 상태처럼 플레이 도중 바뀌는 데이터 | 현재 경험치, 체력, 아이템, 퀘스트 진행도, 클리어한 스테이지, 설정값 등 |
기획자 중심의 콘텐츠 제작을 위해 데이터 수정이 쉽고 직관적이어야 하며, 보통 다음과 같은 형태로 데이터를 관리한다.
// 저장
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);
Resources 또는 Addressables를 통해 로드직렬화용 클래스를 따로 만들어 데이터 포맷을 관리하고 검증 필요
게임 데이터를 저장하거나 불러올 때는
전체 데이터를 복사하거나 중복 저장하는 대신, 참조 기반 구조로 설계하는 것이 좋다.
예를 들어, 아이템의 이름, 설명, 기본 능력치 등은
변하지 않는 기준 데이터로 ScriptableObject나 JSON 파일을 통해 관리하고,
플레이어가 실제로 획득한 아이템은
해당 기준 데이터를 참조하는 인스턴스 클래스(ItemInstance 등)로 관리
이 인스턴스는 플레이 중 바뀌는 값만 따로 저장한다.
즉, "불변 데이터는 참조로, 변하는 값만 별도로 저장하는 구조"가 좋다.
게임 데이터는 불변 데이터(룰, 밸런스 등)와 가변 데이터(플레이어 상태 등)를 구분하여 설계해야 유지보수성과 확장성이 높아진다.
CSV, JSON, ScriptableObject, 서버 데이터 등 다양한 방식으로 기획 데이터를 관리하며, 각 방식의 특성과 용도에 맞게 선택해야 한다.
직렬화 클래스를 따로 두어 데이터를 안정적으로 저장하고, 검증을 통해 데이터 무결성을 보장해야 한다.