static private void BuildAllBundlesClick()
 {
     if (DevelopUtility.bundleSetting.pathList.Count > 0)
     {
         if (bundlesInfo == null)
         {
             bundlesInfo = new BundlesInfo();
         }
         else
         {
             bundlesInfo.bundleList.Clear();
         }
         for (int i = 0; i < DevelopUtility.bundleSetting.pathList.Count; i++)
         {
             if (DevelopUtility.bundleSetting.pathSelectList[i])
             {
                 string path = Application.dataPath + "/" + DevelopUtility.bundleSetting.pathList[i].Replace("Assets/", "");
                 GetBundleInfoAt(path);
             }
         }
         BuildAssetBundles();
         CreateCV();
         CreateBundlesInfo(Application.streamingAssetsPath + "/" + GameUtility.GetPlatformName() + "/" + DevelopUtility.clientConfig.hotfixFile);
     }
     else
     {
         Debug.LogError("没有选择任何可执行路径。");
     }
 }
        private void Start()
        {
            BundlesInfo bundleInfo = new BundlesInfo
            {
                { "Cube", new SmartPath()
                  {
                      LocalPath = "Bundles/cube_geometry_model", PrefabName = "Cube"
                  } },
                { "Sphere", new SmartPath()
                  {
                      LocalPath = "Bundles/sphere_geometry_model", PrefabName = "Sphere"
                  } },
                { "Capsule", new SmartPath()
                  {
                      LocalPath = "Bundles/capsule_geometry_model", PrefabName = "Capsule"
                  } }
            };

            string jsonStr = JsonConvert.SerializeObject(bundleInfo);

            byte[] jsonBytes = Encoding.UTF8.GetBytes(jsonStr);

            try
            {
                FileStream fs = new FileStream("geometry_models.json", FileMode.Create);
                fs.Write(jsonBytes, 0, jsonBytes.Length);
            }
            catch (Exception e)
            {
                Debug.LogError(e.Message);
            }
        }
        private static BundlerManifest GenerateBundlerManifest(ref BundlesInfo bundlesInfo)
        {
            var manifest = new BundlerManifest();

            foreach (var kv in bundlesInfo)
            {
                var bundleName   = kv.Key;
                var assets       = kv.Value.assets;
                var dependencies = kv.Value.dependencies;

                // No assets in this bundle, skips.
                if (assets.Count <= 0)
                {
                    continue;
                }

                // Generate assets data
                foreach (var asset in assets)
                {
                    if (manifest.assets.ContainsKey(asset))
                    {
                        throw new BundleException(string.Format(
                                                      "Asset duplicated: {0}, already reference in bundle: {1}, conflict with: {2}",
                                                      asset, manifest.assets[asset].bundle, bundleName));
                    }

                    var assetData = new AssetData
                    {
                        //name = asset, // Memory optimized
                        bundle = bundleName
                    };
                    manifest.assets.Add(asset, assetData);
                }

                // Generate bundles data
                if (manifest.bundles.ContainsKey(bundleName))
                {
                    throw new BundleException(string.Format("Bundle duplicated: {0}", bundleName));
                }

                //manifest.bundles.Add(bundleName, new BundleData {name = bundleName}); // Memory optimized
                manifest.bundles.Add(bundleName, new BundleData {
                    assets = assets.ToList()
                });
                foreach (var depName in dependencies)
                {
                    manifest.bundles[bundleName].dependencies.Add(depName);
                }
            }

            foreach (var kv in manifest.bundles)
            {
                kv.Value.assets.Sort();
                kv.Value.dependencies.Sort();
            }
            return(manifest);
        }
