C# 对象池
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool : MonoSingle<ObjectPool>
{
//创建一个池子来存储这些对象(用字典的形式来区分不同类型)
//key用来存池子名称,value用list存游戏对象
public IDictionary<string,List<GameObject>> pool;
//实例化对象池
public ObjectPool()
{
pool = new Dictionary<string, List<GameObject>> ();
// pool.Clear();
}
/// <summary>
/// 获取对象
/// </summary>
public GameObject GetObj(string objName)
{
//要获取的对象
GameObject currentObj=null;
//判断是否有该类型的对象池,如果包含这个对象池
if(pool.ContainsKey(objName))
{
Debug.Log("getObj: " + objName);
//再判断对象池中是否有东西
if(pool[objName].Count>0)
{
//获取当前对象
currentObj=pool[objName][0];//从第0号开始
//从池中移除
pool[objName].Remove(currentObj);
}
}
//如果没有该类型对象池
//如果对象为空
if (currentObj == null)
{
//找一个继承mono的单例
currentObj = GameMgr.Instance.loadObj (objName);
}
// currentObj.transform.position = pos;
// currentObj.transform.rotation = qua;
//激活对象
currentObj.SetActive(true);
return currentObj;
}
/// <summary>
/// 保存对象
/// </summary>
public void SetObj(GameObject go)
{
//取消激活对象
//对象要进入对象池里,不要对游戏产生影响,所以先设置为非激活
go.SetActive (false);
//获取对象池名称
//replace(替换)把带有clone的文件替换
string objPoolName = go.name.Replace ("(Clone)", "");
Debug.Log("name: " + objPoolName);
//判断这个池子里是否有存在
//如果该类型的对象池存在
if (pool.ContainsKey (objPoolName))
{
//将对象保存到对象池
pool [objPoolName].Add (go);
}
//否则该类型的对象池不存在
else
{
//创建对象池,并保存对象到对象池
pool.Add(objPoolName,new List<GameObject>(){go});
}
}
}