Example #1
0
        public static bool RebuildAllAssetBundles(BuildTarget target, bool appendLuaDir)
        {
            outputPath           = null;
            m_currentBuildTarget = target;
            InitializeSetting();
            BuildAssetRelation.Clear();
            var settings = settingRoot;

            if (appendLuaDir)
            {
                BuildLuaFile(Path.Combine(Application.dataPath.Replace("Assets", ""), "Lua"));
                AssetDatabase.Refresh();

                settings = CreateInstance <StaticABSettings>();
                settings.ExtraDependencyAssets = settingRoot.ExtraDependencyAssets;
                settings.Settings = new StaticABSetting[settingRoot.Settings.Length + 1];
                Array.Copy(settingRoot.Settings, settings.Settings, settingRoot.Settings.Length);
                settings.Settings[settingRoot.Settings.Length] = new StaticABSetting()
                {
                    FolderPath       = AssetDatabase.LoadAssetAtPath <DefaultAsset>("Assets/Resources/Lua"),
                    Op               = StaticABSetting.Operation.ALL_IN_ONE,
                    UnloadStrategies = new SpecialBundleLoadLogic[0]
                };
                settings.Scenes = settingRoot.Scenes;
                Debug.Log("Finish copy lua directory");
            }

            try {
                BuildAssetRelation.BuildRelation(settings);
                Debug.Log($"Start AB Build Output : {OutputPath}");

                var buildContext = AssetNodeCollector.Output();
                using (var stream = new StreamWriter("./build-relations.tsv")) {
                    for (int i = 0; i < buildContext.Length; i++)
                    {
                        var ctx = buildContext[i];
                        stream.WriteLine($"{i}\t{ctx.assetBundleName}\t{string.Join("\t", ctx.assetNames)}");
                    }
                }

                BuildPipeline.BuildAssetBundles(OutputPath, buildContext,
                                                BuildAssetBundleOptions.DeterministicAssetBundle | BuildAssetBundleOptions.ChunkBasedCompression, target);
                Directory.Delete($"{Application.dataPath}/Resources/Lua", true);
                FinalClear();
                //处理之前先删除streamingAssetsPath内的内容,以免有冗余的旧ab包打进安装包
                if (Directory.Exists(CopyPath))
                {
                    Directory.Delete(CopyPath, true);
                    Directory.CreateDirectory(CopyPath);
                }

                foreach (var item in buildContext)
                {
                    string abBuildOutPath = Path.Combine(OutputPath, item.assetBundleName);
                    string nameStrHash    = item.assetBundleName.GetHashCode().ToString();
                    byte[] offsetData     = Encoding.UTF8.GetBytes(nameStrHash);
                    string targetPath     = Path.Combine(CopyPath, item.assetBundleName);
                    string directoryPath  = Path.GetDirectoryName(targetPath);
                    if (!Directory.Exists(directoryPath))
                    {
                        Directory.CreateDirectory(directoryPath ?? string.Empty);
                    }
                    using (var destFile = File.Open(targetPath, FileMode.OpenOrCreate, FileAccess.Write))
                        using (var sourceFile = new FileStream(abBuildOutPath, FileMode.Open)) {
                            destFile.Write(offsetData, 0, offsetData.Length);
                            var buffer = new byte[1024];
                            while (sourceFile.Position < sourceFile.Length)
                            {
                                var size = sourceFile.Read(buffer, 0, buffer.Length);
                                destFile.Write(buffer, 0, size);
                            }
                        }
                }

                File.Copy($"{OutputPath}/package.conf", $"{CopyPath}/package.conf", true);
                File.Copy($"{OutputPath}/{m_currentBuildTarget.ToString()}",
                          $"{CopyPath}/{m_currentBuildTarget.ToString()}", true);
                return(true);
            }
            catch (Exception e) {
                EditorUtility.ClearProgressBar();
                Debug.LogException(e);
                return(false);
            }
            finally {
                AssetCustomProcesses.Shutdown();
            }
        }