对象池管理器
public class PoolManager : Singleton<PoolManager> {
private Dictionary<AssetPath, Pool> _dic = new Dictionary<AssetPath, Pool>();
public void Init()
{
foreach (PrefabCfg item in ConfigManager.Instance.PrefabCfgDic.Values)
{
List<GameObject> temp = new List<GameObject>();
for (int i = 0; i < item.InitCount; i++)
{
temp.Add(Spawn(item.AssetPath));
}
for (int i = 0; i < temp.Count; i++)
{
Recycle(temp[i],item.AssetPath);
}
}
}
public GameObject Spawn(AssetPath path)
{
GameObject result = null;
Pool pool = null;
string[] strs = path.ToString().Split(new char[] { '_' },System.StringSplitOptions.RemoveEmptyEntries);
if(_dic.ContainsKey(path))
{
pool = _dic[path];
}
else
{
pool = new Pool();
_dic.Add(path, pool);
}
result = pool.Spawn(strs[0], strs[1]);
return result;
}
public void Recycle(GameObject obj, AssetPath path)
{
if(_dic.ContainsKey(path))
{
_dic[path].Recycle(obj);
}
}
}
对象池
using UnityEngine;
using System.Collections.Generic;
public class Pool
{
private List<GameObject> _list = new List<GameObject>();
public GameObject Spawn(string assetType,string assetName)
{
GameObject result = null;
if(_list.Count > 0)
{
result = _list[0];
_list.Remove(result);
result.SetActive(true);
}
else
{
result = GameObject.Instantiate(Resources.Load<GameObject>(assetType + "/" + assetName));
}
result.name = assetName;
return result;
}
public void Recycle(GameObject obj)
{
obj.SetActive(false);
_list.Add(obj);
}
}