[고정형 데이터와 변동성 데이터 관리 전략]
● 게임 개발에서는 데이터를 크게 고정형 데이터와 변동성 데이터 두 가지 유형으로 구분할 수 있다.
● 각각의 개념과 Unity에서 이를 효율적으로 관리하는 방법에 대해 정리한다.
■ 고정형 데이터
● 게임의 룰, 설정값, 밸런스와 같이 런타임 중 변경되지 않는 정보
● 보통 외부 파일이나 ScriptableObject를 통해 관리되며 게임 로직의 기반을 구성하는 데 사용된다.
● 대표 예시
○ 무기 종류 및 스탯 테이블
○ 캐릭터의 레벨별 능력치
○ 몬스터 출현 정보
○ 스테이지 구성 및 맵 설정
● ScriptableObject 예시
[CreateAssetMenu]
public class WeaponData : ScriptableObject
{
public string id;
public int damage;
public float cooldown;
}
● 관리 방법
○ Unity 내부에서는 ScriptableOjbect를 활용
○ 외부 관리가 필요한 경우 JSON 등의 포맷으로 작성한 데이터를 로드하여 Dictionary나 List로 변환
○ Resources 또는 Addressables를 통해 동적 로딩 가능
■ 변동성 데이터
● 게임을 플레이하면서 계속해서 변경되는 정보
● 저장과 불러오기, 동기화의 대상이 되며 세이브/로드 시스템과 밀접한 관련이 있다.
● 대표 예시
○ 플레이어의 현재 경험치, 체력, 장비 상태
○ 퀘스트 진행 상황
○ 클리어한 스테이지 기록
○ 게임 설정(볼륨, 언어 등)
● 저장 구조 예시
○ Unity에서는 직렬화 가능한 구조체나 클래스를 기반으로 데이터를 저장하며 List<T>는 문제 없이 사용 가능하지만 Dictionary는 JSON 저장 시 별도의 처리 또는 커스텀 컨버터가 필요하다.
[System.Serializable]
public class PlayerSaveData
{
public int level;
public float currentHP;
public List<string> ownedItemIds;
public string lastStage;
}
■ JSON 직렬화 및 저장
● Unity에서는 JsonUtility를 활용하여 간단하게 데이터를 JSON 문자열로 직렬화하거나 역직렬화할 수 있다.
● 직렬화
PlayerSaveData data = new PlayerSaveData();
string json = JsonUtility.ToJson(data);
● 저장
string path = Application.persistentDataPath + "/save.json";
File.WriteAllText(path, json);
● 불러오기
○ Application.persistentDataPath는 플랫폼에 따라 자동으로 경로를 설정해 주며 Android/iOS/Windows 등 모든 환경에 대응된다.
if (File.Exists(path))
{
string loaded = File.ReadAllText(path);
data = JsonUtility.FromJson<PlayerSaveData>(loaded);
}
[기획 데이터 테이블 활용 전략]
● 데이터 중심 설계가 강조되는 현대 겡미 환경에서는 기획자가 데이터를 직접 수정하고 관리할 수 있는 체계가 개발 초기부터 구축되어 있어야 함
■ 기획자 협력의 중요성
● 기획 데이터는 지속적으로 수정되고 업데이트된다.
● 모든 작업을 프로그래머가 전담할 경우 개발 속도 저하 및 의사소통 오류가 발생할 수 있다.
● 이를 방지하기 위해서는 다음과 같은 구조가 필요하다.
○ 기획자가 데이터를 직접 수정 가능
○ 데이터 구조는 단순하고 명확하게 유지
○ 수정된 데이터를 바로 게임에 반영될 수 있는 포맷으로 제공
■ 기획 테이블 활용 방식
● 기획자들은 주로 엑셀 기반으로 데이터를 작성하며 개발자는 이를 게임 내에서 활용 가능한 포맷으로 제공한다.
● CSV 파일
○ 기획자가 가장 익숙한 엑셀 기반 포맷
○ .csv로 저장하여 Unity에서 직접 파싱하거나 JSON/SO 등으로 변환
○ 간단한 구조의 데이터 관리에 적합
id, name, damage, cooldown
sword_001, Iron Sword, 10, 1.2
sword_002, Silver Sword, 15, 1.0
● JSON 파일
○ 계층적 데이터 구조를 가진 포맷
○ 배열, 중첩된 데이터 등을 표현하기 용이
○ 엑셀 데이터를 스크립트로 JSON으로 변환하여 활용
[
{
"id": "sword_001",
"name": "Iron Sword",
"damage": 10,
"cooldown": 1.2
},
...
]
● ScriptableObject(SO)
○ Unity 에디터 내부에서 직관적으로 데이터 관리 가능
○ 직렬화된 데이터 형태로 성능과 직결되는 요소에 유리
○ 에디터 확장을 통해 기획자도 직접 수정 가능
[CreateAssetMenu]
public class WeaponData : ScriptableObject
{
public string id;
public string name;
public int damage;
public float cooldown;
}
● 서버 데이터
○ 실시간 변경이 필요한 경우 서버 데이터를 활용
○ 라이브 서비스 중 밸런스 변경, 이벤트 설정 등에 적합
○ 원격에서 데이터를 조작하고 클라이언트는 이를 동적으로 반영
■ 참고 링크
● https://github.com/npckero/ExcelToJsonWizard
GitHub - npckero/ExcelToJsonWizard: A tool for converting Excel data to JSON files and generating C# loader classes for use in U
A tool for converting Excel data to JSON files and generating C# loader classes for use in Unity. - npckero/ExcelToJsonWizard
github.com
'내일 배움 캠프 > 뭐하지' 카테고리의 다른 글
| 저작권 (3) | 2025.06.22 |
|---|---|
| UniTask, UniRx (0) | 2025.06.22 |
| Addressable (0) | 2025.06.17 |
| 직렬화 (0) | 2025.06.11 |
| 코드 최적화 & 프로파일러 (0) | 2025.06.10 |