Unity 学习笔记
2019-04-25 本文已影响0人
dyzsoft
Unity 对象池实现方案:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class ObjectPool : MonoBehaviour
{
private List<GameObject> _objectList;
private GameObject _objectToRecycle;
private int _defaultPoolSize = 5;
private static Dictionary<int, ObjectPool> _pool = new Dictionary<int, ObjectPool>();
private void Init()
{
_objectList = new List<GameObject>(_defaultPoolSize);
for (int i = 0; i < _defaultPoolSize; i++)
{
GameObject go = Instantiate(_objectToRecycle);
go.transform.SetParent(transform);
go.SetActive(false);
_objectList.Add(go);
}
}
private GameObject PoolObject(Vector3 position = default(Vector3), Quaternion rotation = default(Quaternion))
{
GameObject freeObject = (from item in _objectList
where item.activeSelf == false
select item
).FirstOrDefault();
if (freeObject == null)
{
freeObject = Instantiate(_objectToRecycle, position, rotation);
freeObject.transform.SetParent(transform);
_objectList.Add(freeObject);
}
else
{
freeObject.transform.position = position;
freeObject.transform.rotation = rotation;
freeObject.SetActive(true);
}
return freeObject;
}
public static void InitPool(GameObject original, int poolsize = 5)
{
int _originalID = original.GetInstanceID();
if (!_pool.ContainsKey(_originalID))
{
GameObject objectPoolGameObject = new GameObject("ObjectPool:" + original.name);
ObjectPool objPool = objectPoolGameObject.AddComponent<ObjectPool>();
objPool._objectToRecycle = original;
objPool._defaultPoolSize = poolsize;
objPool.Init();
_pool.Add(_originalID, objPool);
}
}
public static GameObject GetInstance(int originalID, Vector3 position = default(Vector3), Quaternion rotation = default(Quaternion))
{
return _pool[originalID].PoolObject(position, rotation);
}
public static GameObject GetInstance(GameObject original, Vector3 position = default(Vector3), Quaternion rotation = default(Quaternion))
{
int id = original.GetInstanceID();
InitPool(original);
return _pool[id].PoolObject(position, rotation);
}
public void Release(GameObject obj)
{
obj.SetActive(false);
}
}