2

Object Pools in Unity

 2 years ago
source link: https://matthewminer.com/2022/06/09/object-pools-in-unity
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Matthew Miner

Object Pools in Unity

June 9, 2022

Originally I was going to write a post singing the praises of Lean Pool. It’s everything a Unity package should be — a sensible API, regularly maintained and thoroughly documented. And it’s free. It’s hard to argue with free.

If you use Unity 2020 or earlier, look no further than Lean Pool for your object pooling needs. But as of Unity 2021 there’s a new built-in option: ObjectPool

Let’s explore the API by creating the world’s lousiest rain system. We’ll start with a “droplet” component that moves a game object downward at a constant rate.

class Droplet : MonoBehaviour
{
    void Start()
    {
        Debug.Log("New droplet");
    }

    void Update()
    {
        transform.Translate(Vector3.down * Time.deltaTime * 10);
    }
}

Now for a component to spawn these droplets. Instead of instantiating and destroying game objects repeatedly, we instead recycle them with an ObjectPool. Its interface is minimal; pass a function that creates an object to its constructor, call Get to acquire an object, then Release to return it.

class RainSystem : MonoBehaviour
{
    ObjectPool<GameObject> pool;

    IEnumerator Start()
    {
        pool = new ObjectPool<GameObject>(() =>
        {
            var go = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            go.AddComponent<Droplet>();
            return go;
        });

        // Spawn new droplets repeatedly.
        while (true)
        {
            StartCoroutine(SpawnDroplet());
            yield return new WaitForSeconds(0.5f);
        }
    }

    IEnumerator SpawnDroplet()
    {
        var go = pool.Get();
        go.transform.position = Random.insideUnitSphere * 10;
        yield return new WaitForSeconds(3);
        pool.Release(go);
    }
}

Observe that the console stops printing “New droplet” after a few times, because no new instances are being created. ObjectPool is working its magic.

That’s it. Object pools — that basic but essential pattern you’ve probably implemented a dozen times, now available out of the box.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK