유니티3D 프로그래밍

C# 3주차 4일 수업 내용 : JSON (21.03.25) 본문

C#/수업내용

C# 3주차 4일 수업 내용 : JSON (21.03.25)

tjdgus9955 2021. 3. 25. 10:46

JSON 복습

 

using System;
using System.IO;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Linq;
namespace Study01
{
   
    public class App
    {
        public App()
        {
            Console.WriteLine("App");
            string txt1 = File.ReadAllText("./ItemData.json");
            string txt2 = File.ReadAllText("./Item_Grade.json");
            Console.WriteLine(txt1);

            //역직렬화

            ItemGrade[] itemGrades = JsonConvert.DeserializeObject<ItemGrade[]>(txt2);
            ItemData[] itemDatas = JsonConvert.DeserializeObject<ItemData[]>(txt1);
            Dictionary<int, ItemData> dicItemData;
            Dictionary<int, ItemGrade> dicItemGrade;
            dicItemGrade = itemGrades.ToDictionary(x => x.id);
            dicItemData = itemDatas.ToDictionary(x => x.id);

            Console.WriteLine("-----------------------------------");
            foreach(KeyValuePair<int, ItemData> pair in dicItemData)
            {
                ItemData data = pair.Value;
                Console.WriteLine("{0} {1} {2} {3} {4}", data.id, data.name, data.grade_type, data.damage, data.sell_price);
            }
            Console.WriteLine("-----------------------------------");
            foreach (KeyValuePair<int, ItemGrade> pair in dicItemGrade)
            {
                ItemGrade data = pair.Value;
                Console.WriteLine("{0} {1} {2} {3} {4}", data.id, data.name, data.grade_type, data.sprite_name, data.desc);
            }

        }

    }
}
using System;

namespace Study01
{
    class ItemData
    {
        public int id;
        public string name;
        public int grade_type;
        public float damage;
        public int sell_price;
    }
}
using System;

namespace Study01
{
    class ItemGrade
    {
        public int id;
        public string name;
        public int grade_type;
        public string sprite_name;
        public string desc;
    }
}
[
  {
    "id": "100",
    "name": "장검",
    "grade_type": "0",
    "damage": "6",
    "sell_price": "600"
  },
  {
    "id": "101",
    "name": "단검",
    "grade_type": "0",
    "damage": "5",
    "sell_price": "500"
  },
  {
    "id": "102",
    "name": "활",
    "grade_type": "1",
    "damage": "4.5",
    "sell_price": "500"
  },
  {
    "id": "103",
    "name": "도끼",
    "grade_type": "1",
    "damage": "6.5",
    "sell_price": "650"
  },
  {
    "id": "104",
    "name": "창",
    "grade_type": "2",
    "damage": "7",
    "sell_price": "700"
  },
  {
    "id": "105",
    "name": "지팡이",
    "grade_type": "3",
    "damage": "4",
    "sell_price": "400"
  }
]
[
  {
    "id": "100",
    "name": "일반",
    "grade_type": "0",
    "sprite_name": "grade_00",
    "desc": "일반입니다"
  },
  {
    "id": "101",
    "name": "마법",
    "grade_type": "1",
    "sprite_name": "grade_01",
    "desc": "마법입니다"
  },
  {
    "id": "102",
    "name": "희귀",
    "grade_type": "2",
    "sprite_name": "grade_02",
    "desc": "희귀입니다"
  },
  {
    "id": "103",
    "name": "전설",
    "grade_type": "3",
    "sprite_name": "grade_03",
    "desc": "전설입니다"
  }
]

 

Singleton 패턴

- 카테고리 생성 패턴(Creational Pattern)
- 개요 : Singleton 디자인 패턴은 하나의 클래스가 단지 하나의 인스턴스
만 갖도록 제한하고 전역 범위에서 그 인스턴스를 엑세스할 수 있게 하는
패턴이다. 이 패턴은 시스템 전체에 걸쳐 하나의 인스턴스가 모든 처리를
조율해야 하는 곳에 유용하다.

 

using System;
using System.IO;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Linq;
namespace Study01
{
   
    public class App
    {
        public App()
        {
            Console.WriteLine("App");
            DataManager.GetInstance().LoadWeaponData("./weapon_data.json");
            var data = DataManager.GetInstance().dicWeaponData[100];
            Console.WriteLine("{0}, {1}", data.id, data.name);

        }

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

namespace Study01
{
    public class DataManager
    {
        private static DataManager instance;
        public Dictionary<int, WeaponData> dicWeaponData;
        //생성자
        public DataManager()
        {

        }

        public static DataManager GetInstance()
        {
            if(DataManager.instance == null)
            {
                DataManager.instance = new DataManager();
            }
            return DataManager.instance;
        }

        public void LoadWeaponData(string path)
        {
            var json = File.ReadAllText(path);
            var arr = JsonConvert.DeserializeObject<WeaponData[]>(json);
            this.dicWeaponData = arr.ToDictionary(x => x.id);
            Console.WriteLine(dicWeaponData.Count);
        }
    }
}

싱글톤 패턴

using System;
using System.IO;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Linq;
namespace Study01
{
   
