TextRpg만들기 과제중 가장 마지막 도전과제인 게임을 껏다켜도 데이터가 저장되게 하라고 해서 JSON을 공부하게 되었음

 

해당 JSON에 관한 내용은 Unity에서도 자주 사용하게 될것으로 보이기도 해서 TIL로 작성하기로 채택~ 

 

다른글은 더이상 쓰지 않고 JSON을 사용하는데 필요한 코드들의 코드블럭과 주석으로 모든 설명을 하겠음

 

첫번째로 저장과 불러오는 기능을 해줄 메서드 및 클래스

    public class SaveLoadSystem
    {
        //게임 데이터가 저장될 파일 경로를 지정
        private static string filePath = "gameData.json";

        //데이터 저장용 메서드
        //저장을 위해선 ? GameData를 해당 메서드에 전달해줘야 그 내용을 저장할 수 있음
        public static void SaveGame(GameData data)
        {
            // 데이터를 JSON형식으로 직렬화 하는 코드
            //Formatting.Indented 이부분은 들여쓰기를 적용하는 "옵션"
            string json = JsonConvert.SerializeObject(data, Formatting.Indented);
            //위에서 직렬화 한 JSON데이터를 파일로 저장
            File.WriteAllText(filePath, json);
            // 출력 및 슬립을 줘서 사용자가 저장중인것을 인지시킴
            Console.WriteLine("진행상황을 저장중입니다...");
            Thread.Sleep(3000);
        }

        //데이터 불러오기용 메서드
        public static GameData LoadGame()
        {
            //데이터 파일이 있는지 확인하고
            if (File.Exists(filePath))
            {
                //JSON데이터를 문자열로 변환
                string json = File.ReadAllText(filePath);
                //JSON형식의 문자열을 GameData객체로 변환해주는 코드 (압축과 압축풀기로 이해하면 매우 쉬움)
                GameData data = JsonConvert.DeserializeObject<GameData>(json);
                Console.WriteLine("진행상황을 불러오는 중입니다...");
                Thread.Sleep(3000);
                //불러온 변환한 데이터를 반환해서 게임내에 반영
                return data;
            }
            else
            {
                Console.WriteLine("불러올 파일이 없습니다.");
                Thread.Sleep(3000);
                return null;
            }
        }
    }

 

그리고 게임 내에서 호출해서 사용할 저장 메서드

        public void Save()
        {
            // GameData객체를 생성하고 현재 가지고있는 저장해야할 변수들을 넣어줌
            GameData gameData = new GameData
            {
                level = level,
                exp = exp,
                liveHp = liveHp,
                gold = gold,
                Inventory = inventory.ToArray() // 리스트를 배열로 변환하여 저장 (리스트그대로 JSON화가 힘들다고 함)
            };
            //JSON화 하여 파일로 저장하는 메서드를 호출하고 GameData객체를 넣어줌
            SaveLoadSystem.SaveGame(gameData);
        }

다음은 불러오기용 메서드

        public void Load()
        { 
            //saveLoadSystem을 통해 저장된 데이터를 불러옴
            GameData loadedData = SaveLoadSystem.LoadGame();
            // 데이터가 들어있으면
            if (loadedData != null)
            {// loadedData안에 있는 값들을 변수들에 넣어줌
                level = loadedData.level;
                exp = loadedData.exp;
                liveHp = loadedData.liveHp;
                gold = loadedData.gold;
                inventory = new List<Item>(loadedData.Inventory); // 배열을 리스트로 변환
            }
        }

이렇게 작성하고

 

저장이 필요한곳에 Save();

불러오기가 필요한곳에 Load();

 

나는 자동저장 및 불러오기를 하려다가 저장과 불러오기를 메인화면에 넣어놓고 사용자가 선택할수 있게 함

 

 

 

+ 수정사항

 

주의 !!이렇게만 작성한다고 json이 적용되는것이 아닙니다 !!

 

비쥬얼 스튜디오 2022기준 상단에 도구 > NuGet 패키지 관리자 > 솔루션용 NuGet 패키지 관리... 클릭 후

찾아보기에서 Json을 검색 Newtonsoft.Json 클릭 원하는 프로젝트 클릭 하시고 설치

 

제 프로젝트에서 사용된 using 문은 아래와 같습니다.

using System;
using System.IO;
using System.Timers;
using System.Collections;
using System.Collections.Generic;
using System.Net.Security;
using Newtonsoft.Json;