[유니티] json을 이용하여 아이템 저장

yesman·2021년 7월 22일
0

Unity

목록 보기
1/9

한 맵에서 주운 아이템으로 채운 인벤토리와 무기 인벤토리를 다른 맵에서도 보이게 하기 위해 저장을 구현하였다.

https://www.youtube.com/watch?v=stm7DakcxG8&t=591s
이 영상을 보고 따라했다.

이 푸딩 마을에서 주운 아이템을 다른 마을에서도 보이게 하고 싶었다.

customJson

제이슨 파일로 저장하기 위해
customJson.cs 를 작성했다.
이 스크립트를 통해
json파일을 읽고, json파일로 변환할 수 있다.

public static List<T> FromJson<T>(string json)
    {
        Wrapper<T> wrapper = UnityEngine.JsonUtility.FromJson<Wrapper<T>>(json);
        return wrapper.items;
    }

이 메소드를 이용해서 저장한 json파일을 읽는다.

public static string ToJson<T>(List<T> list)
    {
        Wrapper<T> wrapper = new Wrapper<T>();
        wrapper.items = list;
        return JsonUtility.ToJson(wrapper);
    }

이 메소드를 이용해서 json파일로 변환한다.

SaveandLoad

실제 데이터를 변환하고
읽어서 실제 데이터에 반영한다.

Save

public class ItemLoad
{
    public int id, slotIndex;
    public ItemLoad(int ID, int SLOTINDEX)
    {
        id = ID;
        slotIndex = SLOTINDEX;
    }
}

아이템의 아이디와 아이템이 들어가 있는 슬롯의 인덱스를 식별하기 위해 ItemLoad라는 클래스를 만든다.

List<ItemLoad> itemsToLoad = new List<ItemLoad>();
for(int i = 0; i < Inventory.instance.items.Count; i++)
{
	Item z = Inventory.instance.items[i];
	if (!z.isDefaultItem)
	{
		ItemLoad h = new ItemLoad(z.id, i);
		itemsToLoad.Add(h);
		Debug.Log(h.id);
	}
}

itemsToLoad라는 리스트를 생성한다.
for문의 i는 아이템이 들어가 있는 슬롯의 인덱스이다.
h를 정의하고 itemsToLoad에 저장한다.

string json = customJSON.ToJson(itemsToLoad);

json파일로 변환하기 위해 문자열 타입 json을 생성한다.

File.WriteAllText(Application.persistentDataPath + transform.name, json);

json파일 저장.

Load

List<ItemLoad> itemsToLoad = customJSON.FromJson<ItemLoad>(File.ReadAllText(Application.persistentDataPath + transform.name));

저장한 json파일을 itemsToLoad라는 리스트에 저장한다

for(int i = itemsToLoad[0].slotIndex; i < InventoryUI.instance.slots.Length; i++)
        {
            foreach(ItemLoad z in itemsToLoad)
            {
                Debug.Log(z.id);
                if(i == z.slotIndex)
                {
                    Item b = Instantiate(items[z.id]);
                    if(itemsToLoad.Count == Inventory.instance.items.Count)
                    {
                        Inventory.instance.items.Remove(b);
                        break;
                    }
                    //InventorySlot.instance.ClearSlot();
                    Inventory.instance.items.Add(b);
                    InventoryUI.instance.UpdateUI();
                    Debug.Log("넣는중,...");
                    Debug.Log("itemsToLoad.Count: " + itemsToLoad.Count);
                    Debug.Log("items.Length: " + Inventory.instance.items.Count);
                    //break;
                }
            }
        }

i를 itemsToLoad의 첫번재의 슬롯 인덱스로 정한다.
리스트 itemsToLoad의 값들을 foreach문으로 접근해준다.
아이템의 아이디로 식별하여 해당 아이템을 복제하여 b에 저장한다.
계속 로드해서 같은 아이템들이 쌓이는 것을 방지 하기 위해 개수가 같으면 삭제하는 것을 넣었다.
인벤토리에 b를 넣고 ui에 인벤토리의 값들을 반영한다.

다른 맵에서의 인벤토리.
같은 아이템들이 저장되어 있는 것을 볼 수 있다.

profile
유니티

0개의 댓글