Unity对象池主要是保存那些常用的物体,避免他们在不断销毁和创造中损坏性能。
主要思路为:创造物体时,判断是否存在,如果存在则调用并使其显示。如果不存在则创造一个新的。
当销毁时,调用协程延时隐藏物体。
1 1 // <summary> 2 2 /// 对象池 3 3 /// </summary> 4 4 public class GameObjectPool : MonoSingleton<GameObjectPool> 5 5 { 6 6 //内部容器,用于存入缓存的对象 7 7 private Dictionary<string, List<GameObject>> cache = new Dictionary<string, List<GameObject>>(); 8 8 9 9 /// <summary> 10 10 /// 生产物体 11 11 /// </summary> 12 12 public GameObject CreateObject(string key, GameObject go, Vector3 position, Quaternion quaternion) 13 13 { 14 14 //有:key对应列表中有没有可用(非活动状态)的物体 15 15 var tempGo = FindUsable(key); 16 16 if (tempGo != null) 17 17 { 18 18 //有:设置后返回可用物体 19 19 tempGo.transform.position = position; 20 20 tempGo.transform.rotation = quaternion; 21 21 tempGo.SetActive(true); 22 22 } 23 23 else 24 24 { 25 25 //没有:(场景中没有,内存中也没有)创建物体后添加cache, 26 26 tempGo = Instantiate(go, position, quaternion) as GameObject; 27 27 Add(key, tempGo); 28 28 } 29 29 return tempGo; 30 30 } 31 31 32 32 /// <summary> 33 33 /// 将对象放入缓存 34 34 /// </summary> 35 35 private void Add(string key, GameObject newObject) 36 36 { 37 37 //创建key,创建key的列表 38 38 if (!cache.ContainsKey(key)) 39 39 cache.Add(key, new List<GameObject>()); 40 40 cache[key].Add(newObject); 41 41 } 42 42 43 43 /// <summary> 44 44 /// 找对应key的列表中没有没可用的物体 45 45 /// </summary> 46 46 private GameObject FindUsable(string key) 47 47 { 48 48 //有Key: 找非活动状态的物体 49 49 if (cache.ContainsKey(key)) 50 50 { 51 51 return cache[key].Find(p => !p.activeSelf); 52 52 } 53 53 return null; 54 54 } 55 55 56 56 /// <summary> 57 57 /// 即时回收 58 58 /// </summary> 59 59 /// <param name="go">要回收的对象</param> 60 60 public void CollectObject(GameObject go) 61 61 { 62 62 go.SetActive(false); 63 63 } 64 64 65 65 /// <summary> 66 66 /// 延时回收 67 67 /// </summary> 68 68 /// <param name="go">要回收的对象</param> 69 69 /// <param name="delay">延时时长</param> 70 70 public void CollectObject(GameObject go,float delay) 71 71 { 72 72 //开启协程 73 73 StartCoroutine(Delay(go,delay)); 74 74 } 75 75 76 76 /// <summary> 77 77 /// 用于回收的协程方法 78 78 /// </summary> 79 79 public IEnumerator Delay(GameObject go,float delay) 80 80 { 81 81 //等待delay之后, 82 82 yield return new WaitForSeconds(delay); 83 83 //调用即时回收 84 84 CollectObject(go); 85 85 } 86 86 87 87 /// <summary> 88 88 /// 将key对象的缓存物体从池中清除(销毁) 89 89 /// </summary> 90 90 /// <param name="key"></param> 91 91 public void Clear(string key) 92 92 { 93 93 if(cache.ContainsKey(key)) 94 94 { 95 95 while (cache[key].Count > 0) 96 96 { 97 97 //销毁每个物体 98 98 Destroy(cache[key][0]); 99 99 //删除列表中的空引用 100 100 cache[key].RemoveAt(0); 101 101 } 102 102 //删除key 103 103 cache.Remove(key); 104 104 } 105 105 } 106 106 107 107 /// <summary> 108 108 /// 清空池中物体 109 109 /// </summary> 110 110 public void ClearAll() 111 111 { 112 112 113 113 //遍历所有的key 114 114 List<string> keys = new List<string>(cache.Keys); 115 115 //逐个清除 116 116 while (cache.Count > 0) 117 117 { 118 118 Clear(keys[0]); 119 119 keys.RemoveAt(0); 120 120 } 121 121 } 122 122 }
原文:http://www.cnblogs.com/redUnity/p/5143715.html