250331 TIL

박소희·2025년 3월 31일

Unity_7기

목록 보기
58/94

몬스터 드랍 - 오브젝트 풀

public class ItemDrop : Singleton<ItemDrop>
{
    private GameObject meatPrefab;
    private GameObject expPrefab;

    protected override void Awake()
    {
        meatPrefab = Resources.Load<GameObject>("Prefabs/MonsterDrop/Meat");
        expPrefab = Resources.Load<GameObject>("Prefabs/MonsterDrop/Exp");
    }

    public void DropMeat(Vector3 position)
    {
        Poolable meat = PoolManager.Instance.Get(meatPrefab);
        meat.transform.position = position;
        meat.gameObject.SetActive(true);
        meat.GetComponent<Item>().GainItem = () => PoolManager.Instance.Release(meat);
    }

    public void DropExp(Vector3 position, int expAmount)
    {
        for (int i = 0; i < expAmount / 10; i++)
        {
            Poolable exp = PoolManager.Instance.Get(expPrefab);

            Vector3 randomOffest = new Vector3(Random.Range(-1.5f, 1.5f), .3f, Random.Range(-1.5f, 1.5f));
            exp.transform.position = position + randomOffest;
            exp.gameObject.SetActive(true);

            exp.GetComponent<Item>().GainItem = () => PoolManager.Instance.Release(exp);
        }
    }

자원 생성 시 비활성화 코드 이벤트에 추가

public class Item : MonoBehaviour
{
    [SerializeField] private int value;
    [SerializeField] private ItemType itemType;

    public Action GainItem;
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            switch (itemType)
            {
                case ItemType.Resource:
                    GameManager.Instance.player.condition.GainMeat(value);
                    break;
                case ItemType.Exp:
                    GameManager.Instance.player.condition.GainExp(value);
                    break;
            }
           GainItem?.Invoke();
        }
    }
}

아이템 획득 시 비활성화

0개의 댓글