아래처럼 코드를 생성
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool<T> where T : Component
{
private T prefab;
private Queue<T> pool = new Queue<T>();
public ObjectPool(T prefab, int initialSize)
{
this.prefab = prefab;
for (int i = 0; i < initialSize; i++)
{
T obj = GameObject.Instantiate(prefab);
obj.gameObject.SetActive(false);
pool.Enqueue(obj);
}
}
public T Get(Transform parent = null)
{
T obj;
if (pool.Count > 0)
{
obj = pool.Dequeue();
}
else
{
obj = GameObject.Instantiate(prefab);
}
obj.gameObject.SetActive(true);
if (parent != null) obj.transform.SetParent(parent);
return obj;
}
public void ReturnToPool(T obj)
{
obj.gameObject.SetActive(false);
pool.Enqueue(obj);
}
}
기존에 instantiate하는 코드 안에
ObjectPool<Enemy> enemyPool;
이런식으로 생성하고자 하는 타입, pool 선언을 해주고
private void Awake()
{
enemyPool = new ObjectPool<enemy>(enemyPrefab.GetComponent<enemy>(), 64);
}
이런식으로 시작할 때 연결해준다. prefab도 연결해줘야됨
그리고 instantiate로 생성했던 부분마다 pool.Get(); 해준다
GameObject enemy = Instantiate(enemyPrefab, enemyHolder);
=>
GameObject enemy = chessPool.Get(enemyHolder).gameObject;
이렇게 사용
Destroy(enemies[x, y]);
=>
enemyPool.ReturnToPool(enemies[x,y].GetComponent<Enemy>());
나는 이런식으로 써줬는데 각자 원하는 타입에 맞춰 뒷부분은 바꾸면 되겠고
pool.ReturnToPool 사용하면 된다
728x90
반응형
'공부 > Unity' 카테고리의 다른 글
[Unity] 애니메이터 랜덤 딜레이 시간 (0) | 2025.09.01 |
---|---|
[Unity] Shader URP 물 속 효과 주기 (화면 꿀렁이기) (2) | 2025.08.28 |
[Unity] Input System에서의 Get Key Down (0) | 2025.08.14 |
[Unity] XR interaction toolkit과 UI 사용하기 / VR 한글 키보드 (3) | 2025.07.04 |
[Unity] XR Toolkit Interaction (0) | 2025.06.27 |