C#) Text RPG 4
오늘은 저장 및 불러오기 기능을 구현해 봤다.
일단 나는 마야를 사용하면서 종종 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파일로 캐릭터 객체를 저장한다.

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파일로 아이템을 저장한다.

게임 불러오기 (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

Save및Load기능을 수동으로도 접근 가능하게 설정
case "6":
// 저장하기
core.SaveGame();
Thread.Sleep(1000);
break;
case "7":
// 불러오기
core.LoadGame();
Thread.Sleep(1000);
break;
작은 발표회
이번 프로젝트는 개인 프로젝트였다.
개인적으로는 게임이 진행되는 과정들을 하나하나 느껴볼 수 있었던 프로젝트다.
또한, C#과 친해지는 경험이 되었다.
아무래도 개인 프로젝트라서, 팀원들과 소통이 많지는 않았다.
팀원 중 한 분이 팀원끼리 코드 리뷰도 해보고, 작동 시연 하는 발표회를 주도 해주셨다.
각자 자기소개와 함께 자신만의 TextRPG를 시연 및 코드 리뷰를 통해, 서로의 스타일을 알아 가는 시간을 가졌다.
전공자, 전직자, 현직자 등 다양한 분들이 하나의 팀에 모였고, 다음 과제를 향해 포기하지 않고 함께 나아가면 좋겠다.
ㅁ
팀원 분들과 캠프에서 제공한 답안지를 훑어보며, 다른 스타일의 코드도 눈에 익혀놔야겠다. (물론 구현 방식도 제각각)
댓글남기기