설계 1. Inventory상에 장비 아이템을 DragAndDrop을 통해 장비창 슬롯에 옮깁니다.
설계 2. 각각의 슬롯에는 장비 아이템 종류를 구분하고 알맞은 장비만 장착할 수 있도록 설정합니다.
설계 3. 무기에 한해서만 캐릭터가 장착한 무기를 변경합니다.
설계 4. 슬롯의 종류 : Weapon Head Cloth Foot
설계3의 경우 큰 의미는 없고 캐릭터의 미관 상 무기만 변경하는 것이 가장 깔끔하여 무기 모델링만 변경되도록 설계했습니다.
디자인

EquipmentSlot장비를 장착하는 로직을 수행하는 Slot입니다. 앞 포스팅에서 말한 것처럼 아이템 아이콘을DragAndDropSlot을 상속 받아 아이콘과의 상호작용을 구현했습니다.
에디터의 Inspector를 통해 해당 슬롯에 장착해야할 장비의 종류를 설정합니다.

public EquipmentType equipmentType; //Inspector를 통해 장비 종류 설정
public bool CheckEquipmentItem(GameObject item)
{
return base.CheckVaildItem<ItemType>(item, ItemType.Equipment);
}
이 equipmentType을 기반으로 해당 Slot에 DragAndDrop된 아이템을 판별합니다.
PlayerState와의 상호작용State Classpublic class State{
...
public void EquipItem(Equipment item)
{
switch (item.subType)
{
case EquipmentType.Head:
{
defend += item.value;
break;
}
case EquipmentType.Weapon:
{
attack += item.value;
break;
}
case EquipmentType.Cloth:
{
maxHP += (int)item.value;
break;
}
case EquipmentType.Foot:
{
defend += item.value;
break;
}
}
NotifyStateChange()
...
}
NotifyStateChange() 는 앞서 Consumable Item 관련 포스팅을 참조해주세요!
[link]
Equipmentpublic class Equipment : ItemData
{
public EquipmentType subType;
private void OnEnable()
{
itemType = ItemType.Equipment;
}
public override void Use(){ //장비 장착을 의미
State state = PlayerController.player.myState;
PlayerController.player.SetEquipment(model);
state.EquipItem(this);
}
public void Detach()
{
State state = PlayerController.player.myState;
PlayerController.player.CleanEquipment();
state.DetachItem(this);
}
}
Equipment.sc는 Scriptable Object를 상속 받는 스크립트 입니다. ItemData에서 Value값을 상속 받아서 inspector로 설정하면 해당 아이템의 Value를 받게 되는 것입니다.
[.png]
//장비 장착
public void SetEquipment(GameObject item)
{
if(weaponTransform.childCount > 0)
{
Destroy(weaponTransform.GetChild(0).gameObject);
}
GameObject newItem = Instantiate(item, weaponTransform);
Destroy(newItem.GetComponent<Equipment_DroppedItemSC>());
Destroy(newItem.GetComponent<Collider>());
}
//장비 탈착
public void CleanEquipment()
{
Destroy(weaponTransform.GetChild(0).gameObject);
}
이는 캐릭터의 장비 장착 모션을 구현한 메소드입니다. Equipment로부터 model(장비 오브젝트 프리팹)을 받아 캐릭터의 손위치에 Instance를 생성하도록 하여 장비창에 장착한 무기가 캐릭터에 그대로 적용되도록 했습니다.
Destroy(newItem.GetComponent<Equipment_DroppedItemSC>());
Destroy(newItem.GetComponent<Collider>());
이 두 코드를 통해 해당 아이템이 캐릭터 로직에 있어 불필요한 Component들을 동적으로 삭제하여 로직간의 충돌을 방지했습니다.
⇒ Collider 까지 삭제한 이유는?? 다음 몬스터 로직 포스팅에서 설명드리겠습니다!
[.GIF]
[.gif]