这里有一篇文章,https://www.cnblogs.com/yugejuhao/p/7677497.html,这对象池还是比较简单易懂的,下面有我在项目中用到的,分享记录一下。
可以自己添加一个方法,设置物体生成在哪个父节点下面
这里是项目中用到的对象池 ,思想是跟上面一样的,不过使用的ET框架,可能写法会有点奇怪,不过都是一样的!
namespace *****
{
/// <summary>
///pdk 对象池
/// </summary>
public class PoolManager
{
private static PoolManager instance;
public static PoolManager Instance()
{
if (instance == null)
{
instance = new PoolManager();
}
return instance;
}
/// <summary>
/// 对象池管理字典(池名,池内对象)
/// </summary>
Dictionary<string, List<GameObject>> PoolController = new Dictionary<string, List<GameObject>>();
/// <summary>
/// 获取特效
/// </summary>
/// <returns></returns>
private GameObject GetEffect(string name,string prefab)
{
ETModel.Game.Scene.GetComponent<ResourcesComponent>().LoadBundle(name + ".unity3d");
//实例化一个预制体
GameObject obj = ETModel.Game.Scene.GetComponent<ResourcesComponent>().GetAsset(name + ".unity3d", prefab) as GameObject;
GameObject temp = UnityEngine.MonoBehaviour.Instantiate(obj );
return temp;
}
/// <summary>
/// 获取对象
/// </summary>
/// <param name="path">bundle名字</param>
/// <param name="poolName">资源名字</param>
/// <returns></returns>
public GameObject GetPool(string path,string poolName)
{
GameObject obj;
GameDebug.LogYellow("PoolController+++++++++++++++"+ PoolController.Count);
///存在直接从池子拿
if (PoolController.ContainsKey(poolName) && PoolController[poolName].Count > 0)
{
obj = PoolController[poolName][0];
PoolController[poolName].RemoveAt(0);
}
///不够用,继续克隆
else if (PoolController.ContainsKey(poolName) && PoolController[poolName].Count <= 0)
{
obj = GetEffect(path, poolName); //GameObject. Instantiate(GetEffect(path, poolName) as GameObject);
}
///不存在克隆
else
{
obj = GetEffect(path, poolName); //GameObject.Instantiate(GetEffect(path, poolName) as GameObject);
PoolController.Add(poolName, new List<GameObject>() { });
}
///存在,激活
if (obj)
{
obj.SetActive(true);
}
return obj;
}
/// <summary>
/// 回收
/// </summary>
/// <param name="obj">物体</param>
/// <param name="name">名字</param>
public void IntoPool(GameObject obj, string name)
{
obj.transform.DOKill();
obj.transform.parent = UnityTool.Find("UIAssets").transform;
obj.SetActive(false);
if (PoolController.ContainsKey(name))
{
PoolController[name].Add(obj);
}
}
/// <summary>
/// 清空对象池
/// </summary>
public void Clear()
{
PoolController.Clear();
}
}
}
我们只需要obj = PoolManager.Instance().GetPool(“路径”,“物体名字”);