private static bool CheckBundleCachedExistRecursively(Bundle bundle)
        {
            if (bundle == null)
                return false;

            if (!instance.mAssetCached.ContainsKey(bundle.assetName))
                return false;

            if (bundle.hasDependBundle)
            {
                foreach (var v in bundle.subBundles)
                {
                    if (!CheckBundleCachedExistRecursively(v))
                        return false;
                }
            }

            return true;
        }
        /// <summary>
        /// 递归匹配bundle父关系
        /// </summary>
        /// <param name="bundle"></param>
        /// <param name="isMatch">true:匹配父子关系,反之parent设为null</param>
        /// <param name="isCounter">true时计数实例计数器</param>
        /// <returns></returns>
        private static Bundle MatchingBundleParentRecursively(Bundle bundle, bool isMatch, bool isCounter)
        {
            if (bundle.hasDependBundle)
            {
                for (int i = 0; i < bundle.subBundles.Length; ++i)
                {
                    Bundle subBundle = MatchingBundleParentRecursively(bundle.subBundles[i], isMatch, isCounter);
                    subBundle.transform.parent = isMatch ? bundle.dependBundles[i].attachPoint : null;      // true时绑定,false时分开
                }
            }
            if (isCounter)
            {
                if (!instance.mAssetInstanceCounter.ContainsKey(bundle.assetName))
                    instance.mAssetInstanceCounter.Add(bundle.assetName, 0);

                ++instance.mAssetInstanceCounter[bundle.assetName];     // 数量加1
            }

            return bundle;
        }
        /// <summary>
        /// 实例化bundle
        /// </summary>
        /// <param name="bundle"></param>
        /// <returns></returns>
        private static Bundle InstantiateBundle(Bundle bundle)
        {
            MatchingBundleParentRecursively(bundle, true, true);        // 先匹配
            Bundle bundleIns = (Bundle)Object.Instantiate(bundle);
            MatchingBundleParentRecursively(bundle, false, false);        // 在拆分开

            return bundleIns;
        }
 /// <summary>
 /// 回收GameObject资源
 /// </summary>
 /// <param name="assetName"></param>
 /// <param name="assetInstance"></param>
 public static void RecycleGameObjectAsset(Bundle assetInstance)
 {
     if (!instance.mRecycleBundleCached.ContainsKey(assetInstance.assetName))
         instance.mRecycleBundleCached.Add(assetInstance.assetName, new Queue<Bundle>());
     var list = instance.mRecycleBundleCached[assetInstance.assetName];
     if (list.Contains(assetInstance))
     {
         Debug.LogWarning("--Toto-- AssetBundleLoadManager->RecycleGameObjectAsset: mRecycleBundleCached contains the " + assetInstance.name);
         return;
     }
     assetInstance.transform.parent = null;
     if (instance.mAssetCached.ContainsKey(assetInstance.assetName))
     {
         Bundle b = (Bundle)instance.mAssetCached[assetInstance.assetName];
         if (b != null)
         {
             assetInstance.transform.localScale = b.transform.localScale;
         }
     }
     assetInstance.gameObject.SetActive(false);
     list.Enqueue(assetInstance);
 }
 /// <summary>
 /// 不使用GameObject资源
 /// </summary>
 /// <param name="assetName"></param>
 /// <param name="assetInstance"></param>
 internal static void UnusedGameObjectAsset(string assetName, Bundle assetInstance)
 {
     // 更新计数、删除资源
     if (instance.mAssetInstanceCounter.ContainsKey(assetName))
     {
         --instance.mAssetInstanceCounter[assetName];
         if (instance.mAssetInstanceCounter[assetName] <= 0)
         {
             instance.mAssetInstanceCounter.Remove(assetName);
             if (instance.mAssetCached.ContainsKey(assetName))
             {
                 DestroyImmediate(((Bundle)(instance.mAssetCached[assetName])).gameObject, true);
                 instance.mAssetCached.Remove(assetName);
                 instance.mIsUnloadUnusedAssets = true;
             }
         }
     }
 }
Exemplo n.º 6
0
        /// <summary>
        /// 加载bundle回调
        /// </summary>
        /// <param name="assetName"></param>
        /// <param name="asset">bundle资源,非实例对象</param>
        protected void OnLoadBundle(string assetName, Bundle asset)
        {
            for (int i = 0; i < dependBundles.Length; ++i)
            {
                if (dependBundles[i].assetName == assetName)
                {
                    if (asset != null)
                    {
                        subBundles[i] = asset;
//                         asset.transform.parent = dependBundles[i].attachPoint;
//                         asset.transform.localPosition = Vector3.zero;
//                         if (dependBundles[i].identityLocalScale)
//                             asset.transform.localScale = Vector3.one;
//                         if (dependBundles[i].identityLocalRotation)
//                             asset.transform.localRotation = Quaternion.identity;
                        asset.CollectSubBundles(this.OnCollectSubBundle);
                    }

                    return;
                }
            }
        }