아이템 소모 기능 자체는 만들기 어렵지 않았지만 구조적으로
기능들을 어떤 곳에 넣어야 할지 고민을 많이 했다.
우선 대략적인 호출 순서를 적어보자면
동작에 의해 실행되는 부분 -> 인벤토리 컨트롤러의 아이템 소모 메서드
-> 인벤토리 모델의 아이템 소모 메서드 -> 아이템 패널의 실질적 소모 메서드
이런 형식으로 진행된다.
동작에 의해 실행되는 부분은 유저의 정보를 불러오고 있었고
정보 클래스에는 인벤토리의 정보가 들어있었다.
그래서 인벤토리에 쉽게 접근할 수 있었고 기능을 연결하도록 제작했다.
1. 동작에 의해 실행되는 부분
public class Consume : ItemFunction
{
public override void execute(GameObject user)
{
if (user.TryGetComponent(out Equipment equip) && user.TryGetComponent(out Character character))
{
GameObject equipedWeapon = equip.GetEquipedWeapon();
InventoryController inventoryController = character.GetInventory();
inventoryController.UseConsumableItemFunc();
}
}
}
다음으로 컨트롤러가 모델과 뷰의 객체를 생성하고 관리하고 있으니
컨트롤러가 모델의 메서드를 가져와 사용하는 형태로 제작하면 좋을 것 같다고 판단했다.
2. 인벤토리 컨트롤러의 아이템 소모 메서드
public void UseConsumableItemFunc()
{
if(_curSelectedPanel != null)
_inventoryModel.UseConsumableItem(_curSelectedPanel);
}
이제 모델에서는 컨트롤러에 있는 현재 선택된 패널 정보를 가져와야 했기 때문에
모델 메서드에서 인자로 받아오도록 했다.
하지만 인자로 받아온 패널의 소모품이 모두 소모 됐을 때
현재 선택된 정보가 null이 돼야 했다.
따라서 선택된 패널을 null 시켜주고 장착표시를 해제해주는 컨트롤러 메서드
장비 해제 기능을 Action으로 연결하여 사용하고자 했다.
3. 인벤토리 모델의 아이템 소모 메서드
public void UseConsumableItem(ItemPanel selectedPanel)
{
if(selectedPanel != null && selectedPanel.itemSlot.item.ItemType == ItemType.Consumable)
{
if (!selectedPanel.UseItem())
{
OnUnEquip.Invoke(selectedPanel);
}
RefreshAction();
}
}
마지막으로 패널에 직접 들어가 소모하는 부분의 메서드를 불러오는 구조로 제작했다.
물론 모델의 소모 메서드에서 패널에 있는 정보에 접근하여 소모 기능 자체를 모두 구현할 수
있었지만 굳이 패널에 정보가 모두 들어있는데 불러와서 쓰는건 코드상 복잡하기도 하고
의존성이 굉장히 높아질 것 이라 판단했다.
그리고 아이템을 모두 사용했다면 즉시 선택된 패널과 아이템 슬롯의 정보가 초기화되야 했다.
따라서 아이템 패널에 있는 메서드의 반환값을 bool로 둬서 만약 소모품이 1개 이하였다면
false를 반환하여 즉시 UnEquip 메서드가 Action으로 실행되게 제작했다.
4. 아이템 패널의 실질적 소모 메서드
public bool UseItem()
{
if(itemSlot.stacks > 1)
{
itemSlot.stacks--;
return true;
}
else
{
inventory.ClearSlot(itemSlot);
return false;
}
}
지금은 뭔가 복잡하게 보여서 나중에 여유가 될 때 이 부분을
어떻게 하면 더욱 간단하게 구현할 수 있을지 고민해봐야 겠다.
'프로젝트 기록 > Project N' 카테고리의 다른 글
창고 개발 기록 (NPC) (0) | 2024.04.25 |
---|---|
창고 개발 기록 (인벤토리 데이터 불러오기) (0) | 2024.04.04 |
인벤토리 개발 기록 (창고와 인벤토리) (0) | 2024.04.03 |
UIManager 구현 기록 (1) | 2024.02.13 |
UIManager는 왜 만드는 걸까? (0) | 2024.02.07 |