Chapter 6-1. 퀵슬롯 : 퀵슬롯 구현

Date:     Updated:

카테고리:

태그:

인프런에 있는 케이디님의 [유니티 3D] 실전! 생존게임 만들기 - Advanced 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click

Chapter 6. 퀵슬롯

🚖 퀵슬롯 UI 만들기

image

image

QuickSlot 퀵슬롯 UI 는 HUD의 자식으로 두어 총알 정보 UI 와 형제로 둔다.

  • HUD
    • QuickSlot 👉 빈 오브젝트. 📜QuickSlotController.cs 가 붙을 예정.
      • Contents 👉 빈 오브젝트.
        • 퀵슬롯의 크기와 위치 관리.
          • width 와 height 은 슬롯 8 개가 들어갈 수 있는 크기로.
          • (0, -270)로 아래에 배치
            • 부모인 QuickSlot 기준 LocalPosition
        • Grid Layout Group 컴포넌트를 붙여 퀵슬롯에 해당하는 Slot들을 묶어 관리.
          • 셀 크기는 슬롯과 동일하게 66 X 66
          • 정렬은 가운데 정렬
        • 앵커 프리셋은 middle-center 로 원점을 가운데로
        • 위 사진에서 표시된 영역이 바로 이 Contents 이다.
        • 8 개의 Slot
          • 각각의 하나의 슬롯의 기능을 📜Slot.cs에서 담당
      • SelectedSlot 👉 이미지 UI
        • 퀵슬롯에서 현재 활성화 되있는, 선택된 슬롯을 나타내는 이미지다.
          • 사진 에서 가운데는 투명하게 테두리는 하얀 이미지
        • 크기는 슬롯과 똑같이 66 x 66
        • PosY 위치를 Contents와 똑같이 -270 로 하고 PosX 는 첫번째 슬롯 하나를 감쌀 수 있는 위치로 한다.
        • 앵커 프리셋은 middle-center 로 원점을 가운데로
        • Raycast Target은 체크 해제해준다.
          • 퀵슬롯에 드롭할 때 퀵슬롯에서 드롭당한 해당 슬롯이 OnDrop 일어나는 것을 방해한다. SelectedSlot 이미지가 Hierarchy 상에서 슬롯들보다 더 아래있기 때문에 더 나중에 그려져 슬롯 위에 덮혀지기 때문이다. 레이캐스트를 방해하므로 꺼준다.


🚖 퀵슬롯 기능

  • 퀵슬롯 내의 각각의 슬롯들 📜Slot.cs 이 할 일 👉 마우스 이벤트
      1. 인벤토리와 퀵슬롯 사이에서 드래그 앤 드롭을 하여 자리를 맞 바꿀 수 있다. 마인크래프트처럼..
      1. 퀵슬롯의 아이템을 바깥에 드래그 앤 드롭하면 버릴 수 있다.
  • 전체적인 퀵슬롯 영역 📜QuickSlotController.cs 이 할 일
    • 0123456789 숫자 키 입력으로 활성화된 슬롯을 선택하여 활성화된 퀵슬롯의 아이템을 장착 혹은 소비할 수 있다.
      • 선택된 퀵슬롯은 특별하게 표시된다.


📜QuickSlotController.cs

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

public class QuickSlotController : MonoBehaviour
{
    [SerializeField] private Slot[] quickSlots;  // 퀵슬롯들 (8개)
    [SerializeField] private Transform tf_parent;  // 퀵슬롯들의 부모 오브젝트

    private int selectedSlot;  // 선택된 퀵슬롯의 인덱스 (0~7)
    [SerializeField] private GameObject go_SelectedImage;  // 선택된 퀵슬롯 이미지

    [SerializeField]
    private WeaponManager theWeaponManager;

    void Start()
    {
        quickSlots = tf_parent.GetComponentsInChildren<Slot>();
        selectedSlot = 0; 
    }

    void Update()
    {
        TryInputNumber();
    }

