광산김가네

[모각코][Unity/유니티]0825 TIL_인벤토리 기능 구현하기 본문

TIL(Today I Learn)

[모각코][Unity/유니티]0825 TIL_인벤토리 기능 구현하기

어둠의 그림자 2021. 8. 27. 18:33

이번회차에서는 주로 인벤토리창 기능을 구현해보았다.

 

1.인벤토리창

저번회차에서 만들었던 서브메뉴창과 비슷한 방식으로 인벤토리 약자인 I 키를 누르면 나타나고, 사라지는식으로 구현하려한다. 또한 아이템을 플레이어가 줍고, 인벤토리창의 칸에 담기는 기능까지 구현하려고한다. 따라서 gamemanager 스크립트의 update 함수에 아래와 같이 추가해주엇다.

void Update(){
        //Sub Menu 설정
        if(Input.GetButtonDown("Cancel")){
            if(MenuSet.activeSelf)
                MenuSet.SetActive(false);
            else
                MenuSet.SetActive(true);
        }
        //Inventory 설정
        else if(Input.GetKeyDown(KeyCode.I)){
            if(Inventory.activeSelf)
                Inventory.SetActive(false);
            else
                Inventory.SetActive(true);
        }

            
    }

여기서 Inventory는 public gameobject로 받아줄것이다.

1-1) ui설정

위의 그림과 같이 오브젝트들을 만들어주었다. 오브젝트 생성은 앞서 만든 서브메뉴와 비슷한 과정으로 만들었는데, 그중 슬롯창, 즉 아이템목록 밑에 있 일정한 규격의 네모 ui를 여러개 만들어주기위해 grid layout group 컴포넌트를 사용해주었다. (+shadow 라는 컴포넌트도 추가해주었는데 이는 ui적 부분이라 설명은 따로 기재하지않겠다)

크게 설정할수있는 부분은

-cell size: 한칸당의 크기

-spacing: 칸끼리의 거리

-child alignment: 칸들의 전체적인 정렬 

-constraint: 제한점; 열의 개수 혹은 행의 개수에 제한을 두어서 그이상 넘어가지못하도록 하는것

이 있었다.

1-2) 인벤토리창 기능구현_아이템 줍기

먼저 item 정보를 가지고있는 스크립트를 만들어주고,

그 스크립트를 받아서 리스트로(여러개의 item을 관리할것이므로) 만들수있는 오브젝트를 만들었다.

우선 도끼,책(그냥 기타 스프라이트), 꽃을 아이템db에 생성해주었다

그 다음, itemDatabase 스크립트에서 for문을 통해 public으로 받은 위치로 스프라이트들을 여러개 생성해주었다

스프라이트하나를 prefab으로 만들어주고, 그후에 오른쪽과 같이 코드로 원하는 위치에 여러개를 생성할수있게끔 만들었따

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Inventory : MonoBehaviour
{
    
  public List<Item> items = new List<Item>();
  //public delegate void OnChangeItem();
  //public OnchangeItem OnchangeItem();
  public bool AddItem(Item _item)
  {
      items.Add(_item);
      
      //OnchangeItem.Invoke();
      return true;
    
  }
  private void OnTriggerEnter2D(Collider2D collision){
      if(collision.CompareTag("FieldItem"))
      {
          Debug.Log("d");
          FieldItem fielditems = collision.GetComponent<FieldItem>();
          if(AddItem(fielditems.GetItem()))
            fielditems.DestroyItem();
      }
  }
}

위의 코드를 player에 적용시켜서  아이템을 접촉하면 리스트에 추가하게끔하였다.

 

아이템을 접촉하면 아이템이 사라지고, 해당영상에서 나오진않았지만 inspector창에서 list에 추가되었다.

1-3) 아이템 인벤토리창에 띄우기

inventoryUI라는 스크립트를 추가로 만들어 인벤토리 오브젝트에 적용시켜주었다.

<결과화면> 

 

 

이렇게해서 인벤토리창까지 구현을 완료하며 마지막회차를 마쳤다.

 

+참고영상

 

https://www.youtube.com/watch?v=74vxsqQsFHE&t=245s