Chapter 6-1. 퀵슬롯 : 퀵슬롯 구현 - 평생 공부 블로그 : Today I Learned‍ 🌙

Chapter 6-1. 퀵슬롯 : 퀵슬롯 구현 -  평생 공부 블로그 : Today I Learned‍ 🌙

인프런에 있는 케이디님의 유니티 3D 실전! 생존게임 만들기 - Advanced 강의를 듣고 정리한 필기입니다. 😀 🌜 강의 들으러 가기 Click 반갑습니다 :) Date:2020.10.06&nbsp&nbsp&nbsp Updated:2020.10.06 카테고리: Unity Lesson 3 태그: UnityGame Engine

🚖 퀵슬롯 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. 전체적인 퀵슬롯 영역 📜QuickSlotController.cs 이 할 일
  • 0123456789 숫자 키 입력으로 활성화된 슬롯을 선택하여 활성화된 퀵슬롯의 아이템을 장착 혹은 소비할 수 있다.
  • 선택된 퀵슬롯은 특별하게 표시된다.

📜QuickSlotController.cs

usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassQuickSlotController:MonoBehaviour{SerializeFieldprivateSlotquickSlots;// 퀵슬롯들 (8개)SerializeFieldprivateTransformtf_parent;// 퀵슬롯들의 부모 오브젝트privateintselectedSlot;// 선택된 퀵슬롯의 인덱스 (0~7)SerializeFieldprivateGameObjectgo_SelectedImage;// 선택된 퀵슬롯 이미지SerializeFieldprivateWeaponManagertheWeaponManager;voidStart(){quickSlots=tf_parent.GetComponentsInChildren<Slot>();selectedSlot=0;}voidUpdate(){TryInputNumber();}privatevoidTryInputNumber(){if(Input.GetKeyDown(KeyCode.Alpha1))ChangeSlot(0);elseif(Input.GetKeyDown(KeyCode.Alpha2))ChangeSlot(1);elseif(Input.GetKeyDown(KeyCode.Alpha3))ChangeSlot(2);elseif(Input.GetKeyDown(KeyCode.Alpha4))ChangeSlot(3);elseif(Input.GetKeyDown(KeyCode.Alpha5))ChangeSlot(4);elseif(Input.GetKeyDown(KeyCode.Alpha6))ChangeSlot(5);elseif(Input.GetKeyDown(KeyCode.Alpha7))ChangeSlot(6);elseif(Input.GetKeyDown(KeyCode.Alpha8))ChangeSlot(7);}privatevoidChangeSlot(int_num){SelectedSlot(_num);Execute();}privatevoidSelectedSlot(int_num){// 선택된 슬롯selectedSlot=_num;// 선택된 슬롯으로 이미지 이동go_SelectedImage.transform.position=quickSlotsselectedSlot.transform.position;}privatevoidExecute(){if(quickSlotsselectedSlot.item!=null){if(quickSlotsselectedSlot.item.itemType==Item.ItemType.Equipment)StartCoroutine(theWeaponManager.ChangeWeaponCoroutine(quickSlotsselectedSlot.item.weaponType,quickSlotsselectedSlot.item.itemName));elseif(quickSlotsselectedSlot.item.itemType==Item.ItemType.Used)StartCoroutine(theWeaponManager.ChangeWeaponCoroutine(“HAND”,“맨손”));elseStartCoroutine(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 키 입력은 이제 퀵슬롯에 사용될거라서.. voidUpdate(){if(!Inventory.invectoryActivated){if(!isChangeWeapon){if(Input.GetKeyDown(KeyCode.Alpha1))// 1 누르면 ‘맨손’으로 무기 교체 실행StartCoroutine(ChangeWeaponCoroutine(“HAND”,“맨손”));elseif(Input.GetKeyDown(KeyCode.Alpha2))// 2 누르면 ‘서브 머신건’으로 무기 교체 실행StartCoroutine(ChangeWeaponCoroutine(“GUN”,“SubMachineGun1”));elseif(Input.GetKeyDown(KeyCode.Alpha3))// 3 누르면 ‘도끼’로 무기 교체 실행StartCoroutine(ChangeWeaponCoroutine(“AXE”,“Axe”));elseif(Input.GetKeyDown(KeyCode.Alpha4))// 4 누르면 ‘곡괭이’로 무기 교체 실행StartCoroutine(ChangeWeaponCoroutine(“PICKAXE”,“Pickaxe”));}}}

📜Slot.cs

SerializeFieldprivateRectTransformbaseRect;// Inventory_Base 의 영역SerializeFieldRectTransformquickSlotBaseRect;// 퀵슬롯의 영역. 퀵슬롯 영역의 슬롯들을 묶어 관리하는 ‘Content’ 오브젝트가 할당 됨.voidStart(){theInputNumber=FindObjectOfType<InputNumber>();theItemEffectDatabase=FindObjectOfType<ItemEffectDatabase>();}publicvoidOnEndDrag(PointerEventDataeventData){// 인벤토리와 퀵슬롯 영역을 벗어난 곳에서 드래그를 끝냈다면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의 손자들이다.
  • 퀵슬롯의 슬롯들 👉 퀵슬롯의 Content인 quickSlotBaseRect의 자식들이다.
  • 이전과 다르게 슬롯은 인벤토리 영역에만 속하는게 아니라 1️⃣ 인벤토리 영역, 2️⃣ 퀵슬롯 영역 이렇게 두 영역에 속하기 때문에
  • 두 영역의 RectTransform 을 가져와야 하며
  • 더 이상 이전처럼(아래처럼) transform.parent.parent로 접근할 수 없다. 퀵슬롯 영역의 슬롯들은 할아버지가 HUD다.. privateRectbaseRect;baseRect=transform.parent.parent.GetComponent<RectTransform>().rect;
  • baseRect, quickSlotBaseRect는 SerializeField로서 직접 할당할 것. image
  • OnEndDrag 👉 드래그 당한 대상이 된 슬롯에서 드래그가 끝날 때 호출 됨.
  • 인벤토리 영역을 벗어난 곳 and 퀵슬롯 영역을 벗어난 곳에 드래그가 끝났다면
  • 아이템을 버리고자 하는 처리므로 📜InputNumber.cs 를 통해 인풋 필드를 활성화 해야 한다.
  • 인벤토리 혹은 퀵슬롯 영역에서 드래그가 끝났다면
  • 드래그 슬롯 초기화
  • OnDrop 에서 슬롯 체인지 작업
  • 인벤토리 영역 📢 DragSlot이 baseRect 영역을 벗어났는지를 확인해야 함.
  • 👉 baseRect.rect 와 DragSlot은 둘 다 원점이 같다. 따라서 동일한 기준으로 DragSlot의 로컬위치와 baseRect.rect와 비교가 가능하다.
  • baseRect의 부모는 캔버스 중앙의 위치한, 즉 부모인 캔버스 기준 로컬 위치 (0, 0) 를 가지는 Inventory이다.
  • baseRect의 위치는 (0, 170) 이다.
  • 즉, 부모인 Inventory을 기준으로 (0, 170) 만큼 떨어져 있다는 의미다. 부모가 (0, 0)이므로 캔버스 중앙을 기준으로 (0, 170) 만큼 떨어져 있다고 해석하는 것도 가능하다.
  • DragSlot은 인벤토리 Base 이미지인 baseRect의 자식이다.
  • 따라서 DragSlot와 baseRect은 앵커(원점)가 일치한다.
  • DragSlot의 PosX, PosY 는 baseRect 위치를 기준으로 한 로컬 위치다.
  • 예를 들어 현재 드래그 된 DragSlot의 위치가 (30, 120) 이라면, 캔버스 중앙점을 기준으로 한 위치(0, 0)로 부터는 사실상 (30, 290) 에 위치하는 것과 같다. (120 + 170 = 290)
  • baseRect.rect.xMin은 baseRect의 왼쪽 상단 꼭짓점 좌표의 x 값이다.
  • baseRect의 앵커(middle-center 이므로 정중앙)을 원점으로 한 기준의 좌표로.
  • 예를 들어 baseRect 위치는 (0, 170) 이므로 baseRect.rect.yMin 값이 -30 이라면, 캔버스 중앙점을 기준으로 한 위치(0, 0)로 부터의 baseRect.rect.yMin은 사실상 140 과 같다. (-30 + 170 = 140)
  • 두 오브젝트의 기준점이 동일하므로 아래와 같은 비교가 가능한 것이다.
  • DragSlot.instance.transform.localPosition은 baseRect를 기준으로 한 위치이며
  • 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
  • 퀵슬롯 영역 📢 DragSlot이 quickSlotBaseRect 영역을 벗어났는지를 확인해야 함.
  • quickSlotBaseRect의 부모는 QuickSlot와 그 위의 할머니 HUD인데, QuickSlot, HUD 둘다 (0, 0)으로 캔버스 중앙에 위치한다.
  • quickSlotBaseRect의 위치는 (0, -270) 이다.
  • 👉 DragSlot과 quickSlotBaseRect.rect은 y 에 있어 서로 원점이 다르다. 따라서 비교를 위해선 기준을 동일하게 해주어야 한다.
  • DragSlot의 로컬 위치 x 좌표는 quickSlotBaseRect.rect의 xMin, xMax 좌표와 원점 기준이 동일하다.
  • quickSlotBaseRect의 위치의 x 좌표는 0 이므로 원점은 DragSlot가 기준으로 하는 baseRect 위치의 x 좌표와 동일하기 때문이다. quickSlotBaseRect와 baseRect 위치는 둘 다 캔버스 중앙을 기준으로 하기 때문에 (부모들이 전부 (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.rect의 yMin, 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

publicvoidIsActivatedQuickSlot(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

SerializeFieldprivateQuickSlotControllertheQuickSlotController;// 📜QuickSlotController 👉 📜Slot 징검다리publicvoidIsActivatedquickSlot(int_num){theQuickSlotController.IsActivatedQuickSlot(_num);}image 📜Slot 은 28 개의 프리팹이므로 FindObjectOfType 을 통한 로딩을 줄이기 위하여 📜ItemEffectDatabase.cs 가 징검 다리 역할을 한다. 📜Slot 에서 호출이 필요한 외부 스크립트의 함수들을 📜ItemEffectDatabase.cs 에서 징검다리 역할을 한 후 📜ItemEffectDatabase.cs 하나만 참조하여 가져올 수 있도록.

📜Slot.cs

SerializeFieldprivateboolisQuickSlot;// 해당 슬롯이 퀵슬롯인지 여부 판단SerializeFieldprivateintquickSlotNumber;// 퀵슬롯 넘버publicintGetQuickSlotNumber(){returnquickSlotNumber;}// 마우스 드롭 했을 때 발생하는 이벤트publicvoidOnDrop(PointerEventDataeventData){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카테고리 내 다른 글 보러가기

Github 블로그 블로그를 public Repository 로 전환했습니다. 2021.08.31 BlogBlogGithub백준 9663💛5 N-Queen (백트래킹) 2021.07.26 BOJAlgorithmCoding TestCpp백준 20437💛5 문자열 게임 2 2021.07.26 BOJAlgorithmCoding TestCpp백준 20366💛3 같이 눈사람 만들래? (조합, 투포인터) 2021.07.26 BOJAlgorithmCoding TestCpp백준 1368💛2 물대기 (MST, 크루스칼) 2021.07.26 BOJAlgorithmCoding TestCpp백준 9489💛4 사촌 2021.07.25 BOJAlgorithmCoding TestCpp백준 4358💛5 생태학 (map, 소수 출력) 2021.07.24 BOJAlgorithmCoding TestCpp백준 1987💛4 알파벳 (DFS, 백트래킹) 2021.07.11 BOJAlgorithmCoding TestCpp백준 3980💛4 선발 명단 (DFS, 백트래킹) 2021.07.10 BOJAlgorithmCoding TestCpp백준 20924💛4 트리의 기둥과 가지 (DFS, 트리) 2021.07.10 BOJAlgorithmCoding TestCpp