    private void TryInputNumber()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
            ChangeSlot(0);
        else if (Input.GetKeyDown(KeyCode.Alpha2))
            ChangeSlot(1);
        else if (Input.GetKeyDown(KeyCode.Alpha3))
            ChangeSlot(2);
        else if (Input.GetKeyDown(KeyCode.Alpha4))
            ChangeSlot(3);
        else if (Input.GetKeyDown(KeyCode.Alpha5))
            ChangeSlot(4);
        else if (Input.GetKeyDown(KeyCode.Alpha6))
            ChangeSlot(5);
        else if (Input.GetKeyDown(KeyCode.Alpha7))
            ChangeSlot(6);
        else if (Input.GetKeyDown(KeyCode.Alpha8))
            ChangeSlot(7);
    }

    private void ChangeSlot(int _num)
    {
        SelectedSlot(_num);
        Execute();
    }

    private void SelectedSlot(int _num)
    {
        // 선택된 슬롯
        selectedSlot = _num;

        // 선택된 슬롯으로 이미지 이동
        go_SelectedImage.transform.position = quickSlots[selectedSlot].transform.position;
    }

    private void Execute()
    {
        if (quickSlots[selectedSlot].item != null)
        {
            if (quickSlots[selectedSlot].item.itemType == Item.ItemType.Equipment)
                StartCoroutine(theWeaponManager.ChangeWeaponCoroutine(quickSlots[selectedSlot].item.weaponType, quickSlots[selectedSlot].item.itemName));
            else if (quickSlots[selectedSlot].item.itemType == Item.ItemType.Used)
                StartCoroutine(theWeaponManager.ChangeWeaponCoroutine("HAND", "맨손"));
            else
                StartCoroutine(theWeaponManager.ChangeWeaponCoroutine("HAND", "맨손"));
        }
        else
        {
            StartCoroutine(theWeaponManager.ChangeWeaponCoroutine("HAND", "맨손"));
        }
    }
}

  • quickSlots : 퀵슬롯에 해당하는 Slots을 넣어둘 배열. 퀵슬롯의 슬롯은 8 개니까 사이즈는 8이 될 것.
    • tf_parent : 퀵슬롯의 슬롯들의 부모. 즉, Contents를 여기에 할당해 줄 것이다.
      • quickSlots 배열은 tf_parent에서 GetComponentsInChildren 함수를 호출하여 원소 Slot들을 할당할 것이다.
  • selectedSlot : 현재 활성화된 슬롯의 인덱스
  • go_SelectedImage : 현재 활성화된 슬롯을 나타내줄 이미지.
    • 현재 활성화된 슬롯의 위치에 맞게 SelectedSlot 이미지 UI도 그곳으로 위치를 바꿔주어야 한다.
    • transform.position 월드 기준 위치를 받아 오기 위해 GameObject 타입으로 가져왔다.
  • theWeaponManager : 활성화된 슬롯에 있는 무기로 교체되야 하므로 📜WeaponManager.cs 필요
  • Start()
    • quickSlots 배열은 tf_parent에서 GetComponentsInChildren 함수를 호출하여 원소 Slot들을 할당
    • selectedSlot은 0으로. 초기 활성화 슬롯은 퀵슬롯의 첫번째 슬롯으로.
  • TryInputNumber() 👉 매프레임마다 012345678 숫자 키보드 입력을 검사한 후 해당 키에 대응되는 슬롯을 활성화된 슬롯으로 이명한다.
    • ChangeSlot(int _num)
      • 1️⃣ SelectedSlot(int _num) 👉 인수로 들어온 인덱스에 해당하는 슬롯을 활성화 된 슬롯으로 임명
        • selectedSlot 업뎃
        • 해당 슬롯 위치로 SelectedSlot 이미지 위치 업데이트
      • 2️⃣ Execute() 👉 활성화된 퀵슬롯에 있는 아이템을 실제로 사용한다.
        • 활성화된 퀵슬롯에 아이템이 있다면
          • 무기라면 그 무기로 교체
          • 그외엔 맨손으로 교체
            • 추후 소모품, 재료에 대한 처리 추가할 것
        • 활성화된 퀵슬롯에 아이템이 없다면
          • 그냥 맨손으로 교체

image

  • tf_parent 👉 Contents
  • go_SelectedImage 👉 SelectedSlot


📜WeaponManager.cs

  • 아래 Update() 부분을 삭제하였다 ! !
    • 1234567 키 입력은 이제 퀵슬롯에 사용될거라서..

    void Update()
    {
        if(!Inventory.invectoryActivated)
        {
            if (!isChangeWeapon)
            {
                if (Input.GetKeyDown(KeyCode.Alpha1)) // 1 누르면 '맨손'으로 무기 교체 실행
                    StartCoroutine(ChangeWeaponCoroutine("HAND", "맨손"));
                else if (Input.GetKeyDown(KeyCode.Alpha2)) // 2 누르면 '서브 머신건'으로 무기 교체 실행
                    StartCoroutine(ChangeWeaponCoroutine("GUN", "SubMachineGun1"));
                else if (Input.GetKeyDown(KeyCode.Alpha3)) // 3 누르면 '도끼'로 무기 교체 실행
                    StartCoroutine(ChangeWeaponCoroutine("AXE", "Axe"));
                else if (Input.GetKeyDown(KeyCode.Alpha4)) // 4 누르면 '곡괭이'로 무기 교체 실행
                    StartCoroutine(ChangeWeaponCoroutine("PICKAXE", "Pickaxe"));
            }
        }
    }


