Unity自带的ObjectPool的使用

2024-01-21  本文已影响0人  全新的饭

使用方式

使用前,先new一个pool。new时需传入模板和根节点。
当需要从池中拿出一个元素时,使用pool.Get()方法,需自行激活。
当将元素放回池时,使用pool.Release(obj)即可。

代码

MyUnityObjPool.cs

public class MyUnityObjPool<T> where T : Component
{
    private Transform _root;
    private T _template;
    protected T Template => _template;
    private IObjectPool<T> _pool;

    public MyUnityObjPool(T template, Transform root)
    {
        _template = template;
        _root = root;
        _pool = new ObjectPool<T>(CreatePooledItem, OnTakeFromPool, OnReturnedToPool, OnDestroyPoolObject);
    }
    public void Destroy()
    {
        _pool.Clear();
        _pool = null;
        _root = null;
        _template = null;
    }
    public T Get()
    {
        return _pool.Get();
    }
    public void Release(T obj)
    {
        _pool.Release(obj);
    }

    private T CreatePooledItem()
    {
        var obj = GameObject.Instantiate(_template.gameObject).GetComponent<T>();
        obj.transform.SetParent(_root);
        obj.transform.localScale = Vector3.one;
        return obj;
    }
    private void OnReturnedToPool(T obj)
    {
        obj.gameObject.SetActive(false);
    }
    private void OnTakeFromPool(T obj)
    { }
    void OnDestroyPoolObject(T obj)
    {
        if (obj != null && obj.gameObject != null)
        {
            GameObject.Destroy(obj.gameObject);
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读