美文网首页
Unity自带的ObjectPool的使用

Unity自带的ObjectPool的使用

作者: 全新的饭 | 来源:发表于2024-01-21 11:01 被阅读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);
        }
    }
}

相关文章

网友评论

      本文标题:Unity自带的ObjectPool的使用

      本文链接:https://www.haomeiwen.com/subject/ycreodtx.html