📜Slot.cs

    [SerializeField] private RectTransform baseRect;  // Inventory_Base 의 영역
    [SerializeField] RectTransform quickSlotBaseRect; // 퀵슬롯의 영역. 퀵슬롯 영역의 슬롯들을 묶어 관리하는 'Content' 오브젝트가 할당 됨.

    void Start()
    {
        theInputNumber = FindObjectOfType<InputNumber>();
        theItemEffectDatabase = FindObjectOfType<ItemEffectDatabase>();
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        // 인벤토리와 퀵슬롯 영역을 벗어난 곳에서 드래그를 끝냈다면
        if (!((DragSlot.instance.transform.localPosition.x > baseRect.rect.xMin 
            && DragSlot.instance.transform.localPosition.x < baseRect.rect.xMax
            && DragSlot.instance.transform.localPosition.y > baseRect.rect.yMin
            && DragSlot.instance.transform.localPosition.y < baseRect.rect.yMax)
            ||
            (DragSlot.instance.transform.localPosition.x > quickSlotBaseRect.rect.xMin
            && DragSlot.instance.transform.localPosition.x < quickSlotBaseRect.rect.xMax
            && DragSlot.instance.transform.localPosition.y + baseRect.transform.localPosition.y > quickSlotBaseRect.rect.yMin + quickSlotBaseRect.transform.localPosition.y
            && DragSlot.instance.transform.localPosition.y + baseRect.transform.localPosition.y < quickSlotBaseRect.rect.yMax + quickSlotBaseRect.transform.localPosition.y)))
        {
            if (DragSlot.instance.dragSlot != null)
                theInputNumber.Call();
        }
        // 인벤토리 혹은 퀵슬롯 영역에서 드래그가 끝났다면
        else
        {
            DragSlot.instance.SetColor(0);
            DragSlot.instance.dragSlot = null;
        }
    }

드래그 한 슬롯이 1️⃣ 인벤토리 영역, 혹은 2️⃣ 퀵슬롯 영역을 벗어났는지를 체크해야 한다.

벗어났다면 아이템 버리기 처리를 해야하고 벗어나지 않았다고 판단되면 퀵슬롯 인벤토리 간의 슬롯 이동, 스왑도 이루어질 수 있어야 한다.

  • baseRect
    • 인벤토리 Base 이미지
    • 아래와 같이 Rect 타입으로 가져왔고
  • 슬롯들의 조상, 부모는 다음과 같이 나뉜다.
    • 인벤토리 슬롯들 👉 인벤토리 Base 이미지인 baseRect의 손자들이다.
    • 퀵슬롯의 슬롯들 👉 퀵슬롯의 ContentquickSlotBaseRect의 자식들이다.
  • 이전과 다르게 슬롯은 인벤토리 영역에만 속하는게 아니라 1️⃣ 인벤토리 영역, 2️⃣ 퀵슬롯 영역 이렇게 두 영역에 속하기 때문에
    • 두 영역의 RectTransform 을 가져와야 하며
    • 더 이상 이전처럼(아래처럼) transform.parent.parent로 접근할 수 없다. 퀵슬롯 영역의 슬롯들은 할아버지가 HUD다..
      private Rect baseRect;
      baseRect = transform.parent.parent.GetComponent<RectTransform>().rect;
      
  • baseRect, quickSlotBaseRect[SerializeField]로서 직접 할당할 것.

