/// <summary> /// 加载单个assetbundle根据名字 /// </summary> /// <param name="name"></param> /// <returns></returns> private static AssetBundle _LoadAssetBundle(string name) { AssetBundleItem abItem = mAssetBundleItemDic.GetValue(name); if (abItem == null) { AssetBundle assetBundle = null; string fullPath = mABLoadPath + name; if (File.Exists(fullPath)) { assetBundle = AssetBundle.LoadFromFile(fullPath);// ---正式的加载 } if (assetBundle == null) { Debug.LogError("加载AB包失败:" + fullPath); return(null); } abItem = Z.Pool.Take <AssetBundleItem>(); abItem.AssetBundle = assetBundle; mAssetBundleItemDic.Add(name, abItem); } abItem.RefCount++; return(abItem.AssetBundle); }
/// <summary> /// 释放AB包 /// </summary> /// <param name="name">包名</param> private static void _ReleaseAssetBundle(string name) { AssetBundleItem abItem = mAssetBundleItemDic.GetValue(name); if (abItem != null) { //减少引用计数 abItem.RefCount--; if (abItem.RefCount <= 0) { if (abItem.AssetBundle == null)//不太可能发生... { Z.Debug.Warning("准备卸载AB包时,发现壳内的包引用为空"); } abItem.AssetBundle.Unload(true);//这个卸载Unity做的很智能 会把所有引用这个assetBundle的变量都置空,不知道怎么做的... Z.Pool.Return(ref abItem); mAssetBundleItemDic.Remove(name); } } }
private static IEnumerator _LoadAssetBundleAsync(string abName, ResourceItem resItem) { AssetBundleItem abItem = mAssetBundleItemDic.GetValue(abName); if (abItem == null) { AssetBundleCreateRequest abRequest = null; string fullPath = mABLoadPath + abName; if (File.Exists(fullPath)) { abRequest = AssetBundle.LoadFromFileAsync(fullPath); // ---正式的加载 } while (!abRequest.isDone) //等待加载完成 { yield return(null); } if (abRequest.assetBundle == null) { Debug.LogError("加载AB包失败:" + fullPath); } else { if (ReferenceEquals(abName, resItem.ABName)) { resItem.AssetBundle = abRequest.assetBundle; } abItem = Z.Pool.Take <AssetBundleItem>(); abItem.AssetBundle = abRequest.assetBundle; mAssetBundleItemDic.Add(abName, abItem); //协程是在主线程等待 因此这个操作并不需要加锁 ...又一次体现了协程的优越性 } } abItem.RefCount++; //发送加载完成事件 接收方过滤name即可 Z.Subject.Fire(Z.Pool.Take <ABLoadedSArgs>().Fill(resItem, abName)); }
//static AssetBundleItem() //{ // Z.Pool.RegisterClassCustomPool<AssetBundleItem>(() => new AssetBundleItem(), Clean, 100); //} internal static void Clean(AssetBundleItem item) { item.AssetBundle = null; item.RefCount = 0; }