Beispiel #4
0
 static public IEnumerator LoadBundlesInfo(Action <BundlesInfo> callback = null)
 {
     if (bundlesInfo == null)
     {
         yield return(LoadFromJson <BundlesInfo> (GameUtility.StreamingHotfixPathFull, "BundlesInfo", (config) => {
             bundlesInfo = config;
             if (callback != null)
             {
                 callback(bundlesInfo);
             }
         }));
     }
 }
        private static BundlesInfo GenerateBundlesInfo(ref DependenciesInfo depsInfo,
                                                       ref ReservedSharedBundleInfo reserved, ref DependencyCache cache)
        {
            var sharedBundles     = ParseSharedBundleInfo(ref depsInfo, ref reserved, ref cache);
            var noneSharedBundles = ParseNoneSharedBundleInfo(ref depsInfo, ref sharedBundles);

            var bundles = new BundlesInfo();

            sharedBundles.Concat(noneSharedBundles).ToList().ForEach(kv => {
                if (kv.Value.assets.Count > 0)
                {
                    bundles.Add(kv.Key, kv.Value);
                }
            });
            return(bundles);
        }
        private static void ResolveBundleDependencies(ref BundlesInfo bundlesInfo, ref DependencyCache cache)
        {
            var info      = bundlesInfo;
            var cacheData = cache;

            foreach (var kv in bundlesInfo)
            {
                //Debug.Log(string.Format("Resolving bundle dependency: {0}", kv.Key));

                var bundleInfo = kv.Value;
                bundleInfo.dependencies.Clear();

                void ResolveAssetDependency(string asset)
                {
                    var dependencies = CollectDependencies(asset, ref cacheData);

                    foreach (var dependencyAsset in dependencies)
                    {
                        // Which bundle contains this asset?
                        var depBundle = info.FirstOrDefault(
                            v => v.Value.assets.Contains(dependencyAsset)).Key;

                        if (string.IsNullOrEmpty(depBundle))
                        {
                            continue;
                        }

                        if (depBundle == kv.Key)
                        {
                            continue;
                        }

                        if (bundleInfo.dependencies.Contains(depBundle))
                        {
                            continue;
                        }
                        bundleInfo.dependencies.Add(depBundle);
                    }
                }

                foreach (var asset in bundleInfo.assets)
                {
                    ResolveAssetDependency(asset);
                }
            }
        }
