개요

이전에 정리한 NewtonSoft.Json (Unity) 을 바탕으로

세이브 & 로드 시스템을 구현해본다.

Save/Load System

1. Save & Load 데이터 식별 및 데이터 객체 클래스 구현

먼저 저장해야 할 게임 데이터를 식별하여 이를 모두 포함하는 데이터 클래스를 정의 해야한다.

이 글을 작성할 때 진행하였던 프로젝트의 데이터를 예시로 진행해보겠다.

저장할 데이터 목록
1. 플레이어 자원 (long 타입 / 골드, 민심, 신앙심, 노동력, 의지, 사기)
2. 현재 스테이지(int 타입)
3. 카드(객체)의 강화 수치(int 타입 / 카드 객체는 딕셔너리로 관리 중)
4. 타이쿤에서의 카드 선택 단계 (int 타입)
[System.Serializable]
public class SaveData {
    // 자원 데이터
    public long gold;
    public long labor;
    public long faith;
    public long pop;      // 민심 
    public long morale;
    public long intent;   // 의지

    // 진행 상태
    public int currentStage;
    public GameState gameState;      // 저장 시점의 게임 상태 
    public int cardChoiceCount;      // 경영 단계에서 이미 선택한 카드 수

    // 카드 강화 상태 (카드 ID -> 강화 레벨 맵)
    public Dictionary<int, int> cardLevels = new Dictionary<int,int>();
}

2. SaveManager의 Save() 구현

데이터 클래스 작성이 끝나면 이 객체에 담아서 저장하는 역할을 하는 Save() 메소드를 구현한다.

public static class SaveManager {
    public static void SaveGame() {
        SaveData data = new SaveData();
        //  현재 게임 데이터 채우기
        data.currentStage = GameManager.Instance.CurrentStage;
        data.gameState   = GameManager.Instance.CurrentState;
         // 현재까지 선택한 카드 수
        data.cardChoiceCount = TycoonCardManager.Instance.CardChoiceCount;

        // 플레이어 자원 값 저장
        var pem = PlayerEconomyManager.Instance;
        data.gold   = pem.Gold;
        data.labor  = pem.Labor;
        data.faith  = pem.Faith;
        data.pop    = pem.Pop;
        data.morale = pem.Morale;
        data.intent = pem.Intent;

        // 카드 강화 상태 저장: 모든 카드 딕셔너리를 조회하여 레벨>0인 카드 기록
        data.cardLevels = new Dictionary<int,int>();
        foreach (var kvp in CardManager.Instance.ResourceCards) {
            if (kvp.Value.Level > 0)
                data.cardLevels[kvp.Key] = kvp.Value.Level;
        }
        foreach (var kvp in CardManager.Instance.ExtraResourceCards) {
            if (kvp.Value.Level > 0)
                data.cardLevels[kvp.Key] = kvp.Value.Level;
        }
        // TurretStatCards, TurretModeCards, TacticalCards 등도 동일하게 반복
        // ...

        // JSON 직렬화 및 파일 저장
        string json = JsonConvert.SerializeObject(data, Formatting.Indented);
        string filePath = System.IO.Path.Combine(Application.persistentDataPath, "savegame.json");
        System.IO.File.WriteAllText(filePath, json);
        Debug.Log($"게임 진행 데이터를 저장했습니다. 경로: {filePath}");
    }
}

dataSaveData 객체로, 저장할 데이터를 모두 포함하여 가지고 있는 객체이다.

플레이어 자원과 게임 스테이지를 저장하고

딕셔너리를 통해서 키는 카드의 ID로, 값은 카드의 강화 수치를 받아서 저장한다.

이렇게 data 객체는 아래 코드를 통해서 JSON으로 직렬화된다.