EasyCastleUNITY

JSON 파일을 활용하여 아이템 정보 저장하기 본문

C#프로그래밍

JSON 파일을 활용하여 아이템 정보 저장하기

EasyCastleT 2023. 7. 27. 17:40

https://cafe.naver.com/hansungkkdigital?iframe_url=/MyCafeIntro.nhn%3Fclubid=31020909 

 

한성대 K디지털 유니티 : 네이버 카페

한성대 K디지털 유니티

cafe.naver.com

DataManager -> 받은 정보를 관리하는 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;

namespace LearnDotnet
{
    public class DataManager
    {
        //멤버 변수 
        public static readonly DataManager instance = new DataManager();
        Dictionary<int, ItemData> itemDic = new Dictionary<int, ItemData>();
        ItemData[] arrItemDatas;
        //생성자
        private DataManager()
        {
            
            
            
        }
        

        public void LoadItemDatas()
        {
            //문자열 -> 객체 (역직렬화)
            string json = File.ReadAllText("./item_data.json");
            arrItemDatas = JsonConvert.DeserializeObject<ItemData[]>(json);
            itemDic = new Dictionary<int, ItemData>();
            //dictionary에 옮겨담기 
            // 1.
            foreach (ItemData data in arrItemDatas)
            {
                Console.WriteLine("item's id: {0}, item's name: {1}, item's damage: {2}", data.id, data.name, data.damage);
                itemDic.Add(data.id, data);
            }
            //2.
           // arrItemDatas.ToDictionary(x => x.id);
            Console.WriteLine(itemDic.Count);
        }

        public ItemData GetItemData(int id)
        {
            return this.itemDic[id];
        }
    }
}

ItemData: 아이템의 기본정보 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LearnDotnet
{
    public class ItemData
    {
        //id name    damage
        //int string int
        public int id;
        public string name;
        public int damage; 

    }
}

ItemInfo: 저장을 하기 위해 필요한 정보를 가지고 있는 클래스 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LearnDotnet
{
    //저장객체
    public class ItemInfo
    {
        //멤버
        public int id;
        public int damage;
        //생성자
        public ItemInfo(int id, int damage)
        {
            this.id = id;
            this.damage = damage;
        }
    }
}

Item: 아이템을 생성하는 클래스

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LearnDotnet
{
    public class Item
    {
        ItemInfo info;
        public string Name
        {
            get { ItemData data = DataManager.instance.GetItemData(this.info.id);
                return data.name;
            }
        }
        //생성자
        public Item(ItemInfo info)
        {
            this.info = info;
        }

        public void Enhence()
        {
            this.info.damage *= 2;
        }

        public int GetID()
        {
            return this.info.id;
        }

        public int GetDamage()
        {
            return this.info.damage;
        }

        public ItemInfo GetInfo()
        {
            return this.info;
        }

    }
}

실행 : 아이템을 저장

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using Newtonsoft;
using Newtonsoft.Json;

namespace LearnDotnet
{
    //형식 정의
    public class App
    {

        public App()
        {
            //게임 시작전에 게임에서 사용할 데이터를 로드
            DataManager.instance.LoadItemDatas();

            //--------------------------------------
            //게임 시작
            //--------------------------------------


            //파일이 있는가?
            if (File.Exists("./item_info.json"))
            {
                //있다: 기존유저
                Console.WriteLine("기존유저입니다");
                string json = File.ReadAllText("./item_info.json");
                //역질려화 문자열 -> 객체
                ItemInfo info = JsonConvert.DeserializeObject<ItemInfo>(json);
                Item item = new Item(info);
                int id = item.GetID();
                string name = item.Name;
                int damage = item.GetDamage();

                Console.WriteLine("ID: {0}", id);
                Console.WriteLine("이름: {0}", name);
                Console.WriteLine("공격력: {0}", damage);

            }
            else
            {
                //기본 무기: 신규유저
                ItemData data = DataManager.instance.GetItemData(100);
                ItemInfo info = new ItemInfo(data.id, data.damage);
                Item item = new Item(info);
                int id = item.GetID();
                string name = item.Name;
                int damage = item.GetDamage();

                Console.WriteLine("ID: {0}", id);
                Console.WriteLine("이름: {0}", name);
                Console.WriteLine("공격력: {0}", damage);

                //저장, 직렬화: 객체 -> 문자열
                string json = JsonConvert.SerializeObject(item.GetInfo());
                Console.WriteLine(json);
                //파일로 저장
                File.WriteAllText("./item_info.json", json);
            }
        }


    }

}