몬스터 드랍 - 오브젝트 풀
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();
}
}
}
아이템 획득 시 비활성화