Пример #1
0
        static void GenerateAssetBundle()
        {
            int count = 0;
            Dictionary <BuildAssetBundleOptions, List <AssetBundleBuild> > buildAbbMap = new Dictionary <BuildAssetBundleOptions, List <AssetBundleBuild> >();

            for (int i = 0; i < buildInfoList.Count; i++)
            {
                BuildInfo buildInfo = buildInfoList[i];
                foreach (var subInfo in buildInfo.subBuildInfoMap.Values)
                {
                    for (int j = 0; j < subInfo.assetPaths.Count; j++)
                    {
                        if (subInfo.ignore)
                        {
                            continue;//增量更新被忽略掉
                        }
                        if (BuildType.Scene == buildInfo.buildType)
                        {
                            string path    = subInfo.assetPaths[j];
                            string dirName = Path.GetDirectoryName(path);
                            string name    = BMUtility.Path2Name(dirName + "/" + Path.GetFileNameWithoutExtension(path));
                            if (settings.useHashName)
                            {
                                name = subInfo.buildMd5;
                            }
                            string outputPath = string.Format("{0}/{1}.{2}", Output_Path, name, settings.Suffix_Bundle);
                            BuildPipeline.BuildPlayer(new string[] { path },
                                                      outputPath, buildTarget,
                                                      BuildOptions.BuildAdditionalStreamedScenes);
                            count += 1;
                        }
                        else
                        {
                            BuildAssetBundleOptions opt = BuildAssetBundleOptions.None;
                            switch (buildInfo.compressType)
                            {
                            case CompressType.LZ4:
                                opt |= BuildAssetBundleOptions.ChunkBasedCompression;
                                break;

                            case CompressType.None:
                                opt |= BuildAssetBundleOptions.UncompressedAssetBundle;
                                break;
                            }
                            switch (buildInfo.buildType)
                            {
                            case BuildType.Pack:
                            case BuildType.Single:
                            case BuildType.Shader:
                                opt |= BuildAssetBundleOptions.DeterministicAssetBundle;
                                break;

                            case BuildType.Lua:
                                opt |= BuildAssetBundleOptions.DeterministicAssetBundle;
                                break;
                            }

                            List <AssetBundleBuild> list;
                            if (!buildAbbMap.TryGetValue(opt, out list))
                            {
                                list = new List <AssetBundleBuild>();
                                buildAbbMap.Add(opt, list);
                            }
                            if (!list.Contains(subInfo.assetBundleBuild))
                            {
                                list.Add(subInfo.assetBundleBuild);
                            }
                        }
                    }
                }
            }
            foreach (var buildAbb in buildAbbMap)
            {
                count += buildAbb.Value.Count;
                BuildPipeline.BuildAssetBundles(Output_Path, buildAbb.Value.ToArray(), buildAbb.Key, buildTarget);
            }
            //清除临时的lua bundle 文件
            foreach (var path in tempLuaPaths)
            {
                if (File.Exists(path))
                {
                    File.Delete(path);
                }
            }

            AssetDatabase.Refresh();
        }
Пример #2
0
        static void CalcAssetBundleInfos()
        {
            for (int i = 0; i < buildInfoList.Count; i++)
            {
                BuildInfo buildInfo = buildInfoList[i];
                buildInfo.subBuildInfoMap = new Dictionary <string, SubBuildInfo>();
                for (int j = 0; j < buildInfo.assetPaths.Count; j++)
                {
                    string path    = buildInfo.assetPaths[j];
                    string dirName = Path.GetDirectoryName(path);
                    string name;
                    int    version = 0;
                    switch (buildInfo.buildType)
                    {
                    case BuildType.Pack:
                        name = BMUtility.Path2Name(dirName);
                        break;

                    case BuildType.Scene:
                        name = BMUtility.Path2Name(dirName + "/" + Path.GetFileNameWithoutExtension(path));
                        if (scenesVersionDict.TryGetValue(path, out string verStr))
                        {
                            version = int.Parse(verStr);
                        }
                        else
                        {    //新场景
                            version = 1;
                            scenesVersionDict.Add(path, version.ToString());
                            BMEditUtility.SaveDictionary(settings.scenesVersionFile, scenesVersionDict);
                        }
                        break;

                    case BuildType.Shader:
                        name = BMUtility.Path2Name(buildInfo.buildName);
                        break;

                    case BuildType.Lua:
                        name = BMUtility.Path2Name(buildInfo.buildName);
                        break;

                    default:    // BuildType.Single:
                        name = BMUtility.Path2Name(dirName + "/" + Path.GetFileName(path));
                        break;
                    }
                    string       md5     = BMUtility.EncryptWithMD5(name + "." + settings.Suffix_Bundle);
                    SubBuildInfo subInfo = null;
                    if (!buildInfo.subBuildInfoMap.TryGetValue(md5, out subInfo))
                    {
                        string abName = name;
                        if (settings.useHashName)
                        {
                            abName = md5;
                        }
                        subInfo = new SubBuildInfo()
                        {
                            bundleName       = name,
                            buildMd5         = md5,
                            buildType        = buildInfo.buildType,
                            version          = version,
                            assetBundleBuild = new AssetBundleBuild()
                            {
                                assetBundleName    = abName,
                                assetBundleVariant = settings.Suffix_Bundle,
                            },
                            assetPaths        = new List <string>(),
                            assetHashs        = new List <string>(),
                            dependenceMap     = new Dictionary <string, string[]>(),
                            dependenceHashMap = new Dictionary <string, string[]>(),
                        };
                        buildInfo.subBuildInfoMap.Add(md5, subInfo);
                    }
                    //添加依赖关系
                    AddDependence(path, subInfo.dependenceMap);
                    string hash = HashHelper.ComputeMD5(path);
                    subInfo.assetPaths.Add(path.ToLower());
                    subInfo.assetHashs.Add(hash);
                    AssetBundleBuild abb = subInfo.assetBundleBuild;
                    abb.assetNames = subInfo.assetPaths.ToArray();

                    //abb.addressableNames = subInfo.assetPaths.ToArray();
                    subInfo.assetBundleBuild = abb;
                    EditorUtility.DisplayProgressBar("Calc Asset Bundle Build Infos...", path, (float)(j + 1.0f) / (float)buildInfo.assetPaths.Count);
                }
            }
            EditorUtility.ClearProgressBar();


            Logger.Log("Calc Asset Bundle Infos Over.");
        }