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(); } }