Beispiel #7
0
    private List <string> CollectionRemoteDependence(AssetBundle rootRemoteBundle, Dictionary <string, BundlesInfo> _remoteDependce)
    {
        AssetBundleManifest rootRemoteManifest = rootRemoteBundle.LoadAsset <AssetBundleManifest>("AssetBundleManifest");

        string[]      allbundles = rootRemoteManifest.GetAllAssetBundles();
        List <string> bundlsList = new List <string>(allbundles);

        //Debug.Log("<color=orange>总bundle 数</color> :count of bundlsList::: " + bundlsList.Count);
        //Debug.Log(assetbundleName +" || "+ manifest.GetAssetBundleHash(assetbundleName));
        //bool iscached = Caching.IsVersionCached(GetPath()+"/iOS/"+assetbundleName, manifest.GetAssetBundleHash(assetbundleName));
        //Debug.Log(GetPath() + "/iOS/" + assetbundleName + "<color=red>是否缓存过:</color>" + iscached);
        foreach (string remoteBundleName in bundlsList)
        {
            // 加载依赖
            Debug.Log("<color=white>bundle: " + remoteBundleName + "</color>");
            var dependenceBundles = rootRemoteManifest.GetAllDependencies(remoteBundleName);
            var subDependce       = new List <string>(); //每个bundle的子级依赖
                                                         //var objs = bundle.LoadAllAssets();
                                                         //处理依赖关系
            foreach (string dependbundle in dependenceBundles)
            {
                if (!bundlsList.Contains(dependbundle))
                {
                    // 加载bundle  ,其实并没有使用到
                    Debug.LogError("加载非依赖 <color=green>dependce bundle: " + dependbundle + "</color>");
                }
                else
                {
                    Debug.Log("<color=yellow>加载子级依赖</color> <color=red> dependce bundle: " + dependbundle + "</color>");
                    subDependce.Add(dependbundle);
                }
            }
            Hash128     remoteHashcode   = rootRemoteManifest.GetAssetBundleHash(remoteBundleName);
            BundlesInfo remoteBundleInfo = new BundlesInfo
            {
                bundlesNames = subDependce,
                hashCode     = remoteHashcode,
            };
            _remoteDependce.Add(remoteBundleName, remoteBundleInfo);
        }
        return(bundlsList);
    }
        private static BundlesInfo ParseNoneSharedBundleInfo(ref DependenciesInfo depsInfo, ref BundlesInfo sharedBundles)
        {
            // Parse none shared bundle info
            var noneSharedBundles = new BundlesInfo();

            foreach (var kv in depsInfo)
            {
                var assetName = kv.Key;
                var bundles   = kv.Value.referenceInBundles;

                var sharedBundle = sharedBundles.FirstOrDefault(skv => skv.Value.assets.Contains(assetName)).Key ?? "";

                foreach (var bundle in bundles)
                {
                    if (!string.IsNullOrEmpty(sharedBundles.FirstOrDefault(skv => skv.Key == bundle).Key))
                    {
                        continue; // Equals to shared bundle, pass.
                    }
                    if (!noneSharedBundles.ContainsKey(bundle))
                    {
                        noneSharedBundles.Add(bundle, new BundleInfo());
                    }

                    if (string.IsNullOrEmpty(sharedBundle))
                    {
                        noneSharedBundles[bundle].assets.Add(assetName);
                    }
                }
            }

            // Move *.unity files to independent bundles, because 'Cannot mark assets and scenes in one AssetBundle'
            var sceneBundles = new BundlesInfo();

            foreach (var kv in noneSharedBundles)
            {
                var noneSharedAssets = kv.Value.assets;
                var removed          = new List <string>();
                foreach (var asset in noneSharedAssets)
                {
                    if (!asset.EndsWith(".unity"))
                    {
                        continue;
                    }

                    var sceneBundleName = string.Format(BundlerBuildSettings.kSceneBundleFormatter,
                                                        PathUtility.RelativeProjectPathToAbsolutePath(asset));
                    sceneBundleName = PathUtility.NormalizeAssetBundlePath(sceneBundleName);

                    if (sceneBundles.ContainsKey(sceneBundleName))
                    {
                        throw new BundleException("Scene asset bundle duplicated: " + sceneBundleName);
                    }

                    var bundle = new BundleInfo();
                    bundle.assets.Add(asset);

                    sceneBundles.Add(sceneBundleName, bundle);

                    removed.Add(asset);
                }

                removed.ForEach(v => noneSharedAssets.Remove(v));
            }

            // Merge to none shared bundles
            foreach (var kv in sceneBundles)
            {
                noneSharedBundles.Add(kv.Key, kv.Value);
            }

            return(noneSharedBundles);
        }
        private static BundlesInfo ParseSharedBundleInfo(ref DependenciesInfo depsInfo,
                                                         ref ReservedSharedBundleInfo reserved, ref DependencyCache cache)
        {
            var sharedDict = new Dictionary <string, string>();

            var index = 0;

            // Determine shared bundles
            foreach (var kv in depsInfo)
            {
                var asset = kv.Key;

                // Ignore this asset when forced build in shared bundle.
                if (reserved.ContainsKey(asset))
                {
                    continue;
                }

                var depSet = kv.Value;

                // The count of dependencies no greater than 1 means that there are no other bundles
                // sharing this asset
                if (depSet.referenceInBundles.Count <= 1)
                {
                    continue;
                }

                // Otherwise, assets which depended by the same bundles will be separated to shared bundle.
                if (!sharedDict.ContainsKey(asset))
                {
                    sharedDict[asset] = string.Format(BundlerBuildSettings.kSharedBundleFormatter,
                                                      (++index).ToString());

                    // Sub-assets dependencies.
                    var deps = CollectDependencies(asset, ref cache);
                    foreach (var dep in deps)
                    {
                        if (reserved.ContainsKey(dep))
                        {
                            continue;
                        }
                        sharedDict[dep] = string.Format(BundlerBuildSettings.kSharedBundleFormatter,
                                                        (++index).ToString());
                    }
                }
            }

            // Collect shared bundles info
            var bundlesInfo = new BundlesInfo();

            foreach (var kv in sharedDict)
            {
                var name = sharedDict[kv.Key];
                if (bundlesInfo.ContainsKey(name))
                {
                    throw new BundleException("Shared bundle duplicated: " + name);
                }

                bundlesInfo[name] = new BundleInfo();
                bundlesInfo[name].assets.Add(kv.Key);
            }

            // Generate unique bundle name according to assets list.
            var sharedBundle = new BundlesInfo();

            foreach (var kv in bundlesInfo)
            {
                var assets = kv.Value.assets.ToList();
                assets.Sort((a, b) => string.Compare(a, b, StringComparison.Ordinal));

                var bundleName = string.Join("-", assets.ToArray());
                if (BundlerBuildSettings.kHashSharedBundle)
                {
                    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(bundleName)))
                    {
                        var nameHash = CalculateMd5(stream);
                        bundleName = string.Format(BundlerBuildSettings.kSharedBundleFormatter, nameHash);
                    }
                }
                else
                {
                    bundleName = string.Format(BundlerBuildSettings.kSharedBundleFormatter, bundleName.ToLower());
                }

                var bundleInfo = new BundleInfo();
                foreach (var asset in kv.Value.assets)
                {
                    bundleInfo.assets.Add(asset);
                }
                sharedBundle.Add(bundleName, bundleInfo);
            }

            // Add reserved shared bundles info
            foreach (var kv in reserved)
            {
                var assetName = kv.Key;
                var bundle    = kv.Value;
                if (!sharedBundle.ContainsKey(bundle))
                {
                    sharedBundle.Add(bundle, new BundleInfo());
                }
                sharedBundle[bundle].assets.Add(assetName);
            }

            return(sharedBundle);
        }
        private static void FilterRedundantDependencies(ref BundlesInfo bundlesInfo)
        {
            // Filter out redundant dependencies.
            var bsInfo = bundlesInfo;

            foreach (var kv in bundlesInfo)
            {
                var bundleInfo = kv.Value;

                bool IsDependencyInBundle(string bundleName, BundleInfo bInfo)
                {
                    foreach (var dependency in bInfo.dependencies)
                    {
                        if (dependency == bundleName)
                        {
                            return(true);
                        }

                        if (!bsInfo.ContainsKey(dependency))
                        {
                            continue;
                        }

                        if (IsDependencyInBundle(bundleName, bsInfo[dependency]))
                        {
                            return(true);
                        }
                    }
                    return(false);
                }

                bool IsReferenceInDependencies(string toCheck, BundleInfo bInfo)
                {
                    //Debug.Log(string.Format("Checking dependency: {0}", toCheck));
                    foreach (var dependency in bInfo.dependencies)
                    {
                        if (dependency == toCheck)
                        {
                            continue;
                        }

                        if (!bsInfo.ContainsKey(dependency))
                        {
                            continue;
                        }

                        if (IsDependencyInBundle(toCheck, bsInfo[dependency]))
                        {
                            return(true);
                        }
                    }
                    return(false);
                }

                //Debug.Log(string.Format("Checking redundant dependency: {0}", kv.Key));

                var toRemove = new List <string>();
                foreach (var dependency in bundleInfo.dependencies)
                {
                    if (IsReferenceInDependencies(dependency, bundleInfo))
                    {
                        toRemove.Add(dependency);
                    }
                }
                toRemove.ForEach(v => {
                    //Debug.Log(string.Format("Dependency redundant, removed: {0}, in bundle: {1}", v, kv.Key));
                    bundleInfo.dependencies.Remove(v);
                });
            }
        }