/// <summary> /// 清空对象池对该路径下的所有物体引用(用于ResourceManager释放资源的接口) /// </summary> public void ClearPoolObject(uint crc) { List <ResourceObject> resObjList = null; if (!m_ObjectResPoolDict.TryGetValue(crc, out resObjList) || resObjList == null) { return; } for (int i = resObjList.Count - 1; i >= 0; i--) { ResourceObject resObj = resObjList[i]; if (resObj.m_IsClear && resObj.m_GameObj != null) { int guid = resObj.m_GameObj.GetInstanceID(); GameObject.Destroy(resObj.m_GameObj); m_ResObjectDict.Remove(guid); resObj.Reset(); m_ResObjPool.UnSpawn(resObj); resObjList.RemoveAt(i); } } if (resObjList.Count <= 0) { m_ObjectResPoolDict.Remove(crc); } }
/// <summary> /// 清除对象池缓存 /// </summary> public void ClearCache() { List <uint> needClearCrcList = new List <uint>(); foreach (uint crc in m_ObjectResPoolDict.Keys) { List <ResourceObject> tempList = m_ObjectResPoolDict[crc]; for (int i = tempList.Count - 1; i >= 0; i--) { ResourceObject tempObj = tempList[i]; if (!System.Object.ReferenceEquals(tempObj.m_GameObj, null) && tempObj.m_IsClear) { tempList.RemoveAt(i); m_ResObjectDict.Remove(tempObj.m_GameObj.GetInstanceID()); tempObj.Reset(); m_ResObjPool.UnSpawn(tempObj); } } if (tempList.Count <= 0) { needClearCrcList.Add(crc); } } for (int i = 0; i < needClearCrcList.Count; i++) { uint crc = needClearCrcList[i]; if (m_ObjectResPoolDict.ContainsKey(crc)) { m_ObjectResPoolDict.Remove(crc); } } needClearCrcList.Clear(); }
/// <summary> /// 按GUID取消异步资源加载 /// </summary> /// <param name="guid"></param> public void CalcelAsyncLoad(int guid) { ResourceObject resObj = null; if (m_AsyncResObjectDict.TryGetValue(guid, out resObj) && ResourceManager.Instance.CancelAsyncLoad(resObj)) { m_AsyncResObjectDict.Remove(guid); resObj.Reset(); m_ResObjPool.UnSpawn(resObj); } }
public static void Release(ref ResourceObject resobj) { if (resobj.willReleaseObjs != null && ResourceCache.CanUseCustomUnloder()) { for (int i = 0; i < resobj.willReleaseObjs.Length; i++) { Object.DestroyImmediate(resobj.willReleaseObjs[i], true); resobj.willReleaseObjs[i] = null; } } resobj.Reset(); rymTPool <ResourceObject> .Release(ref resobj); }
/// <summary> /// 释放资源 /// </summary> /// <param name="obj">游戏物体</param> /// <param name="maxCacheCount">最大缓存数,小于0:不限制,等于0:清除该类型资源</param> /// <param name="isDestoryCache">是否清除缓存</param> /// <param name="recycleParent">是否回收资源</param> public void ReleaseObject(GameObject obj, int maxCacheCount = -1, bool isDestoryCache = false, bool recycleParent = true) { if (obj == null) { return; } int GUID = obj.GetInstanceID(); ResourceObject resObj = null; if (!m_ResObjectDict.TryGetValue(GUID, out resObj)) { Debug.LogWarning(obj.name + "对象不是ObjectManager创建的!"); return; } if (resObj == null) { Debug.LogError("缓存的ResourceObject为空!"); } if (resObj.m_Already) { Debug.LogError("已经释放过该资源!" + obj.name); } #if UNITY_EDITOR obj.name += "(recycle)"; #endif List <ResourceObject> resObjList = null; if (maxCacheCount == 0) //回收资源 { m_ResObjectDict.Remove(GUID); ResourceManager.Instance.ReleaseResource(resObj, isDestoryCache); resObj.Reset(); m_ResObjPool.UnSpawn(resObj); } else //回收进对象池 { if (!m_ObjectResPoolDict.TryGetValue(resObj.m_Crc, out resObjList) || resObjList == null) { resObjList = new List <ResourceObject>(); m_ObjectResPoolDict.Add(resObj.m_Crc, resObjList); } if (resObj.m_GameObj) { if (recycleParent) { resObj.m_GameObj.transform.SetParent(m_UnSpawnParentNode); } else { resObj.m_GameObj.SetActive(false); } } if (maxCacheCount < 0 || resObjList.Count < maxCacheCount) { resObjList.Add(resObj); resObj.m_Already = true; ResourceManager.Instance.DecreaseRef(resObj.m_Crc); } else { //回收 m_ResObjectDict.Remove(GUID); ResourceManager.Instance.ReleaseResource(resObj, isDestoryCache); resObj.Reset(); m_ResObjPool.UnSpawn(resObj); } } }