public GameObject InstantiateObject(string path, bool isShowDefaultTrans = false, bool isClear = true) { uint crc = CRC32.GetCRC32(path); ObjectItem objectItem = GetCacheObjectItemFromPoolDic(crc); if (ReferenceEquals(objectItem, null)) { objectItem = objectItemNativePool.Spawn(); objectItem.Crc = crc; objectItem.isClear = isClear; objectItem = ResourceManager.Instance.LoadPrimitiveAssetItem(path, objectItem); var PrimitiveAssetObject = objectItem.PrimitiveAssetItem.AssetObject; if (PrimitiveAssetObject != null) { objectItem.CloneObj = GameObject.Instantiate(PrimitiveAssetObject) as GameObject; objectItem.OfflineData = objectItem.CloneObj.GetComponent <OfflineData.OfflineData>(); } } if (isShowDefaultTrans) { objectItem.CloneObj.transform.SetParent(SceneTrans, false); } int guid = objectItem.CloneObj.GetInstanceID(); if (ObjectItemsInstanceTempDic.ContainsKey(guid) == false) { ObjectItemsInstanceTempDic.Add(guid, objectItem); } return(objectItem.CloneObj); }
private AssetBundle LoadAssetBundle(string name) { AssetBundleItem item = null; uint crc = CRC32.GetCRC32(name); if (!AssetBundleItemDic.TryGetValue(crc, out item)) { AssetBundle assetBundle = null; string path = P.GetFullPath(Application.streamingAssetsPath, name); if (File.Exists(path)) { assetBundle = AssetBundle.LoadFromFile(path); } if (assetBundle == null) { Debug.LogError($"{MethodBase.GetCurrentMethod().Name} Error: {path} cant load"); } item = AssetBundleItemPool.Spawn(); item.AssetBundle = assetBundle; AssetBundleItemDic.Add(crc, item); } item.RefCount++; return(item.AssetBundle); }
//给ObjectManager的接口 public ObjectItem LoadPrimitiveAssetItem(string path, ObjectItem objectItem) { if (objectItem == null) { return(null); } uint crc = objectItem.Crc == 0 ? CRC32.GetCRC32(path) : objectItem.Crc; AssetItem assetItem = GetCacheAssetItem(crc); if (assetItem != null) { objectItem.PrimitiveAssetItem = assetItem; return(objectItem); } Object obj = null; #if UNITY_EDITOR if (!IsLoadFromAssetBundle) { assetItem = AssetBundleManager.Instance.FindAssetItem(crc); if (assetItem != null && assetItem.AssetObject != null) { obj = assetItem.AssetObject; } else { // if (assetItem == null) // { // assetItem=new AssetItem(); // } obj = LoadAssetByEditor <Object>(path); } } #endif if (obj == null) { assetItem = AssetBundleManager.Instance.LoadAssetItemBundle(crc); if (assetItem != null && assetItem.assetBundle != null) { if (assetItem.AssetObject != null) { obj = assetItem.AssetObject as Object; } else { obj = assetItem.assetBundle.LoadAsset <Object>(assetItem.assetName); } } } assetItem.IsClear = objectItem.isClear; CacheResource(path, ref assetItem, crc, obj); objectItem.PrimitiveAssetItem = assetItem; return(objectItem); }
public void PreLoadRes(string path) { if (string.IsNullOrEmpty(path)) { return; } uint crc = CRC32.GetCRC32(path); AssetItem item = GetCacheAssetItem(crc, 0); if (item != null) { // item.IsClear = false; return; } Object obj = null; #if UNITY_EDITOR if (!IsLoadFromAssetBundle) { item = AssetBundleManager.Instance.FindAssetItem(crc); if (item.AssetObject != null) { obj = item.AssetObject; } else { obj = LoadAssetByEditor <Object>(path); } } #endif if (obj == null) { item = AssetBundleManager.Instance.LoadAssetItemBundle(crc); if (item != null && item.assetBundle != null) { if (item.AssetObject != null) { obj = item.AssetObject; } else { obj = item.assetBundle.LoadAsset <Object>(item.assetName); } } } CacheResource(path, ref item, crc, obj); //跳场景 item.IsClear = false; ReleaseResource(path, false); }
public T LoadResource <T>(string path) where T : Object { if (string.IsNullOrEmpty(path)) { return(null); } uint crc = CRC32.GetCRC32(path); AssetItem item = GetCacheAssetItem(crc); if (item != null) { return(item.AssetObject as T); } T obj = null; #if UNITY_EDITOR if (!IsLoadFromAssetBundle) { item = AssetBundleManager.Instance.FindAssetItem(crc); if (item != null && item.AssetObject != null) { obj = item.AssetObject as T; } else { obj = LoadAssetByEditor <T>(path); } } #endif if (obj == null) { item = AssetBundleManager.Instance.LoadAssetItemBundle(crc); if (item != null && item.assetBundle != null) { if (item.AssetObject != null) { obj = item.AssetObject as T; } else { obj = item.assetBundle.LoadAsset <T>(item.assetName); } } } CacheResource(path, ref item, crc, obj); return(obj); }
private void UnLoadAssetBundle(string name) { uint crc = CRC32.GetCRC32(name); AssetBundleItem item; if (AssetBundleItemDic.TryGetValue(crc, out item) && item != null) { item.RefCount--; if (item.RefCount <= 0 && item.AssetBundle != null) { item.AssetBundle.Unload(true); item.Rest(); AssetBundleItemPool.Recycle(item); AssetBundleItemDic.Remove(crc); } } }
public bool ReleaseResource(string path, bool isDestroyCache = false) { if (string.IsNullOrEmpty(path)) { return(false); } uint crc = CRC32.GetCRC32(path); AssetItem item = null; if (!AssetDic.TryGetValue(crc, out item)) { Debug.LogError("AssetDic not exits " + path + ",可能进行了多次释放"); return(false); } item.RefCount--; DestroyAsset(item, isDestroyCache); return(true); }
public void AsyncLoadResource(string path, OnAsyncFinish cb, LoadResPriority priority, bool isSprite = false, uint crc = 0, params object[] paramList) { if (crc == 0) { crc = CRC32.GetCRC32(path); } AssetItem item = GetCacheAssetItem(crc); if (item != null) { cb?.Invoke(path, item.AssetObject, paramList); return; } AsyncLoadAssetParam asyncLoadAssetParam = null; if (!asyncLoadAssetParamDic.TryGetValue(crc, out asyncLoadAssetParam)) { asyncLoadAssetParam = asyncLoadResParamPackPool.Spawn(); asyncLoadAssetParam.Crc = crc; asyncLoadAssetParam.Path = path; asyncLoadAssetParam.isSprite = isSprite; asyncLoadAssetParam.Priority = priority; asyncLoadAssetParamDic.Add(crc, asyncLoadAssetParam); loadingAssetLists[(int)priority].Add(asyncLoadAssetParam); } AsyncCallBackPack callBackPack = asyncCallBackPackPool.Spawn(); callBackPack.AssetFinish = cb; callBackPack.paramList = paramList; asyncLoadAssetParam.CallBackPacks.Add(callBackPack); }
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); }