    public class App
    {
        public App()
        {
            Console.WriteLine("App");
            DataManager.GetInstance().LoadItemData("./ItemData.json");
            var data = DataManager.GetInstance().dicItemData[100];

            DataManager.GetInstance().LoadItemGrade("./Item_Grade.json"); ;
            var grade = DataManager.GetInstance().GetItemGrade(data.id);

            Console.WriteLine("{0}, {1}, {2}, {3}", data.id, data.name, grade.name, grade.desc);

        }

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

namespace Study01
{
    public class DataManager
    {
        private static DataManager instance;
        public Dictionary<int, ItemGrade> dicItemGrade;
        public Dictionary<int, ItemData> dicItemData;
        //생성자
        public DataManager()
        {

        }

        public static DataManager GetInstance()
        {
            if(DataManager.instance == null)
            {
                DataManager.instance = new DataManager();
            }
            return DataManager.instance;
        }

        public void LoadItemGrade(string path)
        {
            var json = File.ReadAllText(path);
            var arr = JsonConvert.DeserializeObject<ItemGrade[]>(json);
            this.dicItemGrade = arr.ToDictionary(x => x.id);
            Console.WriteLine(dicItemGrade.Count);
        }

        public void LoadItemData(string path)
        {
            var json = File.ReadAllText(path);
            var arr = JsonConvert.DeserializeObject<ItemData[]>(json);
            this.dicItemData = arr.ToDictionary(x => x.id);
            Console.WriteLine(dicItemData.Count);
        }

        public ItemGrade GetItemGrade(int gradeId)
        {
            return this.dicItemGrade[gradeId];
        }
    }
}

 

JSON File 추가

using System;
using System.IO;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Linq;
namespace Study01
{
   
    public class App
    {
        public App()
        {
            Console.WriteLine("App");

            List<string> options = new List<string>()
            {
                "일반몬스터 추가 데미지",
                "보스몬스터 추가 데미지",
                "기본공격력 +3"
            };
            //직렬화 할 객체 생성 (xxxInfo 클래스)
            ItemInfo itemInfo = new ItemInfo(1, "일반", 10.5f, false, options);

            //직렬화 : 객체 -> 문자열 (JSON)
            string json = JsonConvert.SerializeObject(itemInfo);
            Console.WriteLine(json);

            //파일 저장
            File.WriteAllText("./item_info.json", json);

        }

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

namespace Study01
{
    public class ItemInfo
    {
        public int id;
        public string itemType;
        public float damage;
        public bool isTest;
        public List<string> options;
        //생성자
        public ItemInfo(int id, string itemType, float damage, bool isTest, List<string> options)
        {
            this.id = id;
            this.itemType = itemType;
            this.damage = damage;
            this.isTest = isTest;
            this.options = options;
        }
    }
}

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

namespace Study01
{
   
    public class App
    {
        public App()
        {
            Console.WriteLine("App");

            DataManager.GetInstance().LoadQuestData("./quest_data.json");
            var questData = DataManager.GetInstance().dicQuestData[1000];

            DataManager.GetInstance().LoadQuestReward("./quest_reward.json");
            var questReward = DataManager.GetInstance().dicQuestReward[questData.reward_id];

            Console.WriteLine("{0} {1} {2} {3}", questData.id, questData.name, questReward.id, questReward.quest_reward);

          
            Console.WriteLine();
            //버튼 생성 
            Button btn = new Button();


            //이벤트 등록 
            btn.onClick += (sender, args) =>
            {
                PrintQuestDetails(questData);
            };

            //5초후 
            Thread.Sleep(1000);

            //버튼 클릭 
            btn.Click();

        }

        private void PrintQuestDetails(QuestData questData)
        {
            Console.WriteLine("**** 목표 ****");

            string goalDesc = string.Format(questData.goal_desc, questData.goal_count);
            Console.WriteLine(goalDesc);

            Console.WriteLine("**** 내용 ****");
            Console.WriteLine(questData.desc);

            Console.WriteLine("**** 보상 ****");
            var reward = DataManager.GetInstance().dicQuestReward[questData.reward_id];
            Console.WriteLine("{0} x {1}", reward.quest_reward , questData.reward_count);
        
        }

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

namespace Study01
{
    public class DataManager
    {
        private static DataManager instance;
        public Dictionary<int, MonsterData> dicMonsterDatas;
        public Dictionary<int, QuestData> dicQuestData;
        public Dictionary<int, QuestReward> dicQuestReward;
        //생성자
        public DataManager()
        {

        }

        public static DataManager GetInstance()
        {
            if (DataManager.instance == null)
            {
                DataManager.instance = new DataManager();
            }
            return DataManager.instance;
        }

        public void LoadMonsterData(string path)
        {
            var json = this.ReadFile(path);
            var arr = JsonConvert.DeserializeObject<MonsterData[]>(json);
            this.dicMonsterDatas = arr.ToDictionary(x => x.id);
        }

        public void LoadQuestData(string path)
        {
            var json = this.ReadFile(path);
            var arr = JsonConvert.DeserializeObject<QuestData[]>(json);
            this.dicQuestData = arr.ToDictionary(x => x.id);
        }

        public void LoadQuestReward(string path)
        {
            var json = this.ReadFile(path);
            var arr = JsonConvert.DeserializeObject<QuestReward[]>(json);
            this.dicQuestReward = arr.ToDictionary(x => x.id);
        }
        public string ReadFile(string path)
        {
            string json = File.ReadAllText(path);
            return json;
        }
    }
}
using System;

namespace Study01
{
    public class QuestReward
    {
        public int id;
        public string quest_reward;
        public int item_amount;
        public string item_image;
    }
}