Unity 对象池 生产 保存

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 }

 

posted @ 2016-01-19 23:00  1A7487  阅读(461)  评论(1编辑  收藏  举报