Inventory.cs

using System.Collections;
using System.Collections.Generic;
using TMPro;
using Unity.VisualScripting.Antlr3.Runtime.Misc;
using UnityEngine;

public class ItemSlot
{
    public ItemSO Item;
    public int Quantity;
}

public class Inventory : MonoBehaviour
{
    public ItemSlotUI[] UISlots;
    public ItemSlot[] Slots;

    public GameObject InventoryUI;

    [Header("Selected Item")]
    private ItemSlot selectedItem;
    private int selectedItemIndex;
    public TextMeshProUGUI selectedItemName;
    public TextMeshProUGUI selectedItemDescription;

    private void Start()
    {
        InventoryUI.SetActive(false);
        Slots = new ItemSlot[UISlots.Length];

        for (int i = 0; i < Slots.Length; i++)
        {
            Slots[i] = new ItemSlot();
            UISlots[i].index = i;
            UISlots[i].Clear();
        }
        ClearSeletecItem();
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.I))
        {
            ToggleInventoryUI();
        }
    }

    private void ToggleInventoryUI()
    {
        InventoryUI.SetActive(!InventoryUI.activeSelf);
    }

    public void AddItem(ItemSO item)
    {
        ItemSlot slotToStackTo = GetItemStack(item); // 이미 아이템이 있는지 체크
        if (slotToStackTo != null)
        {
            slotToStackTo.Quantity++; // 있다면 수량 증가
            UpdateUI();
            return;
        }

        ItemSlot emptySlot = GetEmptySlot();

        if (emptySlot != null)
        {
            emptySlot.Item = item;
            emptySlot.Quantity = 1; // 처음 획득하면 들어오는 부분
            UpdateUI();
            return;
        }
    }

    ItemSlot GetItemStack(ItemSO item) //최대수량보다 적은 아이템 중복 체크
    {
        for (int i = 0; i < Slots.Length; i++)
        {
            if (Slots[i].Item == item && Slots[i].Quantity < item.MaxStackAmount)
            {
                return Slots[i];
            }
        }
        return null;
    }

    ItemSlot GetEmptySlot() // 빈슬롯 찾기
    {
        for (int i = 0; i < Slots.Length; i++)
        {
            if (Slots[i].Item == null)
            {
                return Slots[i];
            }
        }
        return null;
    }

    void UpdateUI()
    {
        for (int i = 0; i < Slots.Length; i++)
        {
            if (Slots[i].Item != null) //슬롯에 아이템이 있으면 같은 인덱스의 UI슬롯에 넣는다.
            {
                UISlots[i].Set(Slots[i]);
            }
            else
            {
                UISlots[i].Clear();
            }
        }
    }

    public void SelectItem(int index) // 선택한 아이템 하단에 정보 표시
    {
        if (Slots[index].Item == null) return;

        selectedItem = Slots[index];
        selectedItemIndex = index;

        selectedItemName.text = selectedItem.Item.ObjName;
        selectedItemDescription.text = selectedItem.Item.Description;
    }

    private void ClearSeletecItem()
    {
        selectedItem = null;
        selectedItemName.text = string.Empty;
        selectedItemDescription.text = string.Empty;
    }

    public void RemoveItem(ItemSO item, int num)  // 아이템 판매하거나 타이쿤에 들어가는 재료
    {
        ItemSlot selectItem = GetItemStack(item);
        if (selectItem != null)
        {
            if (num > selectItem.Quantity)
            {
                //error
            }
            else if (num == selectItem.Quantity)
            {
                selectItem.Item = null;
                selectItem.Quantity = 0;
            }
            else
            {
                selectItem.Quantity -= num;
            }
        }

        UpdateUI();
    }

}

 

ItemSlotUI.cs

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class ItemSlotUI : MonoBehaviour
{
    public Button button;
    public Image Sprite;
    public TextMeshProUGUI QuatityText;
    private ItemSlot _curSlot;

    public int index;

    public void Set(ItemSlot slot)
    {
        _curSlot = slot;
        Sprite.gameObject.SetActive(true);
        Sprite.sprite = slot.Item.Sprite;
        QuatityText.text = slot.Quantity > 0 ? slot.Quantity.ToString() : string.Empty;
    }

    public void Clear() 
    {
        _curSlot = null;
        Sprite.gameObject.SetActive(false);
        QuatityText.text = string.Empty;
    }

    public void OnButtonClick() //버튼 클릭시 하단에 아이템 정보 변화
    {
        GameManager.instance.Inventory.SelectItem(index);
    }
}

 

ItemObject.cs 중 플레이어가 상호작용할 때 호출 되는 메서드

public void GetItem()
{
    GameManager.instance.Inventory.AddItem(ItemData); //인벤토리에 담기는 부분

    if (ItemData.type == ItemType.DROPITEM)
    {
        Destroy(gameObject);
    }
    else if (ItemData.type == ItemType.NATUREITEM)
    {
        gameObject.SetActive(false);
        _itemRespawner.ItemWaitSpawnList.Add(gameObject);
    }
}

 

이후 유니티에서 UI에 알잘딱 연결하면 인벤토리 만들기 끝~

반응형