Object Pooling for Unity
- Faster in terms of performance than Instantiate/Destroy (Test at the end of README)
- Easy to use
- Easy to integrate with already written spawn systems
- Callbacks OnSpawn & OnDespawn for resseting after object being used
using ToolBox.Pools;
using UnityEngine;
public class Spawner : MonoBehaviour
{
[SerializeField] private GameObject _prefab = null;
private void Awake()
{
_prefab.Populate(count: 50);
}
}
Also, you can just put PoolInstaller component on any object on Scene and select which objects you want to prepopulate
using ToolBox.Pools;
using UnityEngine;
public class Spawner : MonoBehaviour
{
[SerializeField] private GameObject _prefab = null;
public void Spawn()
{
_prefab.Spawn(transform.position, transform.rotation);
// Get object from pool with component
_prefab.Spawn<Rigidbody>(transform.position, transform.rotation).isKinematic = true;
}
}
using ToolBox.Pools;
using UnityEngine;
public class Spawner : MonoBehaviour
{
[SerializeField] private GameObject _prefab = null;
public void Spawn()
{
var instance = _prefab.Spawn(transform.position, transform.rotation);
// Use this only with Instances of Prefab
instance.Despawn();
}
}
using ToolBox.Pools;
using UnityEngine;
public class Health : MonoBehaviour, IPoolable
{
[SerializeField] private float _maxHealth = 100f;
private float _health = 0f;
private void Awake() =>
_health = _maxHealth;
// IPoolable method
public void OnSpawn() =>
_health = _maxHealth;
// IPoolable method
public void OnDespawn() { }
}
Creating and destroying 1000 objects.
using Sirenix.OdinInspector;
using System.Diagnostics;
using UnityEngine;
public class Tester : MonoBehaviour
{
[SerializeField] private GameObject _object = null;
[Button]
private void Test()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 1000; i++)
{
var instance = Instantiate(_object);
Destroy(instance);
}
stopwatch.Stop();
print($"Milliseconds: {stopwatch.ElapsedMilliseconds}");
}
}
using Sirenix.OdinInspector;
using System.Diagnostics;
using ToolBox.Pools;
using UnityEngine;
public class Tester : MonoBehaviour
{
[SerializeField] private GameObject _object = null;
private void Awake()
{
_object.Populate(1000);
}
[Button]
private void Test()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 1000; i++)
{
var instance = _object.Spawn();
instance.Despawn();
}
stopwatch.Stop();
print($"Milliseconds: {stopwatch.ElapsedMilliseconds}");
}
}