본문 바로가기
Study/C#

[C#] 데이터 저장

by chobbo 2024. 4. 25.

C# 게임 저장

- 앱을 껏다 켜도 사용되던 정보 유지

- 파일 저장 & 파일 불러오기

 

Newtonsoft.Json을 사용하여 구현하였다.

 

Newtonsoft.Json 설치 방법

프로젝트 -> NuGet 패키지 관리 -> 찾아보기 -> Newtonsoft.Json 검색 & Install

 

코드 설명

using Newtonsoft.Json;

설치 후 위 구문을 통해 Newtonsoft.Json을 사용할 수 있다.

 

아래 코드 경로

 public static string path = "C:\\UnityProjects\\SpartaDungeon\\SpartaDungeon\\SpartaDungeon\\Json";

먼저 내 컴퓨터에 Json 데이터 파일들을 저장할 폴더 경로를 설정한다.

 

 

bin > Debug  > net 8.0 위치에 생성되는 경로로 수정 

 

SaveData() 

public static void SaveData()
{ 
    string userData = JsonConvert.SerializeObject(GameManager.user);
    File.WriteAllText(path + "\\UserData.json", userData);

    string inventoryData = JsonConvert.SerializeObject(Inventory.GetInventory());
    File.WriteAllText(path + "\\UserInventoryData.json", inventoryData);

    string storeData = JsonConvert.SerializeObject(GameManager.items);
    File.WriteAllText(path + "\\StoreItemData.json", storeData);
}

 

- 내가 저장할 데이터는 유저 정보, 유저 인벤토리 정보, 그리고 상점의 아이템 정보.

- 각각의 데이터를 JsonConvert.SerializeObject(데이터)를 통해 Json 파일에 넣을 값으로 직렬화

- File.WriteAllText (경로, 저장할 데이터)를 통해 해당 경로 파일에 데이터를 저장.

 

다음과 같은 과정을 거치면 Json 폴더 안에

UserData, UserInventoryData, StoreItemData json 파일이 없다면 파일이 새로 생성 & 값이 저장되고,

파일이 있으면 해당 파일에 데이터가 저장된다.

 

 

LoadData()

 public static void LoadData()
 {
     // 유저 데이터가 없을 때 -> 세이브 데이터가 없을 때
     if (!File.Exists(path + "\\UserData.json"))
     {
         GameManager.Init();
         SaveData();
         return;
     }
     else
     {
         string userLData = File.ReadAllText(path + "\\UserData.json");
         User userLoadData = JsonConvert.DeserializeObject<User>(userLData);
         GameManager.user = userLoadData;
         
         string inventoryLData = File.ReadAllText(path + "\\UserInventoryData.json");
         List<Item> inventoryLoadData = JsonConvert.DeserializeObject<List<Item>>(inventoryLData);
         if (Inventory.InventoryItems == null)
         {
             Inventory.InventoryItems = new List<Item>(); // 리스트를 초기화
         }
         foreach (Item data in inventoryLoadData)
         {
             Inventory.InventoryItems.Add(data);
         }

         string storeLData = File.ReadAllText(path + "\\StoreItemData.json");
         Item[] storeLoadData = JsonConvert.DeserializeObject<Item[]>(storeLData);
         if (GameManager.items == null)
         {
             GameManager.items = new List<Item>(); // 리스트를 초기화
         }
         foreach (Item data in storeLoadData)
         {
             GameManager.items.Add(data);
         }
     }
 }

 

 

- File.Exists(파일 - 파일 경로로 넣기)는 해당 경로에 파일이 존재하는지를 bool값으로 반환해준다.

 

- 사용자 데이터가 없다면 ?

   -> 게임을 처음 실행한 것!

   -> GameManager.Init()을 통해 초기 데이터를 설정

   -> 위의 SaveData() 함수를 불러와 Json 파일에 초기 데이터를 저장해준다.

 

- 사용자 데이터가 있다면 ?

   -> 이전에 플레이한 게임 데이터가 존재!

   -> File.ReadAllText(파일 경로)를 통해 파일을 불러와준다

   -> 해당 값을  JsonConvert.DeserializeObject<데이터 타입>(데이터) 를 통해 역직렬화 해준다.

   -> 역직렬화 된 값을 다시 내 게임에서 사용하는 변수들에 할당해주면 게임 데이터 Load 완료

 

 

 

다음과 같이 GameManager.cs에 있는 Main 함수에서 시작마을을 보여주기 전 

FileManager.LoadData()를 통해 데이터를 처리해주면 게임 저장 & 불러오기 기능이 구현된다.

    static void Main(string[] args)
    {
        FileManager.LoadData();
        Village.ShowVillage();
    }

 

그리고 유저 정보, 유저 인벤토리 정보, 그리고 상점의 아이템 정보가 갱신되는 코드마다 

FileManager.SaveData() 함수를 통해 갱신된 값을 저장해주면 완료!

 

-> 급해서 Input 값이 입력될 때마다 값이 갱신되도록 InputText.cs 내의 함수마다 넣어두었다..

추후 수정하자

 

 

SpartaDungeon - 개인 프로젝트 | Notion

스파르타 던전 (Text 게임) 만들기

 

'Study > C#' 카테고리의 다른 글

[C#] Internal Class  (0) 2024.04.29
[C#] 인터페이스  (2) 2024.04.24
[C#] 구조체, 클래스, 상속, 제너릭  (0) 2024.04.23
[C#] Random, Collection, 메서드  (0) 2024.04.22