반응형
코드 작성
using System.Collections.Generic;
using UnityEngine;
// 제네릭 풀 클래스
public class ObjectPool<T> where T : MonoBehaviour
{
private List<T> pool = new List<T>();
private T prefab;
public ObjectPool(T prefab, int initialSize)
{
this.prefab = prefab;
for (int i = 0; i < initialSize; i++)
{
AddObjectToPool();
}
}
private T AddObjectToPool()
{
T newObj = GameObject.Instantiate(prefab);
newObj.gameObject.SetActive(false);
pool.Add(newObj);
return newObj;
}
public T GetObjectFromPool()
{
foreach (T obj in pool)
{
if (!obj.gameObject.activeInHierarchy)
{
obj.gameObject.SetActive(true);
return obj;
}
}
// 풀에 사용 가능한 오브젝트가 없으면 새로 생성
return AddObjectToPool();
}
public void ReturnObjectToPool(T obj)
{
obj.gameObject.SetActive(false);
}
}
// 사용 예시
public class GameManager : MonoBehaviour
{
public Enemy enemyPrefab; // 적 오브젝트 프리팹
public Bullet bulletPrefab; // 총알 오브젝트 프리팹
private ObjectPool<Enemy> enemyPool;
private ObjectPool<Bullet> bulletPool;
void Start()
{
// 각각의 풀 생성
enemyPool = new ObjectPool<Enemy>(enemyPrefab, 10);
bulletPool = new ObjectPool<Bullet>(bulletPrefab, 20);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// 적 오브젝트 풀에서 오브젝트 가져오기
Enemy enemy = enemyPool.GetObjectFromPool();
enemy.transform.position = Vector3.zero; // 예: 초기화
}
if (Input.GetKeyDown(KeyCode.B))
{
// 총알 오브젝트 풀에서 오브젝트 가져오기
Bullet bullet = bulletPool.GetObjectFromPool();
bullet.transform.position = Vector3.zero; // 예: 초기화
}
}
}
// 간단한 적 클래스
public class Enemy : MonoBehaviour
{
// 적 오브젝트의 로직
}
// 간단한 총알 클래스
public class Bullet : MonoBehaviour
{
// 총알 오브젝트의 로직
}
반응형