[Unity] 오픈월드 제작기 Template

WowNo0607·2025년 1월 12일

OpenWorldGame

목록 보기
8/9

⭐ 장비창 만들기

🔧 설계

설계 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와의 상호작용

  • 장비 설계 세부사항
    • Head : 방어력(depend) 증가
    • Weapon : 공격력(attack) 증가
    • Cloth : 최대 HP(maxHP) 증가
    • Foot : 방어력(depend) 증가

State Class

public 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]

Equipment

public 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.scScriptable 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]

Test Scene

[.gif]

로직 구현 총평

profile
안녕하세요

0개의 댓글