using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; /// /// 池子里的一列容器 /// public class poolData { //容器对象挂载的父节点 public GameObject fatherObj; //对象的容器 public List poolList; //构造函数 public poolData(GameObject obj,GameObject poolObj) { //给我们的容器创建一个父对象,并且把他作为我们pool对象的子物体 fatherObj = new GameObject(obj.name); fatherObj.transform.parent = poolObj.transform; poolList = new List() { obj }; PushObj(obj); } /// /// 往容器里面压东西 /// /// public void PushObj(GameObject obj) { //失活隐藏 obj.SetActive(false); //存起来 poolList.Add(obj); //设置父对象 obj.transform.parent = fatherObj.transform; } /// /// 从容器里面取东西 /// /// public GameObject GetObj() { GameObject obj = null; //取出第一个 obj = poolList[0]; poolList.RemoveAt(0); //激活显示 obj.SetActive(true); //断开父对象 obj.transform.parent = null; return obj; } } //缓存池模块,对象池 //Dictionary List 字典 链表 //GameObject和Resources两个公共类的API public class PoolMgr :BaseManager { //缓存池容器 public Dictionary poolDic = new Dictionary(); private GameObject poolObj; /// /// 往外拿东西 /// /// /// public void GetObj(string name,UnityAction callback) { //GameObject obj = null; //有容器,且容器有物品,可以拿 if(poolDic.ContainsKey(name) && poolDic[name].poolList.Count > 0) { //obj = poolDic[name].GetObj(); callback(poolDic[name].GetObj()); } else { //将下面的改成异步加载资源,创建对象给外部用 ResMgr.GetInstance().LoadAsync(name, (o) => { o.name = name; callback(o); }); // obj = GameObject.Instantiate(Resources.Load(name)); //把对面名字改得和池子的名字一样 // obj.name = name; } } /// /// 还回去 /// public void PushObj(string name, GameObject obj) { if (poolObj == null) { poolObj = new GameObject("Pool"); } //里面有容器 if (poolDic.ContainsKey(name)) { poolDic[name].PushObj(obj); } //里面没有容器 else { //加一个list直接加个物品进去 poolDic.Add(name, new poolData(obj,poolObj)); } } /// /// 清空缓存池,主要用在场景切换时 /// public void Clear() { poolDic.Clear(); poolObj = null; } }