1.Unity对象池使用
对象池适用于场景中需要大量重复构造实例的时候
最直接的比如 发射的炮弹
思路构造出一个存储对象的池子 来存入或者取出池子中的对象 用的时候取出来 不用的时候放回去
此处池子中的对象就是炮弹
核心代码分析
利用一个字典结构来充当这个池子 ArrayList相当于池子中的每个小房间 Key相当于房间的名字 表示房间里边是什么东西 每个小房间用来存储的同一类的东西
private static Dictionary<string, ArrayList> pool = new Dictionary<string, ArrayList>();
按照正常思路思考 先要从对象池中取出一个炮弹,如果有炮弹 则取出 如果没有则实例化一个炮弹出来
public Object Get(string prefabName,Vector3 positon,Quaternion rotation)
{
string key = prefabName + "(Clone)";
Object o;
//判断这个池子是否已经有这个键(存储炮弹的房间) 并且房间里边有炮弹
if (pool.ContainsKey(key) && pool[key].Count > )
{
ArrayList list = pool[key];
o = list[] as Object;
list.RemoveAt();
//重新初始化相关状态 开始干活
(o as GameObject).SetActive(true);
(o as GameObject).transform.position=positon;
(o as GameObject).transform.rotation=rotation;
}
//没有存储炮弹的房间 实例化出一个新的炮弹
else
{
o = Instantiate(Resources.Load(prefabName), positon, rotation);
}
DelayDestory dd = (o as GameObject).GetComponent<DelayDestory>();
dd.Init();//开启携程 两秒后销毁 回到房间
return o;
}
//放进去炮弹 (什么时机放进去呢 不用的时候就放进去就是你要销毁的时候)
public Object Return(GameObject o)
{
string key = o.name;
print("return:"+key);
//判断这个池子是否已经有这个键(存储炮弹的房间名字)
if (pool.ContainsKey(key))
{
//已经有炮弹房间
ArrayList list = pool[key];
//添加一个新的
list.Add(o);
}
else
{
//如果不存在炮弹房间 先开房 开房当然有第一个客人 o
pool[key] = new ArrayList() { o };
}
//回房间休息状态
o.SetActive(false);
return o;
}
//对象的延迟销毁脚本
public class DelayDestory : MonoBehaviour {
// Use this for initialization
void Start () {
//Destroy(this.gameObject,2f);
}
public void Init()
{
StartCoroutine(ReturnToPool());
}
IEnumerator ReturnToPool()
{
yield return new WaitForSeconds(f);
ObjectPool.insatance.Return(this.gameObject);
}
}
完整Unity工程:链接: https://pan.baidu.com/s/1pLBSl7P 密码: ttjc