일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Oculus
- 앱 배포
- 연습
- HAPTIC
- 드래곤 플라이트 모작
- 유니티 UI
- ChatGPT
- meta
- CGV
- 오브젝트 풀링
- 유니티
- VR
- XR
- Photon Fusion
- meta xr
- OVR
- 개발일지
- 가상현실
- 유니티 GUI
- 유니티 Json 데이터 연동
- 팀프로젝트
- 드래곤 플라이트
- 개발
- input system
- 길건너 친구들
- 팀 프로젝트
- 모작
- 오큘러스
- 포트폴리오
- 멀티플레이
Archives
- Today
- Total
EasyCastleUNITY
JSON 파일 및 대리자 응용 연습 본문
-------------------------------------------------------------------데이터-----------------------------------------------------------------------------
ItemData
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LearnDotnet
{
//기초 정보 -> 생성자 생성 안 함
public class ItemData
{
public int id;
public string name;
public int damage;
}
}
MonsterData
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LearnDotnet
{
//기초 정보 -> 생성자 없음
public class MonsterData
{
public int id;
public string name;
public int item_id;
public int maxHp;
}
}
HeroData
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LearnDotnet
{
public class HeroData
{
public int id;
public string name;
public int damage;
public int maxHp;
public HeroData(int id, string name, int damage)
{
this.id = id;
this.name = name;
this.damage = damage;
this.maxHp = 30;
}
}
}
---------------------------------------------------------------------객체 생성 클래스---------------------------------------------------------------------
Item
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LearnDotnet
{
public class Item
{
private ItemData data;
public string Name
{
get
{
return this.data.name;
}
}
public Item(ItemData data)
{
this.data = data;
}
public int GetID()
{
return this.data.id;
}
public int GetDamage()
{
return this.data.damage;
}
}
}
Monster
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LearnDotnet
{
public class Monster
{
private MonsterData data;
private int maxHp;
private int hp;
public Action onDie;
public Monster(MonsterData data)
{
this.data = data;
this.maxHp = data.maxHp;
this.hp = this.maxHp;
Console.WriteLine("{0} , 체력 : {1}/{2}",data.name,hp,maxHp);
}
public void HitDamage(int damage)
{
this.hp -= damage*100;
if (this.hp <= 0)
{
this.hp = 0;
}
Console.WriteLine("{0}이(가) 공격받았습니다. \n {0}의 체력 : {1}/{2}"
, this.data.name,hp,maxHp);
//죽으면 Die 함수 실행
if(this.hp <= 0)
{
this.Die();
}
}
public int GetMonsterItemId()
{
return this.data.item_id;
}
public string GetMonsterName()
{
return this.data.name;
}
//Die에서 대리자 onDie 불러옴 ---> Game 클래스로 넘어감
private void Die()
{
Console.WriteLine("몬스터 {0}가(이) 죽었습니다", this.data.name);
//대리자 호출
this.onDie();
}
}
}
Hero
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LearnDotnet
{
public class Hero
{
private HeroData data;
private int maxHp;
private int hp;
private int damage;
private Inventory bag;
private Item equipItem;
public Hero(HeroData data)
{
this.data = data;
this.maxHp = data.maxHp;
this.hp = this.maxHp;
this.damage = data.damage;
Console.WriteLine("{0}, 공격력 : {3} /체력 : {1}/{2}", data.name, hp, maxHp,data.damage);
}
public void HitDamage(int damage)
{
this.hp -= damage;
Console.WriteLine("{0}이(가) 공격받았습니다. \n {0}의 체력 : {1}/{2}"
, this.data.name, hp, maxHp);
}
public void Equip(int id)
{
//가방에서 아이템이 있는지 검색
if (this.bag.Exist(id))
{
//착용
equipItem = this.bag.GetItem(id);
this.damage += equipItem.GetDamage();
Console.WriteLine("{0}을 착용했습니다. 공격력 +{1} 현재공격력: {2}", equipItem.Name, equipItem.GetDamage(), this.damage);
}
else
{
Console.WriteLine("아이템 {0}을 찾을 수 없습니다");
}
}
public void Attack(Monster monster)
{
monster.HitDamage(this.damage);
}
public void SetBag(Inventory inven)
{
this.bag = inven;
Console.WriteLine("{0}칸 짜리 가방을 지급받았습니다",this.bag.GetCapacity());
}
public void SetItem(Item item)
{
bag.AddItem(item);
Console.WriteLine("{0}을 가방에 저장했습니다", item.Name);
}
public int GetItemCount()
{
return this.bag.Count;
}
}
}
Inventory
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LearnDotnet
{
public class Inventory
{
private int capacity;
private List<Item> items = new List<Item>();
public int Count
{
get
{
return this.items.Count;
}
}
//생성자
public Inventory(int capacity)
{
this.capacity = capacity;
}
public void AddItem(Item item)
{
this.items.Add(item);
Console.WriteLine("{0} {1} 이 가방에 들어갔습니다.", item.GetID(), item.Name);
}
public int GetCapacity()
{
return this.capacity;
}
public bool Exist(int id) //inventory에 해당 아이템이 있는지 검색
{
//2개동일
Item item = this.items.Find(x => x.GetID() == id);
if (item == null) return false;
else return true;
//for(int i=0; i<this.items.Count; i++)
//{
// if (this.items[i].GetID() == id)
// {
// Console.WriteLine("찾았다");
// return true;
// }
//}
//return false;
}
public Item GetItem(int id) //inventory에서 아이템을 받아옴
{
// return this.items.Find(x => x.GetID() == id);
Item foundItem = null;
for(int i=0; i<this.items.Count; i++)
{
if (this.items[i].GetID() == id)
{
foundItem = this.items[i];
//리스트에서 제거
this.items.Remove(foundItem);
break;
}
}
return foundItem;
}
}
}
-----데이터 관리 클래스 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>();
Dictionary<int, MonsterData> monsterDic = new Dictionary<int, MonsterData>();
ItemData[] itemDatas;
MonsterData[] monsterDatas;
//생성자
private DataManager()
{
}
public void LoadItemData()
{
string itemJson = File.ReadAllText("./item_data.json");
//역직렬화 하면 ItemData객체들을 요소로 하는 배열 객체가 나온다.
itemDatas = JsonConvert.DeserializeObject<ItemData[]>(itemJson);
foreach(ItemData itemData in itemDatas)
{
// Console.WriteLine("item's id: {0}, item's name: {1}, item's damage: {2}", itemData.id, itemData.name, itemData.damage);
itemDic.Add(itemData.id, itemData);
}
//Console.WriteLine(itemDic.Count);
}
public void LoadMonsterData()
{
string monsterJson = File.ReadAllText("./monster_data.json");
monsterDatas = JsonConvert.DeserializeObject<MonsterData[]>(monsterJson);
foreach(MonsterData monsterData in monsterDatas)
{
// Console.WriteLine("Monster's id: {0}, Monster's name: {1}, Monster's item_id: {2}, Monster's maxHp: {3}",
// monsterData.id, monsterData.name, monsterData.item_id, monsterData.maxHp);
monsterDic.Add(monsterData.id, monsterData);
}
//Console.WriteLine(monsterDic.Count);
}
public MonsterData GetMonsterData(int id)
{
return this.monsterDic[id];
}
public ItemData GetItemData(int id)
{
return this.itemDic[id];
}
}
}
-------------Game----------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LearnDotnet
{
public class Game
{
private Hero hero;
private Monster monster;
public Game()
{
}
public void Start()
{
Console.WriteLine("게임이 시작되었습니다");
this.hero = this.CreateHero(); //영웅 생성
this.monster = this.CreateMonster(1000); //몬스터 생성
//대리자 실행
this.monster.onDie = () =>
{
//아이템 생성
int itemId = this.monster.GetMonsterItemId();
Item dropitem = this.CreateItem(itemId);
Console.WriteLine("{0}이 죽었습니다 \n {1} 아이템이 나왔습니다", monster.GetMonsterName(), dropitem.Name);
//아이템 획득
this.hero.SetItem(dropitem);
int itemCount = this.hero.GetItemCount();
Console.WriteLine(itemCount);
};
//가방 만들어서 영웅에게 지급
Inventory bag = new Inventory(5);
this.hero.SetBag(bag);
//무기 지급 (장검)
Item item = this.CreateItem(100);
this.hero.SetItem(item);
//장비 착용하기
this.hero.Equip(100);
//몬스터 공격하기
this.hero.Attack(this.monster);
}
private Hero CreateHero()
{
return new Hero(new HeroData(10000,"Arthor",3));
}
private Monster CreateMonster(int id)
{
MonsterData data = DataManager.instance.GetMonsterData(id);
return new Monster(data);
}
private Item CreateItem(int id)
{
ItemData data = DataManager.instance.GetItemData(id);
return new Item(data);
}
private void MonsterAttack()
{
Console.WriteLine("몬스터 {0} 이(가) 영웅{1}을 공격했다");
}
private void HeroAttack()
{
}
}
}
실행
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
{
private Game game;
public App()
{
// ------------------게임 준비 -----------------
DataManager.instance.LoadItemData();
DataManager.instance.LoadMonsterData();
//----------------------------------------------
//----------게임 시작 ----------------
this.game = new Game();
this.game.Start();
}
}
}
'C#프로그래밍' 카테고리의 다른 글
미션 만들기 (저장 빼고) (1) | 2023.07.30 |
---|---|
JSON 파일을 통한 데이터 읽기 및 대리자 복습 (0) | 2023.07.29 |
2023/07/27 복습 (0) | 2023.07.27 |
JSON 파일을 활용한 아이템 정보 저장 프로젝트의 전체적인 흐름 및 복습 (0) | 2023.07.27 |
JSON 파일을 활용하여 아이템 정보 저장하기 (0) | 2023.07.27 |