ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스파르타3D서바이벌게임 / ItemSlot 만들기 / 유니티숙련주차
    스파르타 게임 개발 2024. 6. 4. 13:43

    인벤토리를 만들기에 앞서 인벤토리에 표시 할 아이템슬롯 오브젝트를 만들어 주자. 이 아이템 슬롯을 여러 개 만들고 아이템을 줍게 되면 아이템 슬롯에 해당 데이터들이 저장 되게 하고 표시 되게 해주자. 

     

    이 아이템 슬롯은 UI로써 이미지를 통해서 만들어주고 Icon과 몇 개를 가지고 있는지 글자도 보이게 만들어 주자.

    이런 느낌에 아이템 슬롯을 만들어 준다. 

     

    그리고 이제 이 아이템 슬롯이 내가 주운 아이템을 표시하게 Script를 작성 해주면 된다. 그 전에 Inventory 화면을 다 만들어 두고 Script를 작성 하자. 

     

    이렇게 인벤토리 뒷면을 만들어 준다. 그리고 저 빈 공간에 아이템 슬롯을 미리 만들어 두면 된다. 이 때 빈 객체를 하나 생성 하고 저 빈공간에 알맞은 사이즈를 맞춘 후에 grid layout group 컴포넌트를 추가 시켜준 다음에 아이템 슬롯의 size 만큼 cell size를 맞춰서 이 빈 객체에 아이템슬롯을 추가 시켜주면 자동으로 정렬을 시켜줄 수가 있다. 

     

    이렇게 인벤토리창을 만들어 준다. 

     

    이 때 아이템 슬롯과 인벤토리 뒷면을 따로 나눈 이유가 있다. 

    그것 또한 관리하기 쉽게 하기 위함이라고 할 수 있는데, 아이템 슬롯은 주운 아이템의 정보를 등록 하고, 인벤토리에 있는 설명과 사용, 해제, 버리기 버튼은 주운 아이템을 선택 후에 사용 하는 것이다. 

     

    뭔가 느낌이 다른 것을 알 수가 있을 것이다. 

     

    아무튼 그래서 우리는 아이템슬롯과, 인벤토리를 구분 지어서, 아이템 슬롯은 아이템을 주웠을 때의 정보가 등록이 되어서 icon과 수량이 나타나게 할 것이고, 주운 아이템의 data를 가지게 할 것이다. 

    그리고 인벤토리에서 아이템 슬롯을 선택 할 경우에 선택한 아이템슬롯에 있는 아이템에 data를 가져와서 사용이나, 해제, 버리기 등을 할 수 있게 만들 것이다. 그리고 버릴 경우에는 아이템 슬롯이 다시 비어지게 한다.

     

    먼저 ItemSlot 클래스를 만들어 보자. 

     

    아이템 슬롯은 아이템의 데이터를 갖고 있어야 한다. 그래야 슬롯을 눌렀을 때 데이터를 넘겨줄 수가 있다. 

     

     public ItemData item;

    코드를 작성 해줘서 아이템 데이터를 가질 수 있게 해준다. 이 데이터는 나중에 AddItem이라는 함수를 통해서 초기화를 하게 해줄 것이다. 나중에 설명 하겠다. 

     

    그리고 icon과 button이 있어야 하기에 그것도 만들어 준다. 그리고 자막도, 그리고 우린 장착 된 아이템에 OutLine이라는 컴포넌트가 나오게 할 것이다. (테두리에 다른 색 나오게 지정 가능) 이것까지 만들어 준다. 

     

    public Button button;
    public Image icon;
    public TextMeshProUGUI quantityText;
    private Outline outline;

     

    그리고 우리는 나중에 Inventory에 있는 함수를 호출 할 것이기에 인벤토리도 만들어 준다. 

     

    public UIInventory inventory; 

    이 변수는 나중에 UIInventory에서 초기화를 해줄 것이다. this를 통해서, 나중에 UIInventory에서 start 할 때 아이템 슬롯들의 정보를 업데이트 할 것이고 그 때 아이템들의 this를 통해서 값도 초기화 하게 할 것이다. 

     

    그 이유는 ItemSlot들을 호출 하는 것을 UIInventory 하나로 관리 하기 위함이라고 할 수 있다. 인벤토리에서 아이템슬롯들을 초기화 해주고, 내가 원하는 인덱스에 맞는 아이템슬롯에 함수들을 호출 시키는 것이다. 

     

    그리고 

        public int index;
        public bool equipped;
        public int quantity;

    도 만들어 줘서 나중에 활용 할 수 있게 한다. index는 배열 접근 할 때 활용, quantity는 아이템의 수량이다. 

     

    먼저 아이템슬롯의 아이템 데이터가 들어왔다면 그걸 표시하는 함수를 만들어 주자. 

     

    public void Set()
    {
        icon.gameObject.SetActive(true);
        icon.sprite = item.icon;
        quantityText.text = quantity > 1 ? quantity.ToString() : string.Empty;

        if (outline != null)
        {
            outline.enabled = equipped;
        }
    }

     

    이렇게 만들어 줄 것인데, 보면 item에 값이 있어야 정상 작동 하는 것을 볼 수가 있다. 이 item에 값을 넣는 방법에는 여러가지가 있다. 우린 interaction을 통해 직접 이 아이템에 값을 넣어줄 수가 있지만 이번엔 그러지 않고, UIInventory를 이용해서 이 ItemSlot에 있는 item에 값을 넣어 줄 것이다. 

     

    Interaction을 사용하여 아이템을 상호작용키를 눌렀다면, 인베토리에 아이템을 추가 하는 함수가 실행이 되고, 그 함수는 빈 슬롯을 찾고, 빈 슬롯에다가 상호작용한 아이템을 집어 넣는다. 집어 넣는 방법은 그 빈슬롯인 아이템슬롯에 선택 한 아이템 Data가 들어가게 하고, 이 Set 함수를 작동 하게 하는 것이다. 나중에 다시 설명 하겠다. 

     

    그리고 아이템을 버렸을 때 등록 돼있는 ItemData를 지우게 할 함수도 만들어 준다. \

    public void Clear()
    {
        item = null;
        icon.gameObject.SetActive(false);
        quantityText.text = string.Empty;
    }

    이렇게 하면 item에 들어있는 data를 없애고 자막과 아이콘도 비어두게 한다. 

     

    그리고 이 아이템슬롯에 버튼을 등록 해뒀는데, 이 아이템슬롯을 누르면 실행 되게 하는 함수도 만들어 준다.

     

    public void OnClickButton()
    {
        inventory.SelectItem(index);
    }

    라는 코드를 작성해서 inventory에 있는 SelectItem를 호출 하게 해준다. 왜 inventory에 있는 함수냐.

    선택 된 아이템의 정보가 나오게 하고, 그 아이템을 사용 및 버리기 등을 사용 하는 버튼은 inventory가 있다. 아까 말 했듯 이 아이템 슬롯은 선택 하고 주운 아이템의 data를 저장 할 클래스라고 생각 하면 좋다. 

     

    그리고 마지막으로 아이템슬롯의 OutLine을 만들어 주는 코드만 작성을 해준다.

      private void Awake()
      {
          outline = GetComponent<Outline>();
      }

      private void OnEnable()
      {
          outline.enabled = equipped;
      }

     

    OnEnable은 equipped의 값에 따라 outline 활성화를 하고 안하고를 해줄 수 있게 하는 것이다. 나중에 자세히 설명.

    지금은 equipped(장착여부)가 true라면 outline이 활성화 된다. 

     

    이제 이 ItemSlot들을 갖고 있는 UIInventory 클래스를 만들어서 인벤토리 기능을 구현 해보도록 하자. 

     

    UIInvetory 오브젝트가 여러 버튼들을 관리 하는 것처럼 여러 아이템슬롯도 관리 할 수 있게 만드는 것이다. 그러기 위해서 ItemSlot의 객체를 UIInventory에서 생성을 하는 것이다.

Designed by Tistory.