image

  • OnEndDrag 👉 드래그 당한 대상이 된 슬롯에서 드래그가 끝날 때 호출 됨.
    • 인벤토리 영역을 벗어난 곳 and 퀵슬롯 영역을 벗어난 곳에 드래그가 끝났다면
      • 아이템을 버리고자 하는 처리므로 📜InputNumber.cs 를 통해 인풋 필드를 활성화 해야 한다.
    • 인벤토리 혹은 퀵슬롯 영역에서 드래그가 끝났다면
      • 드래그 슬롯 초기화
      • OnDrop 에서 슬롯 체인지 작업
  • 인벤토리 영역 📢 DragSlotbaseRect 영역을 벗어났는지를 확인해야 함.
    • 👉 baseRect.rectDragSlot은 둘 다 원점이 같다. 따라서 동일한 기준으로 DragSlot의 로컬위치와 baseRect.rect와 비교가 가능하다.
      • baseRect의 부모는 캔버스 중앙의 위치한, 즉 부모인 캔버스 기준 로컬 위치 (0, 0) 를 가지는 Inventory이다.
      • baseRect의 위치는 (0, 170) 이다.
        • 즉, 부모인 Inventory을 기준으로 (0, 170) 만큼 떨어져 있다는 의미다. 부모가 (0, 0)이므로 캔버스 중앙을 기준으로 (0, 170) 만큼 떨어져 있다고 해석하는 것도 가능하다.
      • DragSlot은 인벤토리 Base 이미지인 baseRect의 자식이다.
        • 따라서 DragSlotbaseRect은 앵커(원점)가 일치한다.
        • DragSlot의 PosX, PosY 는 baseRect 위치를 기준으로 한 로컬 위치다.
          • 예를 들어 현재 드래그 된 DragSlot의 위치가 (30, 120) 이라면, 캔버스 중앙점을 기준으로 한 위치(0, 0)로 부터는 사실상 (30, 290) 에 위치하는 것과 같다. (120 + 170 = 290)
      • baseRect.rect.xMinbaseRect의 왼쪽 상단 꼭짓점 좌표의 x 값이다.
        • baseRect의 앵커(middle-center 이므로 정중앙)을 원점으로 한 기준의 좌표로.
          • 예를 들어 baseRect 위치는 (0, 170) 이므로 baseRect.rect.yMin 값이 -30 이라면, 캔버스 중앙점을 기준으로 한 위치(0, 0)로 부터의 baseRect.rect.yMin은 사실상 140 과 같다. (-30 + 170 = 140)
    • 두 오브젝트의 기준점이 동일하므로 아래와 같은 비교가 가능한 것이다.
      • DragSlot.instance.transform.localPositionbaseRect를 기준으로 한 위치이며
      • baseRect.rect 또한 baseRect를 기준으로 한 위치이기 때문이다.
        // 인벤토리 영역에 해당하는 범위
        DragSlot.instance.transform.localPosition.x > baseRect.rect.xMin 
          && DragSlot.instance.transform.localPosition.x < baseRect.rect.xMax
          && DragSlot.instance.transform.localPosition.y > baseRect.rect.yMin
          && DragSlot.instance.transform.localPosition.y < baseRect.rect.yMax
        
  • 퀵슬롯 영역 📢 DragSlotquickSlotBaseRect 영역을 벗어났는지를 확인해야 함.
    • quickSlotBaseRect의 부모는 QuickSlot와 그 위의 할머니 HUD인데, QuickSlot, HUD 둘다 (0, 0)으로 캔버스 중앙에 위치한다.
    • quickSlotBaseRect의 위치는 (0, -270) 이다.
    • 👉 DragSlotquickSlotBaseRect.recty 에 있어 서로 원점이 다르다. 따라서 비교를 위해선 기준을 동일하게 해주어야 한다.
      • DragSlot의 로컬 위치 x 좌표는 quickSlotBaseRect.rectxMin, xMax 좌표와 원점 기준이 동일하다.
        • quickSlotBaseRect의 위치의 x 좌표는 0 이므로 원점은 DragSlot가 기준으로 하는 baseRect 위치의 x 좌표와 동일하기 때문이다. quickSlotBaseRectbaseRect 위치는 둘 다 캔버스 중앙을 기준으로 하기 때문에 (부모들이 전부 (0,0)이라) 동일한 기준을 가진다.
        • 따라서 x 좌표에 있어선 인벤토리 영역 처럼 DragSlot의 로컬위치와 baseRect.rect와 비교가 가능하다.
          // 퀵슬롯의 영역에 해당하는 x 범위
          DragSlot.instance.transform.localPosition.x > quickSlotBaseRect.rect.xMin
           && DragSlot.instance.transform.localPosition.x < quickSlotBaseRect.rect.xMax
          
      • 그러나 DragSlot의 로컬 위치 y 좌표는 quickSlotBaseRect.rectyMin, yMax 좌표와 원점 기준이 서로 다르다. 따라서 y 에 있어서는 둘이 기준이 같은 좌표로 변환해 주어야 한다.
        • y 위치값은 DragSlot 는 캔버스 중앙 기준 170을 기준으로 하고, quickSlotBaseRect.rect는 캔버스 중앙 기준 -270을 기준으로 한다.
        • DragSlot, quickSlotBaseRect 두 좌표를 캔버스 중앙점을 기준으로 한 좌표로 통일하여 비교하기
          • DragSlot.instance.transform.localPosition 를 캔버스 중앙점을 기준으로 한 위치로 변경하려면 부모인(기준점인) baseRect.transform.localPosition만큼 더해주면 된다.
            • 여태 baseRect를 기준을 원점으로 삼았던 거니까
          • quickSlotBaseRect.rect 을 캔버스 중앙점을 기준으로 한 위치로 변경하려면 기준점인 quickSlotBaseRect.transform.localPosition 만큼 더해주면 된다. 여태 quickSlotBaseRect를 기준을 원점으로 삼았던 거니까
            // 퀵슬롯의 영역에 해당하는 y 범위
            DragSlot.instance.transform.localPosition.y + baseRect.transform.localPosition.y > quickSlotBaseRect.rect.yMin + quickSlotBaseRect.transform.localPosition.y
            && DragSlot.instance.transform.localPosition.y + baseRect.transform.localPosition.y < quickSlotBaseRect.rect.yMax + quickSlotBaseRect.transform.localPosition.y
            
    • NOT(인벤토리 영역 OR 퀵슬롯 영역)(NOT 인벤토리 영역) AND (NOT 퀵슬롯 영역) 과 같다.

