C# Unity 인벤토리 만들기

삐얅·2024년 7월 22일
0

유니티

목록 보기
14/20

1. 개요

메트로바니아 팀 프로젝트를 진행하면서 습득한 아이템 정보와 레퍼런스 삼은 할로우나이트를 참고해 장착이 가능한 인벤토리가 필요해졌다. 현재 구현한 아이템은 더블점프가 가능한 기본 아이템으로 메트로바니아의 장르 특성상 장착 여부가 필요한 아이템 종류는 아니었기에 현재 아이템을 습득하면 인벤토리에 출력되게끔 코드를 작성했다.

2. 코드

using System.Collections;
using System.Collections.Generic;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.TextCore.Text;

public class Inventory : MonoBehaviour
{
    public ItemSlot[] slots;

    public GameObject inventoryUI;
    public Transform slotPanel;

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

    private int curEquipIndex;

    private void Start()
    {
        CharacterManager.Instance.Player.addItem += AddItem;
        slots = new ItemSlot[slotPanel.childCount];

        for(int i = 0; i < slots.Length; i++)
        {
            slots[i] = slotPanel.GetChild(i).GetComponent<ItemSlot>();
            slots[i].index = i;
            slots[i].inventory = this;
            slots[i].Clear();
        }
    }

    public bool IsOpen()
    {
        return inventoryUI.activeInHierarchy;
    }

    public void AddItem()
    {
        Debug.Log("additem");
        ItemData data = CharacterManager.Instance.Player.itemData;

        ItemSlot emptySlot = GetEmptySlot();

        if(emptySlot != null )
        {
            emptySlot.item = data;
            UpdateInventory();
            CharacterManager.Instance.Player.itemData = null;
            return;
        }
    }

    ItemSlot GetEmptySlot()
    {
        for(int i = 0; i < slots.Length; i++)
        {
            if (slots[i].item == null)
            {
                return slots[i];
            }
        }

        return null;
    }

    public void UpdateInventory()
    {
        for(int i = 0; i < slots.Length; i++)
        {
            if (slots[i].item != null)
            {
                slots[i].SetItem();
            }

            else
            {
                slots[i].Clear();
            }
        }
    }

    private void ClearSelectItem()
    {
        selectedItem = null;

        itemName.text = string.Empty;
        itemDescription.text = string.Empty;
    }
}

3. 정리

플레이어가 소지중인 아이템 데이터에 델리게이트를 사용해서 아이템을 추가해줬다. 델리게이트는 함수나 메서드를 참조하고 호출할 수 있는 형식으로 코드를 더 유연하고 확장 가능하게 작성할 수 있다. 앞서 사용한 Action 등이 예시이다.
변수로는 아이템들을 담을 배열인 slots, 인벤토리의 활성화 상태를 조절하기 위해 GameObject로 가져와 주고, 부모 오브젝트의 위치인 slotPanel을 가져왔다.
아래의 텍스트들은 아이템을 선택하면 이름과 소개로 변경할 수 있게 미리 가져왔다.
slots 배열을 초기화 해주고 플레이어의 addItem 델리게이트에 메서드를 추가해준다.
슬롯의 인덱스와 인벤토리 참조를 설정한 후 슬롯을 초기화 해준다.
AddItem으로 플레이어의 아이템 데이터에 해당 아이템을 추가해주고(해당 로직은 Item클래스에 들어있다) 아이템이 비어있을 경우 null을 반환해준 후 슬롯에 해당 아이템들을 반영해준다. 이 후 UpdateInventory를 통해 인벤토리를 최신화 한다.
UpdateInventory는 아이템이 있는 슬롯은 아이템을 설정하고, 없는 슬롯은 슬롯을 초기화 해준다.
ClearselectItem은 선택한 아이템을 초기화 해주는 메서드인데 아직 아이템을 선택하는 기능을 짜두지 않아 작동하지 않는다.

0개의 댓글

관련 채용 정보