对象池的关键代码:
public class ObjectPoolManager
{
// 多一对象池
private Dictionary<string, List<GameObject>> dicPools;
//
#region 单例
private static ObjectPoolManager instance;
public static ObjectPoolManager Instance
{
get
{
if (instance == null)
{
instance = new ObjectPoolManager();
}
return instance;
}
}
private ObjectPoolManager()
{
dicPools = new Dictionary<string, List<GameObject>>();
}
#endregion
// 从对象池中实例化物体
public GameObject Instanciate(GameObject prefab)
{
GameObject result;
// 根据prefab.name判断对象池里是否有该游戏对象,并且个数大于零
if (dicPools.ContainsKey(prefab.name) && dicPools[prefab.name].Count > 0)
{
result = dicPools[prefab.name][0];
dicPools[prefab.name].Remove(dicPools[prefab.name][0]);
result.SetActive(true);
return result;
}
else
{
// 最开始执行一定是先执行下面的代码,设定好对象池中游戏的名字
result = MonoBehaviour.Instantiate(prefab) as GameObject;
result.name = prefab.name;
return result;
}
}
// 将消失的物体放回对象池
public void DestroyObj(GameObject prefab)
{
prefab.SetActive(false);
if (!dicPools.ContainsKey(prefab.name))
{
dicPools[prefab.name] = new List<GameObject>();
}
dicPools[prefab.name].Add(prefab);
}
}
挂载在对象池游戏对象上:
public class CubeDestroy : MonoBehaviour
{
void OnEnable()
{
StartCoroutine("MyDestroy");
}
IEnumerator MyDestroy()
{
yield return new WaitForSeconds(2);
ObjectPoolManager.Instance.DestroyObj(gameObject);
}
}
测试代码:
public class GameCtrl : MonoBehaviour
{
public GameObject cubePrefab;
public GameObject spherePrefab;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
ObjectPoolManager.Instance.Instanciate(cubePrefab);
}
if (Input.GetMouseButtonDown(1))
{
ObjectPoolManager.Instance.Instanciate(spherePrefab);
}
}
}