image

  • 📜Slot.cs이 붙는 Slot은 프리팹
  • baseRect 에 할당해야 할 인벤토리 Base 이미지와 quickSlotBaseRect 에 할당해야 하는 Contents 는 Hierarchy에 실존하는 오브젝트다. 프리팹도 아니다.
    • [SerializeField]로 선언했으므로 일일이 개발자가 모든 슬롯에게 직접 할당해 주어야 한다.
      • 단, Slot은 프리팹으로 찍어낸거긴 해도 단지 비활성화 되있을 뿐 게임 시작때 부터 Hierarchy 상에서 존재하는 오브젝트이기 때문에 이 같은 행동이 가능한 것이다.
      • Instantiate 으로 게임 도중에 생성하는 프리팹이라면 [SerializeField] 로 선언된 변수에 직접 외부 오브젝트를 드래그 앤 드롭 해주는게 의미가 없다. 이런 경우엔 FindObjectOfType 밖에 답이 없음.
    • 프리팹에 오브젝트를 할당할 때는 하나의 프리팹에만 할당하고 Apply All 하면 되는 것이 적용되지 않는 것 같다.


🚖 퀵슬롯 장비 전환

  • 퀵슬롯에서 현재 선택된 슬롯에다가 장비를 드래그 하면 해당 무기로 교체되게
  • 퀵슬롯에서 현재 선택될 슬롯에서 해당 무기를 다른 곳으로 옮기면 자동으로 맨손으로


📜QuickSlotController.cs

    public void IsActivatedQuickSlot(int _num)
    {
        if (selectedSlot == _num)
        {
            Execute();
            return;
        }
        if (DragSlot.instance != null)
        {
            if (DragSlot.instance.dragSlot != null)
            {
                if (DragSlot.instance.dragSlot.GetQuickSlotNumber() == selectedSlot)
                {
                    Execute();
                    return;
                }
            }
        }     
    }
  • IsActivatedQuickSlot
    • 012345678 키를 통해 활성화된 슬롯의 아이템을 사용하는 것이 아닌, 다른 아이템이 활성화된 슬롯로 드래그 될 때 그 아이템을 자동으로 사용하게끔
    • 인수로 들어온 넘버에 해당하는 슬롯이 이미 활성화 슬롯이라면
      • 👉 활성화 슬롯에다가 아이템을 드롭해준 경우 해당되도록 할 것이다.
      • 활성화 슬롯의 새로 바뀐 아이템에 대하여 Execute() 실행하고 끝냄
    • 드래그 된 슬롯이 퀵슬롯이며 그의 퀵슬롯 넘버가 활성화 슬롯과 동일하다면
      • 👉 즉, 활성화 슬롯에 있는 아이템을 다른 곳에 드롭해준 경우 해당되도록 할 것이다.
        • 활성화 슬롯은 스왑 되어 다른 아이템으로 바뀌거나, 비워져 맨손이 되거나 할 것이다.
        • 활성화 슬롯의 새로 바뀐 아이템에 대하여 Execute() 실행하고 끝냄
      • 인벤토리가 갑자기 꺼져버렸을 경우 등등 DragSlot.instance 혹은 DragSlot.instance.dragSlot 가 null 이 되는 경우가 생길 수 있기 때문에 이에 대한 처리를 해주었다.


