유니티3D 프로그래밍
C# 3주차 4일 수업 내용 : JSON (21.03.25) 본문
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;
}
}
'C# > 수업내용' 카테고리의 다른 글
C# 3주차 5일 수업 내용 : File, Thread (21.03.26) (0) | 2021.03.26 |
---|---|
Json 파일 로딩 (0) | 2021.03.24 |
C# 3주차 3일 수업 내용 : 이벤트 및 File (21.03.24) (0) | 2021.03.24 |
C# 3주차 2일 수업 내용 : LINQ 및 람다, EVENT(21.03.23) (0) | 2021.03.23 |
C# 3주차 1일 수업 내용 : Delegate, Callback (21.03.22) (0) | 2021.03.22 |