Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
                }
            }
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
 //static AssetBundleItem()
 //{
 //    Z.Pool.RegisterClassCustomPool<AssetBundleItem>(() => new AssetBundleItem(), Clean, 100);
 //}
 internal static void Clean(AssetBundleItem item)
 {
     item.AssetBundle = null;
     item.RefCount    = 0;
 }