티스토리 뷰
여기에 파일 저장 방법의 종류들을 적어놨습니다. 제가 사용한건 XML 입니다.
XML은 요즘에 굉장히 많이 사용되는 형식입니다.
눈에 굉장히 잘들어오고 데이터도 수정하기 매우 쉽기 때문이죠
이번에도 제가 Inventory를 만들어 왔습니다.
그 일부분의 코드를 이용해서 더욱 자세한 설명해드리겠습니다.
using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.UI; public class Inventory : MonoBehaviour { public ItemContainer itemContainer { get; private set; } public List<Transform> items { get; private set; } public GameObject instance { get; private set; } string dir = Path.Combine(Application.dataPath, "Resources/XML/items.xml"); //초기화 public void Initialize() { if(GameObject.Find("Inventory") == null) { GameObject _inventory = Resources.Load<GameObject>("Prefab/Inventory"); GameObject canvas = GameObject.Find("Canvas"); instance = Instantiate(_inventory, canvas.transform); instance.name = "Inventory"; } //파일이 존재하는지 체크합니다. //만약 파일이 없다면 새로운 XML을 만듭니다. //파일이 있다면 XML을 로드합니다. FileInfo info = new FileInfo(dir); //파일 존재X //새로운 아이템 컨테이너를 만들고 XML로 만든다. if(!info.Exists) { itemContainer = new ItemContainer(); itemContainer.Save(dir); } //아이템 로드 else { Load(); } } //아이템 추가 하는 함수 public void AddItem(Item item) { itemContainer.items.Add(item); Save(); Load(); } public void Save() { itemContainer.Save(dir); } public void Load() { itemContainer = ItemContainer.Load(dir); if (instance.transform.childCount <= 0) { return; } items = new List<Transform>(instance.GetComponentsInChildren<Transform>()); if (items != null) { foreach (Item item in itemContainer.items) { items[item.gridCount * 2].name = "Change"; items[item.gridCount * 2].GetComponentInChildren<Image>().sprite = Resources.Load<Sprite>("Texture/" + item.textureName); } } } }
인벤토리 클래스입니다. 이부분은 XML에서 데이터를 파싱을해 아이템을 추가 합니다.
using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using System.Xml.Serialization; [XmlRoot("ItemCollection")] public class ItemContainer { [XmlArray("Items"), XmlArrayItem("Item")] public List<Item> items = new List<Item>(); public void Save(string path) { var serializer = new XmlSerializer(typeof(ItemContainer)); using (var stream = new StreamWriter( new FileStream(path, FileMode.Create), Encoding.UTF8)) { serializer.Serialize(stream, this); } } public static ItemContainer Load(string path) { var serializer = new XmlSerializer(typeof(ItemContainer)); using (var stream = new FileStream(path, FileMode.Open)) { return serializer.Deserialize(stream) as ItemContainer; } } public static ItemContainer LoadFromText(string text) { var serializer = new XmlSerializer(typeof(ItemContainer)); return serializer.Deserialize(new StringReader(text)) as ItemContainer; } }
이부분이 제일 중요하다고 볼수있습니다
이 클래스는 MonoBehavior를 상속하면 안됩니다.
그리고 [XmlRoot("ItemContanier")]를 붙히면 XML의 가장 최상위 태그가 됩니다.
그 밑에 [XmlArray("Items"), XmlArrayItem("Item")] 부분은 Items라는 이름의 태그를 만들고
그 안에 Item이라는 태그를 배열처럼 여러개 저장하겟다는것입니다.
using System.Xml.Serialization; //데이터만 존재해야함 //상속 X public class Item { [XmlAttribute("Name")] public string _name; [XmlAttribute("TexturePath")] public string textureName; public int gridCount; }
Item클래스는 데이터만 존재합니다
[XmlArttribute("")]는 태그를 달때 이 태그를 구분지어줄(?) 이름을 넣는것 같습니다 ( <<이 부분은 확실치않아요 댓글로 알려주세요)
public Inventory inventory { get; private set; } void Start () { inventory = new Inventory(); inventory.Initialize(); }
인벤토리를 가져야하는 캐릭터 (ex 플레이어) 같은 클래스에 이 코드를 추가 시키면 인벤토리가 생성됩니다.
마지막으로 제가 만든 프로토타입을 영상을 보여드리겠습니다.
※코딩지적및비판은 저에게 많은 도움이됩니다.
※코딩질문 또한 많은 도움이 됩니다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 2048 코드
- 게임
- DirectX
- C++
- 노맨즈 스카이
- 파일저장
- 표창 키우기
- 프로그래밍
- 시간 능력
- PlayerPrefs
- Tap-Titans
- 기경
- 불러오기
- STL
- Unity
- DirectX9
- 기능경기
- UI
- ObjectPool
- c#
- 프레임워크
- load
- Save
- 저장
- Serialization
- 직렬화
- 오브젝트풀
- 3D
- ObjectPooling
- 몬티홀 딜레마
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함