📜ItemEffectDatabase.cs

    [SerializeField]
    private QuickSlotController theQuickSlotController;


    // 📜QuickSlotController 👉 📜Slot 징검다리
    public void IsActivatedquickSlot(int _num)
    {
        theQuickSlotController.IsActivatedQuickSlot(_num);
    }

image

📜Slot 은 28 개의 프리팹이므로 FindObjectOfType 을 통한 로딩을 줄이기 위하여 📜ItemEffectDatabase.cs 가 징검 다리 역할을 한다. 📜Slot 에서 호출이 필요한 외부 스크립트의 함수들을 📜ItemEffectDatabase.cs 에서 징검다리 역할을 한 후 📜ItemEffectDatabase.cs 하나만 참조하여 가져올 수 있도록.

📜Slot.cs

    [SerializeField] private bool isQuickSlot;  // 해당 슬롯이 퀵슬롯인지 여부 판단
    [SerializeField] private int quickSlotNumber;  // 퀵슬롯 넘버


    public int GetQuickSlotNumber()
    {
        return quickSlotNumber;
    }


    // 마우스 드롭 했을 때 발생하는 이벤트
    public void OnDrop(PointerEventData eventData)
    {
        if (DragSlot.instance.dragSlot != null)
        {
            ChangeSlot();

            if (isQuickSlot)  // 인벤토리->퀵슬롯 or 퀵슬롯->퀵슬롯
                theItemEffectDatabase.IsActivatedquickSlot(quickSlotNumber);
            else  // 인벤토리->인벤토리. 퀵슬롯->인벤토리
            {
                if(DragSlot.instance.dragSlot.isQuickSlot)  // 퀵슬롯->인벤토리
                    theItemEffectDatabase.IsActivatedquickSlot(DragSlot.instance.dragSlot.quickSlotNumber);
            }
        } 
    }
  • 인벤토리에 속한 슬롯 뿐만아니라 퀵슬롯에 속한 슬롯도 있으므로 아래와 같은 정보가 필요하다.
    • 📜Slot.cs 이 활성화 된 이 슬롯이
      • 퀵슬롯인지 여부 isQuickSlot
        • 퀵슬롯에 속한 슬롯들은 true
        • 인벤토리에 속한 슬롯들은 false
      • 퀵슬롯이라면 어떤 넘버의 퀵슬롯인지. quickSlotNumber
        • 퀵슬롯에 속한 슬롯들은 0, 1, 2, 3, 4, 5, 6, 7 값을 가질 것이고
        • 인벤토리에 속한 슬롯들은 이 값을 -1 로 통일할 것이다.
  • 드롭을 당한 슬롯 입장에서
    • 드롭을 당한 내가 퀵슬롯에 속한 슬롯이라면 if (isQuickSlot)
      • 드롭을 당한 슬롯의 퀵슬롯 넘버를 넘겨 활성화 슬롯인지를 검사한다. IsActivatedquickSlot
        • 드래그로 인해 활성화 슬롯에 새로운 아이템이 들어왓을 경우 그에 맞는 아이템 소비를 해야하기 때문
    • 드롭을 당한 내가 인벤토리에 속한 슬롯이라면 else
      • 드래그 된 슬롯이 퀵슬롯이라면
        • 드래그 슬롯의 퀵슬롯 넘버를 넘겨 활성화 슬롯인지를 검사한다. IsActivatedquickSlot
          • 드래그로 인해 활성화 슬롯이 스왑되어 새로운 아이템이 들어왓을 경우 퀵슬롯이 비워졌다면 그에 맞는 아이템 소비를 해야하기 때문

image

  • 퀵슬롯에 속한 슬롯들 모두 다
    • isQuickSlot 체크
    • quickSlotNumber 값은 차례 대로 0 ~ 8

image

  • 인벤토리에 속한 슬롯들 모두 다
    • isQuickSlot 체크 해제
    • quickSlotNumber 값은 -1


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Unity Lesson 3 카테고리 내 다른 글 보러가기

댓글 남기기