using System; using System.IO; using UnityEditor; using UnityEngine; using YooAsset; using YooAsset.Editor; namespace Stary.Evo.Editor { [Serializable] public class MixedBuildPipelineViewer : AbstractBuildPipelineViewer { public MixedBuildPipelineViewer(string packageName, string selectedBuildPipelines, string packageVersion) : base(packageName, selectedBuildPipelines, packageVersion) { } public override void ExecuteBuild() { // 1. 首先使用RawFileBuildPipeline打包视频文件 Debug.Log("开始使用ScriptableBuildPipeline打包其余文件..."); var scriptableBuildResult = BuildOtherFiles(); if (!scriptableBuildResult.Success) { Debug.LogError("其余文件打包失败!"); return; } // 2. 然后使用ScriptableBuildPipeline打包其余文件 Debug.Log("开始使用RawFileBuildPipeline打包视频文件..."); var rawBuildResult = BuildRawFiles(); if (!rawBuildResult.Success) { Debug.LogWarning("视频文件打包失败!"); return; } Debug.Log("混合打包完成!"); base.ExecuteBuild(); } private BuildResult BuildRawFiles() { var rawPackageName = $"{packageName}_RawFile"; var package = AssetBundleCollectorSettingData.Setting.GetPackage(rawPackageName); int count = 0; foreach (var group in package.Groups) { foreach (var collector in group.Collectors) { count++; } } if (count > 0) { var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(packageName, selectedBuildPipelines); var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(packageName, selectedBuildPipelines); var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(packageName, selectedBuildPipelines); var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(packageName, selectedBuildPipelines); var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(packageName, selectedBuildPipelines); RawFileBuildParameters buildParameters = new RawFileBuildParameters(); buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot(); buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot(); buildParameters.BuildPipeline = selectedBuildPipelines; buildParameters.BuildBundleType = (int)EBuildBundleType.RawBundle; buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget; buildParameters.PackageName = rawPackageName; buildParameters.PackageVersion = packageVersion; buildParameters.VerifyBuildingResult = true; buildParameters.FileNameStyle = fileNameStyle; buildParameters.BuildinFileCopyOption = buildinFileCopyOption; buildParameters.BuildinFileCopyParams = buildinFileCopyParams; buildParameters.ClearBuildCacheFiles = clearBuildCache; buildParameters.UseAssetDependencyDB = useAssetDependencyDB; buildParameters.EncryptionServices = CreateEncryptionInstance(); // SetVideoGroupActive(true); RawFileBuildPipeline pipeline = new RawFileBuildPipeline(); return pipeline.Run(buildParameters, true); } else { return new BuildResult() { Success = false }; } } private BuildResult BuildOtherFiles() { var fileNameStyle = AssetBundleBuilderSetting.GetPackageFileNameStyle(packageName, selectedBuildPipelines); var buildinFileCopyOption = AssetBundleBuilderSetting.GetPackageBuildinFileCopyOption(packageName, selectedBuildPipelines); var buildinFileCopyParams = AssetBundleBuilderSetting.GetPackageBuildinFileCopyParams(packageName, selectedBuildPipelines); var compressOption = AssetBundleBuilderSetting.GetPackageCompressOption(packageName, selectedBuildPipelines); var useAssetDependencyDB = AssetBundleBuilderSetting.GetPackageUseAssetDependencyDB(packageName, selectedBuildPipelines); var clearBuildCache = AssetBundleBuilderSetting.GetPackageClearBuildCache(packageName, selectedBuildPipelines); var builtinShaderBundleName = GetBuiltinShaderBundleName(); ScriptableBuildParameters buildParameters = new ScriptableBuildParameters(); buildParameters.BuildOutputRoot = AssetBundleBuilderHelper.GetDefaultBuildOutputRoot(); buildParameters.BuildinFileRoot = AssetBundleBuilderHelper.GetStreamingAssetsRoot(); buildParameters.BuildPipeline = selectedBuildPipelines; buildParameters.BuildBundleType = (int)EBuildBundleType.AssetBundle; buildParameters.BuildTarget = EditorUserBuildSettings.activeBuildTarget; buildParameters.PackageName = packageName; buildParameters.PackageVersion = packageVersion; buildParameters.EnableSharePackRule = true; buildParameters.VerifyBuildingResult = true; buildParameters.FileNameStyle = fileNameStyle; buildParameters.BuildinFileCopyOption = buildinFileCopyOption; buildParameters.BuildinFileCopyParams = buildinFileCopyParams; buildParameters.CompressOption = compressOption; buildParameters.ClearBuildCacheFiles = clearBuildCache; buildParameters.UseAssetDependencyDB = useAssetDependencyDB; buildParameters.BuiltinShadersBundleName = builtinShaderBundleName; buildParameters.EncryptionServices = CreateEncryptionInstance(); ScriptableBuildPipeline pipeline = new ScriptableBuildPipeline(); var result = pipeline.Run(buildParameters, true); return result; } // private void SetVideoGroupActive(bool isActive) // { // var setting = YooAsset.Editor.AssetBundleCollectorSettingData.Setting; // if (setting == null) // { // Debug.LogError("UnityEvo: 打包设置获取失败,请检查AssetBundleCollectorSettingData设置!"); // return; // } // // // 使用LINQ简化Package查找 // var collectorPackage = setting.Packages.Find(p => p.PackageName == packageName); // if (collectorPackage == null) // { // Debug.LogError($"UnityEvo: 打包视频文件失败【{packageName}】...未找到对应的Package文件,请检查"); // return; // } // // // 定义激活和禁用规则名称 // string enableRule = nameof(EnableGroup); // string disableRule = nameof(DisableGroup); // // // 遍历所有组并设置激活规则 // foreach (var group in collectorPackage.Groups) // { // // 使用三元运算符简化逻辑,减少重复代码 // bool shouldEnableGroup = group.GroupName == "Video" ? isActive : !isActive; // group.ActiveRuleName = shouldEnableGroup ? enableRule : disableRule; // } // // YooAsset.Editor.AssetBundleCollectorSettingData.SaveFile(); // } } }