예제 #1
0
        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);
        }
예제 #2
0
        public static void GenerateAssetBundles(BundlerManifest manifest, BuildTarget platform, string outputPath)
        {
            var builds = GenerateAssetBundleBuilds(manifest);

            Debug.Log(string.Format("Generate asset bundles to path: {0}, build count: {1}", outputPath, builds.Length));
            var assetBundleManifest = BuildPipeline.BuildAssetBundles(outputPath, builds, BundlerBuildSettings.kAssetBundleBuildOptions, platform);

            if (null == assetBundleManifest)
            {
                throw new BundleBuildFailedException(
                          "Asset bundle build failed with errors, see the console output to get more information.");
            }
        }
예제 #3
0
        private static void SaveManifest(ref BundlerManifest manifest, string outputPath)
        {
            var directory = Path.GetDirectoryName(outputPath);

            if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
            {
                Directory.CreateDirectory(directory);
            }

            var jsonData = JsonUtility.ToJson(manifest);

            File.WriteAllText(outputPath, jsonData);
        }
예제 #4
0
        public static void StripUnmanagedFiles(BundlerBuildRule buildRule, BundlerManifest manifest)
        {
            var managedFiles = GetManagedFilesByRules(buildRule);
            var toRemoved    = new List <string>();

            foreach (var kv in manifest.assets)
            {
                if (!managedFiles.Contains(kv.Key))
                {
                    toRemoved.Add(kv.Key);
                }
            }
            toRemoved.ForEach(v => manifest.assets.Remove(v));
            Debug.Log(string.Format("{0} unmanaged files removed from manifest.", toRemoved.Count));
        }
예제 #5
0
        private static AssetBundleBuild[] GenerateAssetBundleBuilds(BundlerManifest manifest)
        {
            var bundles = new Dictionary <string, HashSet <string> >();

            foreach (var kv in manifest.assets)
            {
                if (!bundles.ContainsKey(kv.Value.bundle))
                {
                    bundles.Add(kv.Value.bundle, new HashSet <string>());
                }

                // Editor only objects cannot be included in AssetBundles
                if (kv.Key.EndsWith("LightingData.asset"))
                {
                    continue;
                }

                if (!IsAssetBundleResources(kv.Key))
                {
                    continue;
                }
                bundles[kv.Value.bundle].Add(kv.Key);
            }

            var builds = new List <AssetBundleBuild>();

            foreach (var kv in bundles)
            {
                if (kv.Value.Count <= 0)
                {
                    continue;
                }

                var build = new AssetBundleBuild
                {
                    assetBundleName = kv.Key,
                    assetNames      = kv.Value.ToArray()
                };
                builds.Add(build);
            }

            return(builds.ToArray());
        }
예제 #6
0
        /// <summary>
        ///     Re-generate target asset bundle. Dependencies WON'T be re-generated.
        /// </summary>
        /// <param name="manifest"></param>
        /// <param name="path"></param>
        /// <param name="platform"></param>
        /// <param name="outputPath"></param>
        public static void RegenerateAssetBundle(BundlerManifest manifest, string path, BuildTarget platform,
                                                 string outputPath)
        {
            var bundleName = PathUtility.NormalizeAssetBundlePath(path);

            var assets = manifest.assets.Where(v => v.Value.bundle == bundleName);

            var build = new AssetBundleBuild
            {
                assetNames      = assets.Select(v => v.Key).ToArray(),
                assetBundleName = bundleName
            };
            var assetBundleManifest = BuildPipeline.BuildAssetBundles(outputPath, new[] { build }, BundlerBuildSettings.kAssetBundleBuildOptions, platform);

            if (null == assetBundleManifest)
            {
                throw new BundleBuildFailedException(
                          "Asset bundle build failed with errors, see the console output to get more information.");
            }
        }
예제 #7
0
 internal ModeBase(BundlerManifest manifest, List <string> searchPaths, BundlerContext context)
 {
     _manifest    = manifest;
     _searchPaths = searchPaths;
     _context     = context;
 }
예제 #8
0
            = new Dictionary <ILoadRequestAsync, Dictionary <Type, IAssetAsync> >(); // Load request <=> Asset typed dict.

        internal BundleMode(BundlerManifest manifest, List <string> searchPaths, BundlerContext context)
            : base(manifest, searchPaths, context)
        {
        }
예제 #9
0
        /// <summary>
        /// Validate bundle dependencies
        /// </summary>
        /// <param name="manifest"></param>
        /// <param name="outputPath"></param>
        /// <exception cref="BundleException"></exception>
        public static void ValidateBundleDependencies(BundlerManifest manifest, string outputPath)
        {
            var abManifestPath         = string.Format("{0}/{1}", outputPath, new DirectoryInfo(outputPath).Name);
            var abManifestRelativePath = PathUtility.AbsolutePathToRelativeProjectPath(abManifestPath);
            var ab = AssetBundle.LoadFromFile(abManifestRelativePath);

            if (!ab)
            {
                throw new BundleException("Load asset bundle failed: " + abManifestPath);
            }

            var abManifest = ab.LoadAsset <AssetBundleManifest>("AssetBundleManifest");

            if (!abManifest)
            {
                ab.Unload(true);
                throw new BundleException("Load asset bundle manifest failed: " + abManifestPath);
            }

            void ValidateBundle(string assetBundle, List <string> validated)
            {
                if (validated.Contains(assetBundle))
                {
                    throw new BundleException("Circular dependency detected: " + assetBundle);
                }
                validated.Add(assetBundle);

                if (!manifest.bundles.ContainsKey(assetBundle))
                {
                    throw new BundleException("Bundle does not contain in manifest: " + assetBundle);
                }

                var dependencies = abManifest.GetDirectDependencies(assetBundle);

                foreach (var dependency in dependencies)
                {
                    if (!manifest.bundles[assetBundle].dependencies.Contains(dependency))
                    {
                        throw new BundleException(string.Format(
                                                      "Bundle dependencies lost, bundle name: {0}, dependency: {1}", assetBundle, dependency));
                    }
                    //Debug.Log("Validating dependency: " + dependency);
                    ValidateBundle(dependency, validated);
                }
                validated.Remove(assetBundle);
            }

            var index = 0f;
            var abs   = abManifest.GetAllAssetBundles();

            try {
                foreach (var assetBundle in abs)
                {
                    EditorUtility.DisplayProgressBar("Validating asset bundle", assetBundle, index++ / abs.Length);
                    //Debug.Log("Validating asset bundle: " + assetBundle);
                    ValidateBundle(assetBundle, new List <string>());
                }
            }
            finally {
                EditorUtility.ClearProgressBar();
                ab.Unload(true);
                AssetBundle.UnloadAllAssetBundles(true);
            }
        }