Chapter 6-1. 퀵슬롯 : 퀵슬롯 구현
카테고리: Unity Lesson 3
태그: Unity Game Engine
인프런에 있는 케이디님의 [유니티 3D] 실전! 생존게임 만들기 - Advanced 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click
Chapter 6. 퀵슬롯
🚖 퀵슬롯 UI 만들기
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 상에서 슬롯들보다 더 아래있기 때문에 더 나중에 그려져 슬롯 위에 덮혀지기 때문이다. 레이캐스트를 방해하므로 꺼준다.
- 퀵슬롯에 드롭할 때 퀵슬롯에서 드롭당한 해당 슬롯이 OnDrop 일어나는 것을 방해한다.
- 퀵슬롯에서 현재 활성화 되있는, 선택된 슬롯을 나타내는 이미지다.
🚖 퀵슬롯 기능
- 퀵슬롯 내의 각각의 슬롯들 📜Slot.cs 이 할 일 👉 마우스 이벤트
-
- 인벤토리와 퀵슬롯 사이에서 드래그 앤 드롭을 하여 자리를 맞 바꿀 수 있다. 마인크래프트처럼..
-
- 퀵슬롯의 아이템을 바깥에 드래그 앤 드롭하면 버릴 수 있다.
-
- 전체적인 퀵슬롯 영역 📜QuickSlotController.cs 이 할 일
- 0123456789 숫자 키 입력으로 활성화된 슬롯을 선택하여 활성화된 퀵슬롯의 아이템을 장착 혹은 소비할 수 있다.
- 선택된 퀵슬롯은 특별하게 표시된다.
- 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() 👉 활성화된 퀵슬롯에 있는 아이템을 실제로 사용한다.
- 활성화된 퀵슬롯에 아이템이 있다면
- 무기라면 그 무기로 교체
- 그외엔 맨손으로 교체
- 추후 소모품, 재료에 대한 처리 추가할 것
- 활성화된 퀵슬롯에 아이템이 없다면
- 그냥 맨손으로 교체
- 활성화된 퀵슬롯에 아이템이 있다면
- 1️⃣ SelectedSlot(int _num) 👉 인수로 들어온 인덱스에 해당하는 슬롯을 활성화 된 슬롯으로 임명
- ChangeSlot(int _num)
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
의 손자들이다. - 퀵슬롯의 슬롯들 👉 퀵슬롯의
Content
인quickSlotBaseRect
의 자식들이다.
- 인벤토리 슬롯들 👉 인벤토리 Base 이미지인
- 이전과 다르게 슬롯은 인벤토리 영역에만 속하는게 아니라 1️⃣ 인벤토리 영역, 2️⃣ 퀵슬롯 영역 이렇게 두 영역에 속하기 때문에
- 두 영역의 RectTransform 을 가져와야 하며
- 더 이상 이전처럼(아래처럼)
transform.parent.parent
로 접근할 수 없다. 퀵슬롯 영역의 슬롯들은 할아버지가HUD
다..private Rect baseRect; baseRect = transform.parent.parent.GetComponent<RectTransform>().rect;
baseRect
,quickSlotBaseRect
는[SerializeField]
로서 직접 할당할 것.
- 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
- y 위치값은
- NOT(인벤토리 영역 OR 퀵슬롯 영역) 은 (NOT 인벤토리 영역) AND (NOT 퀵슬롯 영역) 과 같다.
- 📜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);
}
📜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 로 통일할 것이다.
- 퀵슬롯인지 여부
- 📜Slot.cs 이 활성화 된 이 슬롯이
- 드롭을 당한 슬롯 입장에서
- 드롭을 당한 내가 퀵슬롯에 속한 슬롯이라면 if (isQuickSlot)
- 드롭을 당한 슬롯의 퀵슬롯 넘버를 넘겨 활성화 슬롯인지를 검사한다. IsActivatedquickSlot
- 드래그로 인해 활성화 슬롯에 새로운 아이템이 들어왓을 경우 그에 맞는 아이템 소비를 해야하기 때문
- 드롭을 당한 슬롯의 퀵슬롯 넘버를 넘겨 활성화 슬롯인지를 검사한다. IsActivatedquickSlot
- 드롭을 당한 내가 인벤토리에 속한 슬롯이라면 else
- 드래그 된 슬롯이 퀵슬롯이라면
- 드래그 슬롯의 퀵슬롯 넘버를 넘겨 활성화 슬롯인지를 검사한다. IsActivatedquickSlot
- 드래그로 인해 활성화 슬롯이 스왑되어 새로운 아이템이 들어왓을 경우 퀵슬롯이 비워졌다면 그에 맞는 아이템 소비를 해야하기 때문
- 드래그 슬롯의 퀵슬롯 넘버를 넘겨 활성화 슬롯인지를 검사한다. IsActivatedquickSlot
- 드래그 된 슬롯이 퀵슬롯이라면
- 드롭을 당한 내가 퀵슬롯에 속한 슬롯이라면 if (isQuickSlot)
- 퀵슬롯에 속한 슬롯들 모두 다
isQuickSlot
체크quickSlotNumber
값은 차례 대로 0 ~ 8
- 인벤토리에 속한 슬롯들 모두 다
isQuickSlot
체크 해제quickSlotNumber
값은 -1
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기