使用方式
使用前,先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);
}
}
}
网友评论