☸ 간단히 확장가능한 상호작용 오브젝트

HSD·2025년 3월 16일
0

팀 프로젝트

목록 보기
5/8

✤ 인터페이스 IGimmik

public interface IGimmik
{
    public void Activate();
}

✤ Interactive_Object

using UnityEngine;

public class Interactive_Object : MonoBehaviour, IGimmik
{
    [SerializeField] protected ItemData needItem;

    public void Activate()
    {
        if (needItem == null)
        {
            GimmikActivate();
            return;
        }

        bool itemFound = false;

        foreach (var item in InventoryManager.Instance.inventory.inventoryList)
        {
            if (item.data == needItem)
            {
                GimmikActivate();
                itemFound = true;
                break;
            }
        }

        if (!itemFound)
        {
            GimmikDeactivate();
        }
    }

    protected virtual void GimmikActivate()
    {
        
    }
    protected virtual void GimmikDeactivate()
    {
        
    }
}

잠긴 문 등에 필요한 ItemData needItem이 있다. ( 필요없다면 세팅X )

  • foreach로 인벤토리 리스트를 순회하며 만약 아이템이 있다면 기믹을 실행하고
    아이템이 없다면 실패하였을 때 원하는 기능을 실행한다.

정말 간단히 상속받아 문 같은 것들을 구현할 수 있다.

✱ 문

using UnityEngine;

public class Door : Interactive_Object
{
    protected override void GimmikActivate()
    {
        base.GimmikActivate();
        //문이 열린다.
    }
    protected override void GimmikDeactivate()
    {
        base.GimmikDeactivate();
        //사운드가 재생되며 문이 살짝 흔들린다.
    }
}

같이 확장이 쉽게 가능하다.

✤ 테스트 환경

public class Test : MonoBehaviour
{
    public ItemData itemData;
    public IGimmik gimmik;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
            InventoryManager.Instance.AddItem(itemData);

        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            gimmik = GetComponent<IGimmik>();
            gimmik.Activate();
        }
    }
}

2번을 클릭 시 IGimmik을 탐색하여 가져오고 Activate를 실행한다.
(아이템이 있다면 활성화, 없다면 비활성화 로그가 뜨는 것 까지 확인하였다.)

0개의 댓글