유니티 인벤토리 시스템 구현하기 #8[인벤토리 내부 동작 구현]
Intro
-
이번 포스팅에서는 모든 아이템들을 배열로 관리하고, 인벤토리내의 동작을 구현하는 Inventory 클래스를 구현해봅니다.
-
Inventory 클래스는 InventoryUI 클래스와 상호작용하게 됩니다.
-
Inventory 클래스가 관리할 데이터는 Item 배열과 Capacity(아이템 수용 한도) 입니다.
- 또한 Inventory 클래스에서 작성할 동작들은 다음과 같습니다.
- 아이템 정보 확인
- 아이템 정보 갱신
- 아이템 추가
- 아이템 제거
- 아이템 이동
- 아이템 사용
- 아이템 정렬
Inventory 클래스
- Capacity(아이템 수용 한도)는 인벤토리창에서 아이템 슬롯들의 갯수 입니다.
public int Capacity { get; private set; } // .. 아이템 수용 한도
// .. 초기 수용 한도
[SerializeField, Range(8, 64)] private int initCapacity = 32;
// .. 최대 수용 한도
[SerializeField, Range(8, 64)] private int maxCapacity = 64;
[SerializeField] InventoryUI inventoryUI; // .. 연결될 인벤토리 UI
[SerializeField] Item[] items; // .. 아이템배열
#region
void Awake()
{
items = new Item[maxCapacity]; // .. 아이템 배열 생성
Capacity = initCapacity;
}
void Start()
{
UpdateAccessibleStatesAll();
}
#endregion
/* ----------------- Private Methods ---------------- */
#region
// .. 인벤토리 앞쪽부터 비어있는 슬롯의 인덱스 탐색
private int FindEmptySlotIndex(int startIndex = 0)
{
for(int i = startIndex; i < Capacity; i++)
{
// .. 빈 슬롯이 있다면 그 슬롯의 인덱스를 반환
if(items[i] == null)
reutnr i;
}
return -1; // .. 없다면
}
#endregion
/* ----------------- Public Methods ----------------- */
#region
// .. 모든 슬롯에 접근 가능 여부 업데이트
public void UpdateAccessibleStatesAll()
{
inventoryUI.SetAccessibleSlotRange(Capacity);
}
#endregion
/* ------------- Check & Getter Methods ------------- */
#region
// .. 인덱스가 수용 범위내에 있는지 검사
private bool IsValidIndex(int index)
{
return index >= 0 && index < Capacity;
}
// .. 해당 슬롯이 아이템을 갖고 있는지 여부
public bool HasItem(int index)
{
return IsValidIndex(index) && items[index] != null;
}
// .. 해당 슬롯의 아이템이 CountableItem인지 여부
public bool IsCountableItem(int index)
{
return HasItem(index) && items[index] is CountableItem;
}
// .. 해당 슬롯의 현재 아이템 갯수를 리턴(잘못된 인덱스 -1, 빈 슬롯 0, 셀 수 없는 아이템 1)
public int GetCurrentAmount(int index)
{
if(!IsValidIndex(index)) return -1;
if(items[index] == null) return 0;
CountableItem ci = items[index] as CountableItem;
if(ci == null)
return i;
return ci.Amount;
}
// .. 해당 슬롯의 아이템 정보를 리턴
public ItemData GetItemData(int index)
{
if(!IsValidIndex(index)) return null;
if(items[index] == null) return null;
return items[index].Data;
}
// .. 해당 슬롯의 아이템 이름 리턴
public string GetItemName(int index)
{
if(!IsValidIndex(index)) return "";
if(items[index] == null) return "";
return items[index].Data.name;
}
#endregion
-
작성한 Inventory 클래스를 살펴보겠습니다.
-
먼저, Awake 함수에서 최대수용한도만큼의 아이템 배열을 생성합니다.
-
UpdateSetAccessibleStatesAll 함수는 InventoryUI의 SetAccessibleSlotRange를 호출하는데, 이 함수는 접근 가능한 슬롯의 범위를 설정합니다. 따라서 initCapacity에 따라 활성화된 슬롯의 갯수가 정해집니다.
-
IsValidIndex 함수는 해당 index 슬롯이 Capacity 범위에 있는지 검사하는 함수입니다.
-
FindEmptySlotIndex 함수는 추후에 아이템 정렬을 위한 함수입니다.
-
나머지 Check & Getter 에 있는 함수들은 슬롯의 정보를 체크, 가져오기 위한 함수들입니다.
-
댓글남기기