오늘은 저장 및 불러오기 기능을 구현해 봤다.

일단 나는 마야를 사용하면서 종종 json을 이용해본 경험이 있다.

json을 사용했던 이유는, 딕셔너리 자료형을 그대로 저장하고 불러올 수 있는 기능 때문이었다.

그래서 기존 경험에 따라 C#에도 json이 유효한지 찾아보고 아래 기능들을 작성해보기 시작했다.

게임 저장 (Core.cs)

SaveGame

// 게임 저장 메서드
public void SaveGame()
{
    try { SaveCharacter(character); }
    catch { Failed("캐릭터 저장"); }

    try { SaveItems(items); }
    catch { Failed("아이템 저장"); }
}
  • try-catch를 활용해 성공과 실패를 구분한다.
  • 캐릭터와 아이템 따로 저장한다.

SaveCharacter

void SaveCharacter(Character _char)
{
    // 캐릭터 저장
    string filePath = Path.Combine(projectDir, "data", "character.json");
    string jsn = JsonSerializer.Serialize(_char
                , new JsonSerializerOptions { WriteIndented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping });
    File.WriteAllText(filePath, jsn);
    Console.WriteLine("캐릭터 저장 완료!");
    Console.WriteLine(filePath);
}
  • 캐릭터를 저장 하기 위한 메서드
  • filePath는 프로젝트 경로와 상대 경로를 합친다.
  • json파일로 캐릭터 객체를 저장한다.

image-20250205154752562

SaveItem

void SaveItems(List<Item> _items)
{
    // 아이템 저장
    string filePath = Path.Combine(projectDir, "data", "items.json");
    string json = JsonSerializer.Serialize(_items
        , new JsonSerializerOptions { WriteIndented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping });
    File.WriteAllText(filePath, json);
    Console.WriteLine("아이템 저장 완료!");
    Console.WriteLine(filePath);
}
  • 아이템을 저장 하기 위한 메서드

  • json파일로 아이템을 저장한다.

    image-20250205154839569

게임 불러오기 (Core.cs)

LoadGame

public void LoadGame()
{
    try
    {
        LoadCharacter(character);
    }
    catch { Failed("캐릭터 불러오기"); }

    try
    {
        LoadItems(ref items);
    }
    catch { Failed("아이템 불러오기"); }
}

LoadCharacter

void LoadCharacter(Character _char)
{   
    // 캐릭터 로드
    string filePath = Path.Combine(projectDir, "data", "character.json");
    string jsn = File.ReadAllText(filePath);

    Dictionary<string, JsonElement> jsonData = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(jsn);

    _char.Name = jsonData["Name"].GetString();
    _char.Level = jsonData["Level"].GetInt32();
    _char.DGtry = jsonData["DGtry"].GetInt32();
    _char.Job = jsonData["Job"].GetString();
    _char.Attack = jsonData["Attack"].GetSingle();
    _char.Defense = jsonData["Defense"].GetInt32();
    _char.HP = jsonData["HP"].GetInt32();
    _char.Gold = jsonData["Gold"].GetInt32();
    _char.Armor = JsonSerializer.Deserialize<Item>(jsonData["Armor"].GetRawText());
    _char.Weapon = JsonSerializer.Deserialize<Item>(jsonData["Weapon"].GetRawText());

    Console.WriteLine("캐릭터 불러오기 완료!");
    Console.WriteLine(filePath);
}
  • Character를 매개변수로 받아와, json에 저장된 내용을 객체로 직접 넣어준다.

LoadItems

void LoadItems(ref List<Item> _items)
{
    // 아이템 로드
    string filePath = Path.Combine(projectDir, "data", "items.json");
    string jsn = File.ReadAllText(filePath);

    List<Item> loadItems = new List<Item>();
    loadItems =  JsonSerializer.Deserialize<List<Item>>(jsn);

    _items = loadItems;
    Console.WriteLine("아이템 불러오기 완료!");
    Console.WriteLine(filePath);
}
  • ref를 통해 items 리스트에 덮어 씌울 수 있도록 구성

저장 시점

종료시 자동 저장

// Core.cs
public void Update()
{
    // Scene 진입
    currentScene.Enter();

    // 다음 Scene 지정
    Scene nextScene = currentScene.Exit();
    currentScene = nextScene;

    // 게임 종료시 저장
    if (!isRun)
    {
        SaveGame();
    }
}
  • StartScene에서 종료 시, 자동 저장 기능

StartScene

image-20250205191527836

  • SaveLoad 기능을 수동으로도 접근 가능하게 설정
case "6":
    // 저장하기
    core.SaveGame();
    Thread.Sleep(1000);
    break;

case "7":
    // 불러오기
    core.LoadGame();
    Thread.Sleep(1000);
    break;

작은 발표회

이번 프로젝트는 개인 프로젝트였다.

개인적으로는 게임이 진행되는 과정들을 하나하나 느껴볼 수 있었던 프로젝트다.

또한, C#과 친해지는 경험이 되었다.

아무래도 개인 프로젝트라서, 팀원들과 소통이 많지는 않았다.

팀원 중 한 분이 팀원끼리 코드 리뷰도 해보고, 작동 시연 하는 발표회를 주도 해주셨다.

각자 자기소개와 함께 자신만의 TextRPG를 시연 및 코드 리뷰를 통해, 서로의 스타일을 알아 가는 시간을 가졌다.

전공자, 전직자, 현직자 등 다양한 분들이 하나의 팀에 모였고, 다음 과제를 향해 포기하지 않고 함께 나아가면 좋겠다.

팀원 분들과 캠프에서 제공한 답안지를 훑어보며, 다른 스타일의 코드도 눈에 익혀놔야겠다. (물론 구현 방식도 제각각)

댓글남기기