Что это?
Паттерн: переиспользование объектов вместо Instantiate/Destroy.
Зачем?
• Убрать тормоза при частом спавне (пули, враги)
• Снизить нагрузку GC
• Предотвратить фрагментацию памяти
Как реализовать?
public class BulletPool : MonoBehaviour
{
[SerializeField] GameObject bulletPrefab;
[SerializeField] int poolSize = 20;
private Queue<GameObject> pool = new Queue<GameObject>();
void Start()
{
for (int i = 0; i < poolSize; i++)
{
GameObject bullet = Instantiate(bulletPrefab);
bullet.SetActive(false);
pool.Enqueue(bullet);
}
}
public GameObject GetBullet()
{
if (pool.Count > 0)
{
GameObject bullet = pool.Dequeue();
bullet.SetActive(true);
return bullet;
}
return Instantiate(bulletPrefab); // Fallback
}
public void ReturnBullet(GameObject bullet)
{
bullet.SetActive(false);
pool.Enqueue(bullet);
}
}
Использование:
void Shoot()
{
GameObject bullet = pool.GetBullet();
bullet.transform.position = firePoint.position;
bullet.GetComponent<Rigidbody>().velocity = transform.forward * 50f;
}
// В пуле: void OnCollisionEnter() => pool.ReturnBullet(gameObject);
Важно!
• Рестарт состояния при возврате в пул
• Динамически расширяй пул при нехватке
• Для частиц используй ParticleSystem.Stop(true)
#Unity #Optimization #GameDev
