//清空对象池 public void ClearCache() { List <uint> tempList = new List <uint>(); foreach (uint key in m_gameObjectItemPoolDict.Keys) { List <GameObjectItem> list = m_gameObjectItemPoolDict[key]; for (int i = list.Count - 1; i >= 0; --i) { GameObjectItem item = list[i]; if (System.Object.ReferenceEquals(item.Obj, null) && item.Clear) { list.Remove(item); GameObject.Destroy(item.Obj); m_gameObjectItemDict.Remove(item.Obj.GetInstanceID()); item.Reset(); m_gameObjectItemClassPool.Recycle(item); } } if (list.Count <= 0) { tempList.Add(key); } } for (int i = 0; i < tempList.Count; i++) { uint temp = tempList[i]; if (m_gameObjectItemPoolDict.ContainsKey(temp)) { m_gameObjectItemPoolDict.Remove(temp); } } tempList.Clear(); tempList = null; }
//清除某个资源在对象池中的所有对象 public void ClearPoolObject(uint crc) { List <GameObjectItem> st = null; if (m_gameObjectItemPoolDict.TryGetValue(crc, out st) == false || st == null) { return; } for (int i = st.Count - 1; i >= 0; --i) { GameObjectItem item = st[i]; if (item.Clear) { st.Remove(item); int tempId = item.Obj.GetInstanceID(); GameObject.Destroy(item.Obj); item.Reset(); m_gameObjectItemDict.Remove(tempId); m_gameObjectItemClassPool.Recycle(item); } } if (st.Count <= 0) { m_gameObjectItemPoolDict.Remove(crc); } }
//取消某个GameObject的异步加载 public void CancelAsyncLoad(long guid) { GameObjectItem item = null; if (m_asyncGameObjectItemDict.TryGetValue(guid, out item) && item != null && ResourceMgr.Instance.CancelAsyncLoad(item)) { m_asyncGameObjectItemDict.Remove(guid); item.Reset(); m_gameObjectItemClassPool.Recycle(item); } }
//卸载资源 public void ReleaseGameObjectItem(GameObject obj, int maxCacheCount = -1, bool destoryCache = false, bool recycleParent = true) { if (obj == null) { return; } GameObjectItem gameObjectItem = null; int tempGuid = obj.GetInstanceID(); if (!m_gameObjectItemDict.TryGetValue(tempGuid, out gameObjectItem) || gameObjectItem == null) { Debug.Log(obj.name + "并非对象池技术创建,不能回收到对象池!"); return; } if (gameObjectItem.AlreadyRelease) { Debug.LogError(obj.name + "该对象已经放回对象池, 检查是否清空该对象的引用!"); return; } #if UNITY_EDITOR obj.name += "(Recycle)"; #endif if (maxCacheCount == 0) //表示不缓存 { m_gameObjectItemDict.Remove(tempGuid); GameObject.Destroy(gameObjectItem.Obj); ResourceMgr.Instance.UnLoadGameObjectItem(gameObjectItem, destoryCache); gameObjectItem.Reset(); m_gameObjectItemClassPool.Recycle(gameObjectItem); } else { //回收到对象池 List <GameObjectItem> list = null; if (!m_gameObjectItemPoolDict.TryGetValue(gameObjectItem.Crc, out list) || list == null) { list = new List <GameObjectItem>(); m_gameObjectItemPoolDict.Add(gameObjectItem.Crc, list); } if (gameObjectItem.Obj) { if (recycleParent) { gameObjectItem.Obj.transform.SetParent(m_goPool); } else { gameObjectItem.Obj.SetActive(false); } } if (maxCacheCount < 0 || list.Count < maxCacheCount) //<0表示可以无限缓存, <maxCacheCount表示需要放入缓存 { list.Add(gameObjectItem); gameObjectItem.AlreadyRelease = true; ResourceMgr.Instance.DecrementResourceRef(gameObjectItem, 1); } else //不需要缓存GameObject到对象池 { m_gameObjectItemDict.Remove(tempGuid); GameObject.Destroy(gameObjectItem.Obj); ResourceMgr.Instance.UnLoadGameObjectItem(gameObjectItem); gameObjectItem.Reset(); m_gameObjectItemClassPool.Recycle(gameObjectItem); } } }