这里介绍一种对象池的写法。它的优点在于无论取出还是插入游戏物体都是常数量时间。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
//对象池
public class GameObjectPool : MonoSingleton<GameObjectPool>
{ /// <summary>可能存放多个种类的对象,每个种类有多个对象 </summary>
private Dictionary<string, LinkedList<GameObject>> Pool = new Dictionary<string, LinkedList<GameObject>>();
private Dictionary<GameObject, LinkedListNode<GameObject>> ObjectDic = new Dictionary<GameObject, LinkedListNode<GameObject>>();
/// <summary>增加物体进入池(按类别增加)</summary>
public void Add(string key, GameObject go)
{
//1.如果key在容器中存在,则将go加入对应的列表
//2.如果key在容器中不存在,是先创建一个列表,再加入
if (!Pool.ContainsKey(key))
{
Pool.Add(key, new LinkedList<GameObject>());
}
LinkedListNode<GameObject> t = new LinkedListNode<GameObject>(go);
Pool[key].AddLast(t);
ObjectDic[go] = t; } /// <summary>销毁物体(将对象隐藏)</summary>
public void MyDestory(string key, GameObject destoryGo)
{
//设置destoryGo隐藏
ObjectDic[destoryGo].Value.SetActive(false);
LinkedListNode<GameObject> temp = ObjectDic[destoryGo];
Pool[key].Remove(temp);
Pool[key].AddFirst(temp);
} /// <summary>将对象归入池中<summary>
public void MyDestory(string key, GameObject tempGo, float delay)
{
//开启一个协程
StartCoroutine(DelayDestory(key, tempGo, delay));
} /// <summary>延迟销毁</summary>
private IEnumerator DelayDestory(string key, GameObject destoryGO, float delay)
{
//等待一个延迟的时间
yield return new WaitForSeconds(delay);
MyDestory(key, destoryGO);
} /// <summary>创建一个游戏物体到场景 </summary>
public GameObject CreateObject(string key, GameObject go, Vector3 position, Quaternion quaternion)
{
//先找是否有可用的,如果没有则创建,如果有找到后设置好位置,朝向再返回
GameObject tempGo = Pool[key].First.Value;
if (tempGo.activeSelf == false)
{
tempGo.transform.position = position;
tempGo.transform.rotation = quaternion;
tempGo.SetActive(true);
Pool[key].RemoveFirst();
Pool[key].AddLast(ObjectDic[tempGo]);
}
else
{
tempGo = GameObject.Instantiate(go, position, quaternion) as GameObject;
Add(key, tempGo);
}
return tempGo; } /// <summary>清空某类游戏对象</summary>
public void Clear(string key)
{
var t = Pool[key].First;
while (t.Next!=null)
{
ObjectDic.Remove(t.Value);
}
Pool.Remove(key); } /// <summary>清空池中所有游戏对象</summary>
public void ClearAll()
{
ObjectDic.Clear();
Pool.Clear();
}
}

  

  

05-11 11:08