8년차 모션그래픽디자이너의 고군분투

[Unity Engine] 인벤토리 시스템 구현하기 -5- | 아이템 수집해서 인벤토리 창에 넣기 | C#, Inventory System, 포션 아이템 관리하기 본문

코자이너/Unity

[Unity Engine] 인벤토리 시스템 구현하기 -5- | 아이템 수집해서 인벤토리 창에 넣기 | C#, Inventory System, 포션 아이템 관리하기

쓰리디사람3Dperson 2024. 3. 20. 12:58
반응형

 

저 같은 경우는 플레이어 상태창에서도 포션에 접근이 가능했고 인벤토리에서도 포션에 접근이 가능한 기능을 구현하려고 했기 때문에 좀 복잡했습니다.

때문에 포션 아이템 스크립트를 따로 만들어야 했습니다.

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
using UnityEngine.UI;

public class ItemPotion : MonoBehaviour
{
    public static ItemPotion Instance;
    public ItemData item;
    public Image PositionIcon;
    public TextMeshProUGUI Count;

    private void Start()
    {
        Instance = this;
        item.Value = 1;
        Refresh();
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.LeftControl)) 
        {
            EatPotion();
        }
        Refresh();
    }
    public void EatPotion()
    {
        if (item.Value > 0)
        {
            item.Value -= 1;
            FindObjectOfType<Player>().Heal(10);
        }
        else if (item.Value == 0)
        {
            InventoryManager.Instance.Remove(item);
        }
        else
        {
            return;
        }
        Refresh();
    }
    public void Refresh()
    {
        if (item.Value > 0)
        {
            PositionIcon.sprite = item.Icon;
            Count.text = $"{item.Value}";
        }
        else if (item.Value == 0)
        {
            Count.text = "0";
        }
        else
        {
            return; 
        }
    }
}

인벤토리에 넣을 인벤토리 스크립트입니다. 여기서 인벤토리 UI를 최종적으로 관리해줍니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEditor.Progress;

public class Inventory : MonoBehaviour
{
    public static Inventory instance { get; private set; }

    public UI_InventoryDescription InventoryDescriptionUI;

    void Start()
    {
        instance = this;
        this.gameObject.SetActive(false);
        InventoryManager.onItemChangedCallback += UpdateUI;
        // 인벤토리에 아이템이 있으면 추가
    }

    private void OnDestroy()
    {
        InventoryManager.onItemChangedCallback -= UpdateUI;
        // 인벤토리에 아이템이 없으면 삭제
    }

    public void UpdateUI()
    {
/*        // 인벤토리 UI 슬롯을 모두 비활성화합니다.
        foreach (var slot in ItemInventoryUISlots)
        {
            slot.gameObject.SetActive(false);
        }*/

        // 인벤토리에 있는 각 아이템에 대해 UI 슬롯을 활성화하고, 아이템 정보를 표시합니다.
        for (int i = 0; i < InventoryManager.Instance.items.Count; i++)
        {
            InventoryManager.Instance.ItemInventoryUISlots[i].gameObject.SetActive(true);
            InventoryManager.Instance.ItemInventoryUISlots[i].itemIconNameText.text = InventoryManager.Instance.items[i].Name;
            InventoryManager.Instance.ItemInventoryUISlots[i].itemNameText.text = InventoryManager.Instance.items[i].Name;
            InventoryManager.Instance.ItemInventoryUISlots[i].itemDescriptionText.text = InventoryManager.Instance.items[i].Description;
            InventoryManager.Instance.ItemInventoryUISlots[i].itemIconImage.sprite = InventoryManager.Instance.items[i].Icon;
            InventoryManager.Instance.ItemInventoryUISlots[i].itemBigImage.sprite = InventoryManager.Instance.items[i].BigImage;
            InventoryManager.Instance.ItemInventoryUISlots[i].countitemText.text = $"{InventoryManager.Instance.items[i].Value}";
            // ItemInventoryUISlots[i].CurrentitemData = items[i]; // 필요에 따라 추가
        }
    }


}

 

미숙한 코드지만 비전공자로서 2개월동안 유니티 씨샵을 배우고 작성해본 코드입니다.

도움이 되었으면 좋겠습니다.

반응형
Comments