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;
}
}