/// <summary> /// 供ObjectManager使用 /// </summary> /// <param name="objectItem"></param> /// <param name="isDestroyCache"></param> /// <returns></returns> public bool ReleaseObjectResource(ObjectItem objectItem, bool isDestroyCache = false) { if (objectItem == null) { return(false); } Object.Destroy(objectItem.CloneObj); objectItem.PrimitiveAssetItem.RefCount--; if (isDestroyCache) { DestroyAsset(objectItem.PrimitiveAssetItem, isDestroyCache); } return(true); }
public int DecreaseResourceRef(ObjectItem objectItem, int refCount = 1) { return(objectItem == null?DecreaseResourceRef(objectItem.Crc, refCount) : 0); }
/// <summary> /// 缓存数不包括预加载的 /// </summary> /// <param name="obj"></param> /// <param name="maxCacheCount"></param> /// <param name="isDestroyPrimitiveCache"></param> /// <param name="recyleParent"></param> public void ReleaseObject(GameObject obj, int maxCacheCount = -1, bool isDestroyPrimitiveCache = false, bool recyleParent = true) { if (obj == null) { return; } ObjectItem objectItem = null; int guid = obj.GetInstanceID(); if (!ObjectItemsInstanceTempDic.TryGetValue(guid, out objectItem)) { Debug.LogError(obj.name + "创建与回收的id不一致或对象非框架加载"); return; } if (objectItem.isAlreadyRelease) { Debug.LogError(obj.name + "该对象已放入对象池"); return; } #if UNITY_EDITOR obj.name += "(Recycle)"; #endif if (maxCacheCount == 0) { ObjectItemsInstanceTempDic.Remove(guid); ResourceManager.Instance.ReleaseObjectResource(objectItem, isDestroyPrimitiveCache); objectItem.Reset(); objectItemNativePool.Recycle(objectItem); } else //回收到对象池 { if (!objectItemsInstancePoolDic.TryGetValue(objectItem.Crc, out List <ObjectItem> objectItems)) { objectItems = new List <ObjectItem>(); //TODO objectItemsInstancePoolDic.Add(objectItem.Crc, objectItems); } if (objectItem.CloneObj) { if (recyleParent) { objectItem.CloneObj.transform.SetParent(RecylePoolTrans); } else { objectItem.CloneObj.SetActive(false); } } //无限缓存 if (maxCacheCount < 0 || objectItems.Count < maxCacheCount) { objectItems.Add(objectItem); objectItem.isAlreadyRelease = true; ResourceManager.Instance.DecreaseResourceRef(objectItem); } else { ObjectItemsInstanceTempDic.Remove(guid); ResourceManager.Instance.ReleaseObjectResource(objectItem, isDestroyPrimitiveCache); objectItem.Reset(); objectItemNativePool.Recycle(objectItem); } } }
public long AsyncInstantiateObject(string path, OnAsyncFinish outerCallBack, LoadResPriority priority, bool isSetSceneTrans = false, bool isClear = true, params object[] paramList) { if (string.IsNullOrEmpty(path)) { return(0); } uint crc = CRC32.GetCRC32(path); ObjectItem objectItem = GetCacheObjectItemFromPoolDic(crc); if (objectItem != null) { if (isSetSceneTrans) { objectItem.CloneObj.transform.SetParent(SceneTrans, false); } outerCallBack?.Invoke(path, objectItem.CloneObj, paramList); return(objectItem.Guid); } objectItem = objectItemNativePool.Spawn(); if (objectItem == null) { Debug.LogError("null"); } long guid = ResourceManager.Instance.CreateGuid(); objectItem.Crc = crc; objectItem.IsSetSceneParent = isSetSceneTrans; objectItem.isClear = isClear; objectItem.outerCallBack = outerCallBack; objectItem.paramList = paramList; //调用ResourceManager异步加载接口 ResourceManager.Instance.AsyncLoadResource(path, objectItem, (_path, item, plist) => { if (item == null) { return; } if (item.PrimitiveAssetItem.AssetObject == null) { #if UNITY_EDITOR Debug.LogError("异步资源加载为空" + _path); #endif } else { //实例化 item.CloneObj = Object.Instantiate(item.PrimitiveAssetItem.AssetObject) as GameObject; objectItem.OfflineData = item.CloneObj.GetComponent <OfflineData.OfflineData>(); } //加载完成移除 if (asyncLoadingObjectDic.ContainsKey(item.Guid)) { asyncLoadingObjectDic.Remove(item.Guid); } if (item.CloneObj != null && item.IsSetSceneParent) { item.CloneObj.transform.SetParent(SceneTrans); } if (item.outerCallBack != null) { if (item.CloneObj != null) { int _guid = item.CloneObj.GetInstanceID(); if (!ObjectItemsInstanceTempDic.ContainsKey(_guid)) { ObjectItemsInstanceTempDic.Add(_guid, item); } } item.outerCallBack?.Invoke(_path, item.CloneObj, plist); } }, priority); return(guid); }
/// <summary> /// 是否该脚本创建 /// </summary> /// <returns></returns> public bool IsFrameCreat(GameObject gameObject) { ObjectItem objectItem = ObjectItemsInstanceTempDic[gameObject.GetInstanceID()]; return(objectItem != null); }