为了方便,事先写了两个脚本,itemPool和MessageCenter。都是很常用的,一个管理废弃gameObj的利用,一个管理massege的订阅发送。贴代码:
1 using UnityEngine; 2 using System.Collections.Generic; 3 4 //对象池 5 public class ItemPool{ 6 7 // 缓存对象池 8 public static Dictionary<string, ItemOfPool> m_itemList = new Dictionary<string, ItemOfPool>(); 9 10 // 添加一个对象组 11 public static void PushList(string name) 12 { 13 if (m_itemList != null) 14 Debug.Log("添加对象组"+ name); 15 m_itemList.Add(name, new ItemOfPool(name)); 16 } 17 18 // 添加单个对象(首先寻找对象组->添加单个对象) 19 public static void PushObject(string name, GameObject gameObject) 20 { 21 if (m_itemList != null) 22 { 23 if (!m_itemList.ContainsKey(name)) 24 PushList(name); 25 m_itemList[name].PushObject(gameObject); 26 } 27 } 28 29 // 移除单个对象,真正销毁 30 public static void RemoveObject(string name, GameObject gameObject) 31 { 32 if (m_itemList == null || !m_itemList.ContainsKey(name)) 33 return; 34 m_itemList[name].RemoveObject(gameObject); 35 } 36 37 // 取出池中的某个对象 38 public static GameObject GetObject(string name) 39 { 40 name = name +"(Clone)"; 41 if (m_itemList == null || !m_itemList.ContainsKey(name)) 42 { 43 Debug.Log(m_itemList == null); 44 Debug.Log(m_itemList.ContainsKey(name)); 45 return null; 46 } 47 return m_itemList[name].GetObject(); 48 } 49 50 // 销毁对象,没有真正销毁 51 public static void DestroyActiveObject(string name, GameObject gameObject) 52 { 53 if (m_itemList == null || !m_itemList.ContainsKey(name)) 54 { 55 PushList(name); 56 } 57 m_itemList[name].DestoryObject(gameObject); 58 } 59 60 // 销毁对象组,真正销毁 61 public static void Destroy() 62 { 63 if (m_itemList == null) 64 { 65 return; 66 } 67 foreach (ItemOfPool poolI in m_itemList.Values) 68 { 69 poolI.Destory(); 70 } 71 m_itemList = null; 72 } 73 } 74 75 76 //作为对象池的基本单位 被ItemPool引用 77 public class ItemOfPool 78 { 79 80 public string m_name; //标识名称 81 public List<GameObject> m_objectList;// 对象列表 82 83 //新建一种物品表 84 public ItemOfPool(string name) 85 { 86 this.m_name = name; 87 this.m_objectList = new List<GameObject>(); 88 } 89 90 //添加某对象到同一种物品表里 91 public void PushObject(GameObject gameObject) 92 { 93 if (!this.m_objectList.Contains(gameObject)) 94 { 95 this.m_objectList.Add(gameObject); 96 Debug.Log("将一个对象" + gameObject.name + "加入池中, 此类共有" + m_objectList.Count); 97 } 98 else 99 { 100 Debug.LogError("此物品已存在池中"); 101 } 102 } 103 104 // 销毁对象,没有真正销毁 105 public void DestoryObject(GameObject gameObject) 106 { 107 PushObject(gameObject); 108 gameObject.SetActive(false); 109 //gameObject.transform.position = Vector3.zero; 110 } 111 112 // 取出池中本类的第一个对象 113 public GameObject GetObject() 114 { 115 if (this.m_objectList == null || this.m_objectList.Count == 0) 116 { 117 return null; 118 } 119 GameObject obj = m_objectList[0]; 120 m_objectList.RemoveAt(0); 121 obj.SetActive(true); 122 return obj; 123 } 124 125 // 移除并销毁单个对象,真正的销毁 126 public void RemoveObject(GameObject gameObject) 127 { 128 if (m_objectList.Contains(gameObject)) 129 { 130 m_objectList.Remove(gameObject); 131 GameObject.Destroy(gameObject); 132 } 133 } 134 135 // 销毁对象,把所有的同类对象全部删除,真正的销毁对象!! 136 public void Destory() 137 { 138 if (this.m_objectList == null || this.m_objectList.Count == 0) 139 return; 140 foreach (GameObject poolItem in this.m_objectList) 141 { 142 GameObject.Destroy(poolItem); 143 } 144 this.m_objectList = new List<GameObject>(); 145 } 146 }
还有messageCenter:
1 using System.Collections.Generic; 2 3 4 public class MessageCenter { 5 6 public delegate void MessageDelivery(KeyValues keyValues); 7 8 public static Dictionary<string, MessageDelivery> m_messageDic = new Dictionary<string, MessageDelivery>(); 9 10 //添加监听事件(和监听消息) 11 public static void AddMessageListener(string messageType, MessageDelivery handler) 12 { 13 if (!m_messageDic.ContainsKey(messageType)) 14 { 15 m_messageDic.Add(messageType, null); 16 } 17 m_messageDic[messageType] += handler; 18 } 19 20 //移除监听事件 21 public static void RemoveMessageListener(string messageType, MessageDelivery handler) 22 { 23 if (m_messageDic.ContainsKey(messageType)) 24 { 25 m_messageDic[messageType] -= handler; 26 } 27 } 28 29 //移除监听消息 30 public static void RemoveMessageType(string messageType) 31 { 32 if (m_messageDic.ContainsKey(messageType)) 33 { 34 m_messageDic.Remove(messageType); 35 } 36 } 37 38 //移除所有监听事件 39 public static void ClearAllMessageListener() 40 { 41 if(m_messageDic != null) 42 m_messageDic.Clear(); 43 } 44 45 //发送消息 46 public static void SendMessage(string messageType, KeyValues keyValues) 47 { 48 MessageDelivery delivery; 49 if (m_messageDic.TryGetValue(messageType, out delivery)) 50 { 51 if (delivery != null) 52 { 53 delivery(keyValues); 54 } 55 } 56 } 57 } 58 59 public class KeyValues { 60 private string _key; 61 private object _values; 62 63 public string Key 64 { 65 get {return _key;} 66 } 67 68 public object Values 69 { 70 get {return _values;} 71 } 72 73 public KeyValues(string key, object values) 74 { 75 _key = key; 76 _values = values; 77 } 78 public void UpdateKeyValues(string key,object values) { 79 _key = key; 80 _values = values; 81 } 82 }
这里我的key是string, value是object 可能会改 看情况吧。