티스토리 뷰



여기에 파일 저장 방법의 종류들을 적어놨습니다. 제가 사용한건 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
링크
«   2024/12   »
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
글 보관함