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에 알잘딱 연결하면 인벤토리 만들기 끝~
반응형
'Today I Learned' 카테고리의 다른 글
[내일배움캠프] 실전 프로젝트 - 코드리뷰 (0) | 2024.01.26 |
---|---|
[내일배움캠프] 실전 프로젝트 - Terrain으로 맵 만들어보기 (1) | 2024.01.25 |
[내일배움캠프] 실전 프로젝트 - 게임 공통시간 만들기 (0) | 2024.01.23 |
[내일배움캠프] 실전 프로젝트 - 기술면접 연습 3 (0) | 2024.01.19 |
[내일배움캠프] 실전 프로젝트 - 기술면접 연습 2 (0) | 2024.01.18 |