/// <summary> /// 清除某个资源在对象池中所有的对象 /// </summary> /// <param name="crc"></param> public void ClearPoolObject(uint crc) { List <ResourceObj> st = null; if (!m_ObjectPoolDic.TryGetValue(crc, out st) || st == null) { return; } for (int i = st.Count - 1; i >= 0; i--) { ResourceObj resObj = st[i]; if (resObj.m_bClear) { st.Remove(resObj); int tempID = resObj.m_CloneObj.GetInstanceID(); GameObject.Destroy(resObj.m_CloneObj); resObj.Reset(); m_ResObjDic.Remove(tempID); m_ResObjClassPool.Recycle(resObj); } } if (st.Count == 0) { m_ObjectPoolDic.Remove(crc); } }
/// <summary> /// 清空对象池 /// </summary> public void ClearCache() { List <uint> tempList = new List <uint>(); foreach (uint key in m_ObjectPoolDic.Keys) { List <ResourceObj> st = m_ObjectPoolDic[key]; for (int i = st.Count - 1; i >= 0; i--) { ResourceObj resObj = st[i]; if (!System.Object.ReferenceEquals(resObj.m_CloneObj, null) && resObj.m_bClear) { GameObject.Destroy(resObj.m_CloneObj); m_ResObjDic.Remove(resObj.m_CloneObj.GetInstanceID()); resObj.Reset(); m_ResObjClassPool.Recycle(resObj); st.Remove(resObj); } } if (st.Count <= 0) { tempList.Add(key); } } for (int i = 0; i < tempList.Count; i++) { if (m_ObjectPoolDic.ContainsKey(tempList[i])) { m_ObjectPoolDic.Remove(tempList[i]); } } tempList.Clear(); }
/// <summary> /// 取消异步加载 /// </summary> /// <param name="guid"></param> public void CancleLoad(long guid) { ResourceObj resObj = null; //根据GUID,找到正在异步加载的资源,并且该资源没有在加载中,回调列表数量是0 if (m_AsyncResObjs.TryGetValue(guid, out resObj) && ResourceManager.Instance.CancleLoad(resObj)) { m_AsyncResObjs.Remove(guid); resObj.Reset(); m_ResObjClassPool.Recycle(resObj); } }
/// <summary> /// 回收资源 /// </summary> /// <param name="obj"></param> /// <param name="maxCacheCount"></param> /// <param name="destoryCache"></param> /// <param name="recycleParent">是否放回回收节点</param> public void ReleaseObject(GameObject obj, int maxCacheCount = -1, bool destoryCache = false, bool recycleParent = true) { if (obj == null) { return; } ResourceObj resObj = null; int temID = obj.GetInstanceID(); if (!m_ResObjDic.TryGetValue(temID, out resObj)) { Debug.Log(obj.name + "对象不是ObjectManager创建的!"); return; } if (resObj == null) { Debug.LogError("缓存的ResourceObj为空"); } if (resObj.m_Already) { Debug.LogError("该对象已经放回对象池了,检查自己是否清空引用"); return; } #if UNITY_EDITOR obj.name += "(Recycle)"; #endif List <ResourceObj> st = null; //不缓存 if (maxCacheCount == 0) { m_ResObjDic.Remove(temID); ResourceManager.Instance.ReleaseResource(resObj, destoryCache); resObj.Reset(); m_ResObjClassPool.Recycle(resObj); } else { //回收到对象池 if (!m_ObjectPoolDic.TryGetValue(resObj.m_Crc, out st) || st == null) { st = new List <ResourceObj>(); m_ObjectPoolDic.Add(resObj.m_Crc, st); } if (resObj.m_CloneObj) { if (recycleParent) //放到资源回收池节点下 { resObj.m_CloneObj.transform.SetParent(RecyclePoolTrs); } else { resObj.m_CloneObj.SetActive(false); } } //不限制最大缓存数量,或者当前缓存数量小于最大缓存数量 if (maxCacheCount < 0 || st.Count < maxCacheCount) { st.Add(resObj); resObj.m_Already = true; //ResourceManager做一个引用计数 ResourceManager.Instance.DecreaseResourceRef(resObj); } else { m_ResObjDic.Remove(temID); ResourceManager.Instance.ReleaseResource(resObj, destoryCache); resObj.Reset(); m_ResObjClassPool.Recycle(resObj); } } }