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; } } } }
/// <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; } } }