2 분 소요

Intro

  • 이번 포스팅에서는 모든 아이템들을 배열로 관리하고, 인벤토리내의 동작을 구현하는 Inventory 클래스를 구현해봅니다.

  • Inventory 클래스는 InventoryUI 클래스와 상호작용하게 됩니다.

  • Inventory 클래스가 관리할 데이터는 Item 배열과 Capacity(아이템 수용 한도) 입니다.

  • 또한 Inventory 클래스에서 작성할 동작들은 다음과 같습니다.
    1. 아이템 정보 확인
    2. 아이템 정보 갱신
    3. 아이템 추가
    4. 아이템 제거
    5. 아이템 이동
    6. 아이템 사용
    7. 아이템 정렬

      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 클래스를 살펴보겠습니다.

    1. 먼저, Awake 함수에서 최대수용한도만큼의 아이템 배열을 생성합니다.

    2. UpdateSetAccessibleStatesAll 함수는 InventoryUI의 SetAccessibleSlotRange를 호출하는데, 이 함수는 접근 가능한 슬롯의 범위를 설정합니다. 따라서 initCapacity에 따라 활성화된 슬롯의 갯수가 정해집니다.

    3. IsValidIndex 함수는 해당 index 슬롯이 Capacity 범위에 있는지 검사하는 함수입니다.

    4. FindEmptySlotIndex 함수는 추후에 아이템 정렬을 위한 함수입니다.

    5. 나머지 Check & Getter 에 있는 함수들은 슬롯의 정보를 체크, 가져오기 위한 함수들입니다.

댓글남기기