From c4875d4f8049a0cc4052e7789e43152c89d8789b Mon Sep 17 00:00:00 2001 From: hevinci Date: Fri, 17 Feb 2023 18:41:27 +0800 Subject: [PATCH] optimize pack rule MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 接口变动:IPackRule --- .../AssetBundleBuilder/BuildAssetInfo.cs | 78 ++++-------- .../AssetBundleBuilder/BuildMapContext.cs | 7 +- .../AssetBundleBuilder/BuildMapCreater.cs | 34 +++--- .../BuildTasks/TaskBuilding_SBP.cs | 3 +- .../BuildTasks/TaskCreatePatchManifest.cs | 8 +- .../BuildTasks/TaskUpdateBuildInfo.cs | 3 +- .../AssetBundleCollector.cs | 81 ++++++++---- .../AssetBundleCollectorSetting.cs | 8 +- .../AssetBundleCollectorWindow.cs | 2 +- .../AssetBundleCollector/CollectAssetInfo.cs | 16 +-- .../AssetBundleCollector/CollectCommand.cs | 14 ++- .../AssetBundleCollector/CollectResult.cs | 23 ++-- .../AssetBundleCollector/DefaultFilterRule.cs | 8 ++ .../AssetBundleCollector/DefaultPackRule.cs | 115 +++++++++++++----- .../Editor/AssetBundleCollector/IPackRule.cs | 51 +++++++- 15 files changed, 288 insertions(+), 163 deletions(-) diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildAssetInfo.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildAssetInfo.cs index e34abce..7999f92 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildAssetInfo.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildAssetInfo.cs @@ -7,8 +7,6 @@ namespace YooAsset.Editor { public class BuildAssetInfo { - private string _mainBundleName; - private string _shareBundleName; private bool _isAddAssetTags = false; private readonly HashSet _referenceBundleNames = new HashSet(); @@ -17,6 +15,11 @@ namespace YooAsset.Editor /// public ECollectorType CollectorType { private set; get; } + /// + /// 资源包完整名称 + /// + public string BundleName { private set; get; } + /// /// 可寻址地址 /// @@ -54,10 +57,10 @@ namespace YooAsset.Editor public List AllDependAssetInfos { private set; get; } - public BuildAssetInfo(ECollectorType collectorType, string mainBundleName, string address, string assetPath, bool isRawAsset) + public BuildAssetInfo(ECollectorType collectorType, string bundleName, string address, string assetPath, bool isRawAsset) { - _mainBundleName = mainBundleName; CollectorType = collectorType; + BundleName = bundleName; Address = address; AssetPath = assetPath; IsRawAsset = isRawAsset; @@ -133,24 +136,12 @@ namespace YooAsset.Editor /// public bool HasBundleName() { - string bundleName = GetBundleName(); - if (string.IsNullOrEmpty(bundleName)) + if (string.IsNullOrEmpty(BundleName)) return false; else return true; } - /// - /// 获取资源包名称 - /// - public string GetBundleName() - { - if (CollectorType == ECollectorType.None) - return _shareBundleName; - else - return _mainBundleName; - } - /// /// 添加关联的资源包名称 /// @@ -164,53 +155,32 @@ namespace YooAsset.Editor } /// - /// 计算主资源或共享资源的完整包名 + /// 计算共享资源包的完整包名 /// - public void CalculateFullBundleName(bool uniqueBundleName, string packageName) + public void CalculateShareBundleName(bool uniqueBundleName, string packageName, string shadersBundleName) { - if (CollectorType == ECollectorType.None) + if (CollectorType != ECollectorType.None) + return; + + if (IsRawAsset) + throw new Exception("Should never get here !"); + + if (IsShaderAsset) { - if (IsRawAsset) - throw new Exception("Should never get here !"); - - if (IsShaderAsset) - { - _shareBundleName = YooAssetSettingsData.GetUnityShadersBundleFullName(uniqueBundleName, packageName); - } - else - { - if (_referenceBundleNames.Count > 1) - { - IPackRule packRule = PackDirectory.StaticPackRule; - var bundleName = packRule.GetBundleName(new PackRuleData(AssetPath)); - if (YooAssetSettingsData.Setting.RegularBundleName) - bundleName = EditorTools.GetRegularPath(bundleName).Replace('/', '_').Replace('.', '_').ToLower(); - else - bundleName = EditorTools.GetRegularPath(bundleName).ToLower(); - - if (uniqueBundleName) - _shareBundleName = $"{packageName.ToLower()}_share_{bundleName}.{YooAssetSettingsData.Setting.AssetBundleFileVariant}"; - else - _shareBundleName = $"share_{bundleName}.{YooAssetSettingsData.Setting.AssetBundleFileVariant}"; - } - } + BundleName = shadersBundleName; } else { - if (IsRawAsset) + if (_referenceBundleNames.Count > 1) { - string mainBundleName = $"{_mainBundleName}.{YooAssetSettingsData.Setting.RawBundleFileVariant}"; - _mainBundleName = mainBundleName.ToLower(); + IPackRule packRule = PackDirectory.StaticPackRule; + PackRuleResult packRuleResult = packRule.GetPackRuleResult(new PackRuleData(AssetPath)); + BundleName = packRuleResult.GetShareBundleName(packageName, uniqueBundleName); } else { - string mainBundleName = $"{_mainBundleName}.{YooAssetSettingsData.Setting.AssetBundleFileVariant}"; - _mainBundleName = mainBundleName.ToLower(); ; - } - - if (uniqueBundleName) - { - _mainBundleName = $"{packageName.ToLower()}_{_mainBundleName}"; + // 注意:被引用次数小于1的资源不需要设置资源包名称 + BundleName = string.Empty; } } } diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapContext.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapContext.cs index effc561..f05ee17 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapContext.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapContext.cs @@ -24,6 +24,11 @@ namespace YooAsset.Editor /// public bool UniqueBundleName; + /// + /// 着色器统一的全名称 + /// + public string ShadersBundleName; + /// /// 资源包列表 /// @@ -35,7 +40,7 @@ namespace YooAsset.Editor /// public void PackAsset(BuildAssetInfo assetInfo) { - string bundleName = assetInfo.GetBundleName(); + string bundleName = assetInfo.BundleName; if (string.IsNullOrEmpty(bundleName)) throw new Exception("Should never get here !"); diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapCreater.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapCreater.cs index bf783d3..46417ce 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapCreater.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildMapCreater.cs @@ -11,8 +11,7 @@ namespace YooAsset.Editor /// 执行资源构建上下文 /// public static BuildMapContext CreateBuildMap(EBuildMode buildMode, string packageName) - { - BuildMapContext context = new BuildMapContext(); + { Dictionary buildAssetDic = new Dictionary(1000); // 1. 检测配置合法性 @@ -22,7 +21,7 @@ namespace YooAsset.Editor var buildResult = AssetBundleCollectorSettingData.Setting.GetPackageAssets(buildMode, packageName); List allCollectAssets = buildResult.CollectAssets; - // 3. 剔除未被引用的依赖资源 + // 3. 剔除未被引用的依赖项资源 List removeDependList = new List(); foreach (var collectAssetInfo in allCollectAssets) { @@ -42,7 +41,8 @@ namespace YooAsset.Editor { if (buildAssetDic.ContainsKey(collectAssetInfo.AssetPath) == false) { - var buildAssetInfo = new BuildAssetInfo(collectAssetInfo.CollectorType, collectAssetInfo.BundleName, + var buildAssetInfo = new BuildAssetInfo( + collectAssetInfo.CollectorType, collectAssetInfo.BundleName, collectAssetInfo.Address, collectAssetInfo.AssetPath, collectAssetInfo.IsRawAsset); buildAssetInfo.AddAssetTags(collectAssetInfo.AssetTags); buildAssetInfo.AddBundleTags(collectAssetInfo.AssetTags); @@ -54,32 +54,28 @@ namespace YooAsset.Editor } } - // 5. 录入相关依赖的资源 + // 5. 录入所有收集资源的依赖资源 foreach (var collectAssetInfo in allCollectAssets) { + string collectAssetBundleName = collectAssetInfo.BundleName; foreach (var dependAssetPath in collectAssetInfo.DependAssets) { if (buildAssetDic.ContainsKey(dependAssetPath)) { buildAssetDic[dependAssetPath].AddBundleTags(collectAssetInfo.AssetTags); - buildAssetDic[dependAssetPath].AddReferenceBundleName(collectAssetInfo.BundleName); + buildAssetDic[dependAssetPath].AddReferenceBundleName(collectAssetBundleName); } else { var buildAssetInfo = new BuildAssetInfo(dependAssetPath); buildAssetInfo.AddBundleTags(collectAssetInfo.AssetTags); - buildAssetInfo.AddReferenceBundleName(collectAssetInfo.BundleName); + buildAssetInfo.AddReferenceBundleName(collectAssetBundleName); buildAssetDic.Add(dependAssetPath, buildAssetInfo); } } } - // 6. 记录关键信息 - context.AssetFileCount = buildAssetDic.Count; - context.EnableAddressable = buildResult.EnableAddressable; - context.UniqueBundleName = buildResult.UniqueBundleName; - - // 7. 填充主动收集资源的依赖列表 + // 6. 填充所有收集资源的依赖列表 foreach (var collectAssetInfo in allCollectAssets) { var dependAssetInfos = new List(collectAssetInfo.DependAssets.Count); @@ -93,10 +89,18 @@ namespace YooAsset.Editor buildAssetDic[collectAssetInfo.AssetPath].SetAllDependAssetInfos(dependAssetInfos); } - // 8. 计算完整的资源包名 + // 7. 记录关键信息 + BuildMapContext context = new BuildMapContext(); + context.AssetFileCount = buildAssetDic.Count; + context.EnableAddressable = buildResult.Command.EnableAddressable; + context.UniqueBundleName = buildResult.Command.UniqueBundleName; + context.ShadersBundleName = buildResult.ShadersBundleName; + + // 8. 计算共享的资源包名 + var command = buildResult.Command; foreach (KeyValuePair pair in buildAssetDic) { - pair.Value.CalculateFullBundleName(buildResult.UniqueBundleName, buildResult.PackageName); + pair.Value.CalculateShareBundleName(command.UniqueBundleName, command.PackageName, buildResult.ShadersBundleName); } // 9. 移除不参与构建的资源 diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskBuilding_SBP.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskBuilding_SBP.cs index d17ee14..6c7ae23 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskBuilding_SBP.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskBuilding_SBP.cs @@ -33,8 +33,7 @@ namespace YooAsset.Editor // 开始构建 IBundleBuildResults buildResults; var buildParameters = buildParametersContext.GetSBPBuildParameters(); - var shadersBunldeName = YooAssetSettingsData.GetUnityShadersBundleFullName(buildMapContext.UniqueBundleName, buildParametersContext.Parameters.PackageName); - var taskList = SBPBuildTasks.Create(shadersBunldeName); + var taskList = SBPBuildTasks.Create(buildMapContext.ShadersBundleName); ReturnCode exitCode = ContentPipeline.BuildAssetBundles(buildParameters, buildContent, out buildResults, taskList); if (exitCode < 0) { diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePatchManifest.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePatchManifest.cs index 2982c84..2754b7a 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePatchManifest.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskCreatePatchManifest.cs @@ -42,13 +42,12 @@ namespace YooAsset.Editor patchManifest.AssetList = GetAllPatchAsset(context, patchManifest); // 更新Unity内置资源包的引用关系 - string shadersBunldeName = YooAssetSettingsData.GetUnityShadersBundleFullName(buildMapContext.UniqueBundleName, buildParameters.PackageName); if (buildParameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline) { if (buildParameters.BuildMode == EBuildMode.IncrementalBuild) { var buildResultContext = context.GetContextObject(); - UpdateBuiltInBundleReference(patchManifest, buildResultContext.Results, shadersBunldeName); + UpdateBuiltInBundleReference(patchManifest, buildResultContext.Results, buildMapContext.ShadersBundleName); } } @@ -98,7 +97,6 @@ namespace YooAsset.Editor private List GetAllPatchBundle(BuildContext context) { var buildMapContext = context.GetContextObject(); - var buildParametersContext = context.GetContextObject(); List result = new List(1000); foreach (var bundleInfo in buildMapContext.BundleInfos) @@ -129,7 +127,7 @@ namespace YooAsset.Editor patchAsset.Address = string.Empty; patchAsset.AssetPath = assetInfo.AssetPath; patchAsset.AssetTags = assetInfo.AssetTags.ToArray(); - patchAsset.BundleID = GetAssetBundleID(assetInfo.GetBundleName(), patchManifest); + patchAsset.BundleID = GetAssetBundleID(assetInfo.BundleName, patchManifest); patchAsset.DependIDs = GetAssetBundleDependIDs(patchAsset.BundleID, assetInfo, patchManifest); result.Add(patchAsset); } @@ -143,7 +141,7 @@ namespace YooAsset.Editor { if (dependAssetInfo.HasBundleName()) { - int bundleID = GetAssetBundleID(dependAssetInfo.GetBundleName(), patchManifest); + int bundleID = GetAssetBundleID(dependAssetInfo.BundleName, patchManifest); if (mainBundleID != bundleID) { if (result.Contains(bundleID) == false) diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskUpdateBuildInfo.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskUpdateBuildInfo.cs index 8c6f6fd..64dca4d 100644 --- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskUpdateBuildInfo.cs +++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildTasks/TaskUpdateBuildInfo.cs @@ -48,7 +48,8 @@ namespace YooAsset.Editor // 4.更新补丁包输出的文件路径 foreach (var bundleInfo in buildMapContext.BundleInfos) { - string patchFileName = PatchManifestTools.CreateBundleFileName(outputNameStyle, bundleInfo.BundleName, bundleInfo.PatchInfo.PatchFileHash, bundleInfo.IsRawFile); + string patchFileExtension = PatchManifestTools.GetRemoteBundleFileExtension(bundleInfo.BundleName); + string patchFileName = PatchManifestTools.GetRemoteBundleFileName(outputNameStyle, bundleInfo.BundleName, patchFileExtension, bundleInfo.PatchInfo.PatchFileHash); bundleInfo.PatchInfo.PatchOutputFilePath = $"{packageOutputDirectory}/{patchFileName}"; } } diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollector.cs b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollector.cs index 8449b7c..2a9208b 100644 --- a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollector.cs +++ b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollector.cs @@ -142,11 +142,14 @@ namespace YooAsset.Editor } Dictionary result = new Dictionary(1000); - bool isRawAsset = PackRuleName == nameof(PackRawFile); + + // 检测是否为原生资源打包规则 + IPackRule packRuleInstance = AssetBundleCollectorSettingData.GetPackRuleInstance(PackRuleName); + bool isRawFilePackRule = packRuleInstance.IsRawFilePackRule(); // 检测原生资源包的收集器类型 - if (isRawAsset && CollectorType != ECollectorType.MainAssetCollector) - throw new Exception($"The raw file must be set to {nameof(ECollectorType)}.{ECollectorType.MainAssetCollector} : {CollectPath}"); + if (isRawFilePackRule && CollectorType != ECollectorType.MainAssetCollector) + throw new Exception($"The raw file pack rule must be set to {nameof(ECollectorType)}.{ECollectorType.MainAssetCollector} : {CollectPath}"); if (string.IsNullOrEmpty(CollectPath)) throw new Exception($"The collect path is null or empty in group : {group.GroupName}"); @@ -158,11 +161,11 @@ namespace YooAsset.Editor string[] findAssets = EditorTools.FindAssets(EAssetSearchType.All, collectDirectory); foreach (string assetPath in findAssets) { - if (IsValidateAsset(assetPath) && IsCollectAsset(assetPath)) + if (IsValidateAsset(assetPath, isRawFilePackRule) && IsCollectAsset(assetPath)) { if (result.ContainsKey(assetPath) == false) { - var collectAssetInfo = CreateCollectAssetInfo(command, group, assetPath, isRawAsset); + var collectAssetInfo = CreateCollectAssetInfo(command, group, assetPath, isRawFilePackRule); result.Add(assetPath, collectAssetInfo); } else @@ -175,9 +178,9 @@ namespace YooAsset.Editor else { string assetPath = CollectPath; - if (IsValidateAsset(assetPath) && IsCollectAsset(assetPath)) + if (IsValidateAsset(assetPath, isRawFilePackRule) && IsCollectAsset(assetPath)) { - var collectAssetInfo = CreateCollectAssetInfo(command, group, assetPath, isRawAsset); + var collectAssetInfo = CreateCollectAssetInfo(command, group, assetPath, isRawFilePackRule); result.Add(assetPath, collectAssetInfo); } else @@ -207,22 +210,22 @@ namespace YooAsset.Editor return result.Values.ToList(); } - private CollectAssetInfo CreateCollectAssetInfo(CollectCommand command, AssetBundleCollectorGroup group, string assetPath, bool isRawAsset) + private CollectAssetInfo CreateCollectAssetInfo(CollectCommand command, AssetBundleCollectorGroup group, string assetPath, bool isRawFilePackRule) { string address = GetAddress(group, assetPath); - string bundleName = GetBundleName(group, assetPath); + string bundleName = GetBundleName(command, group, assetPath); List assetTags = GetAssetTags(group); - CollectAssetInfo collectAssetInfo = new CollectAssetInfo(CollectorType, bundleName, address, assetPath, assetTags, isRawAsset); + CollectAssetInfo collectAssetInfo = new CollectAssetInfo(CollectorType, bundleName, address, assetPath, isRawFilePackRule, assetTags); // 注意:模拟构建模式下不需要收集依赖资源 if (command.BuildMode == EBuildMode.SimulateBuild) collectAssetInfo.DependAssets = new List(); else - collectAssetInfo.DependAssets = GetAllDependencies(assetPath); + collectAssetInfo.DependAssets = GetAllDependencies(assetPath, isRawFilePackRule); return collectAssetInfo; } - private bool IsValidateAsset(string assetPath) + private bool IsValidateAsset(string assetPath, bool isRawFilePackRule) { if (assetPath.StartsWith("Assets/") == false && assetPath.StartsWith("Packages/") == false) { @@ -239,10 +242,31 @@ namespace YooAsset.Editor if (type == typeof(LightingDataAsset)) return false; - // 忽略Unity无法识别的无效文件 - // 注意:只对非原生文件收集器处理 - if(PackRuleName != nameof(PackRawFile)) + // 检测原生文件是否合规 + if (isRawFilePackRule) { + string extension = StringUtility.RemoveFirstChar(System.IO.Path.GetExtension(assetPath)); + if (extension == EAssetFileExtension.unity.ToString() || extension == EAssetFileExtension.prefab.ToString() || + extension == EAssetFileExtension.mat.ToString() || extension == EAssetFileExtension.controller.ToString() || + extension == EAssetFileExtension.fbx.ToString() || extension == EAssetFileExtension.anim.ToString() || + extension == EAssetFileExtension.shader.ToString()) + { + UnityEngine.Debug.LogWarning($"Raw file pack rule can not support file estension : {extension}"); + return false; + } + + // 注意:原生文件只支持无依赖关系的资源 + string[] depends = AssetDatabase.GetDependencies(assetPath, true); + if (depends.Length != 1) + { + UnityEngine.Debug.LogWarning($"Raw file pack rule can not support estension : {extension}"); + return false; + } + } + else + { + // 忽略Unity无法识别的无效文件 + // 注意:只对非原生文件收集器处理 if (type == typeof(UnityEditor.DefaultAsset)) { UnityEngine.Debug.LogWarning($"Cannot pack default asset : {assetPath}"); @@ -258,7 +282,7 @@ namespace YooAsset.Editor } private bool IsIgnoreFile(string fileExtension) { - foreach (var extension in YooAssetSettings.IgnoreFileExtensions) + foreach (var extension in DefaultFilterRule.IgnoreFileExtensions) { if (extension == fileExtension) return true; @@ -284,19 +308,22 @@ namespace YooAsset.Editor string adressValue = addressRuleInstance.GetAssetAddress(new AddressRuleData(assetPath, CollectPath, group.GroupName)); return adressValue; } - private string GetBundleName(AssetBundleCollectorGroup group, string assetPath) + private string GetBundleName(CollectCommand command, AssetBundleCollectorGroup group, string assetPath) { System.Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetPath); if (assetType == typeof(UnityEngine.Shader) || assetType == typeof(UnityEngine.ShaderVariantCollection)) - return EditorTools.GetRegularPath(YooAssetSettings.UnityShadersBundleName).ToLower(); - - // 根据规则设置获取资源包名称 - IPackRule packRuleInstance = AssetBundleCollectorSettingData.GetPackRuleInstance(PackRuleName); - string bundleName = packRuleInstance.GetBundleName(new PackRuleData(assetPath, CollectPath, group.GroupName)); - if(YooAssetSettingsData.Setting.RegularBundleName) - return EditorTools.GetRegularPath(bundleName).Replace('/', '_').Replace('.', '_').ToLower(); + { + // 获取着色器打包规则结果 + PackRuleResult packRuleResult = DefaultPackRule.CreateShadersPackRuleResult(); + return packRuleResult.GetMainBundleName(command.PackageName, command.UniqueBundleName); + } else - return EditorTools.GetRegularPath(bundleName).ToLower(); + { + // 获取其它资源打包规则结果 + IPackRule packRuleInstance = AssetBundleCollectorSettingData.GetPackRuleInstance(PackRuleName); + PackRuleResult packRuleResult = packRuleInstance.GetPackRuleResult(new PackRuleData(assetPath, CollectPath, group.GroupName)); + return packRuleResult.GetMainBundleName(command.PackageName, command.UniqueBundleName); + } } private List GetAssetTags(AssetBundleCollectorGroup group) { @@ -305,13 +332,13 @@ namespace YooAsset.Editor tags.AddRange(temper); return tags; } - private List GetAllDependencies(string mainAssetPath) + private List GetAllDependencies(string mainAssetPath, bool isRawFilePackRule) { List result = new List(); string[] depends = AssetDatabase.GetDependencies(mainAssetPath, true); foreach (string assetPath in depends) { - if (IsValidateAsset(assetPath)) + if (IsValidateAsset(assetPath, isRawFilePackRule)) { // 注意:排除主资源对象 if (assetPath != mainAssetPath) diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorSetting.cs b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorSetting.cs index bfcc7d8..1480c9a 100644 --- a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorSetting.cs +++ b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorSetting.cs @@ -100,8 +100,8 @@ namespace YooAsset.Editor { if (package.PackageName == packageName) { - CollectCommand command = new CollectCommand(buildMode, EnableAddressable); - CollectResult collectResult = new CollectResult(package.PackageName, EnableAddressable, UniqueBundleName); + CollectCommand command = new CollectCommand(buildMode, package.PackageName, EnableAddressable, UniqueBundleName); + CollectResult collectResult = new CollectResult(command); collectResult.SetCollectAssets(package.GetAllCollectAssets(command)); return collectResult; } @@ -118,8 +118,8 @@ namespace YooAsset.Editor List collectResultList = new List(1000); foreach (var package in Packages) { - CollectCommand command = new CollectCommand(buildMode, EnableAddressable); - CollectResult collectResult = new CollectResult(package.PackageName, EnableAddressable, UniqueBundleName); + CollectCommand command = new CollectCommand(buildMode, package.PackageName, EnableAddressable, UniqueBundleName); + CollectResult collectResult = new CollectResult(command); collectResult.SetCollectAssets(package.GetAllCollectAssets(command)); collectResultList.Add(collectResult); } diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorWindow.cs b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorWindow.cs index 486ce7e..9ec9366 100644 --- a/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorWindow.cs +++ b/Assets/YooAsset/Editor/AssetBundleCollector/AssetBundleCollectorWindow.cs @@ -776,7 +776,7 @@ namespace YooAsset.Editor try { - CollectCommand command = new CollectCommand(EBuildMode.DryRunBuild, _enableAddressableToogle.value); + CollectCommand command = new CollectCommand(EBuildMode.DryRunBuild, _packageNameTxt.value, _enableAddressableToogle.value, _uniqueBundleNameToogle.value); collectAssetInfos = collector.GetAllCollectAssets(command, group); } catch (System.Exception e) diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/CollectAssetInfo.cs b/Assets/YooAsset/Editor/AssetBundleCollector/CollectAssetInfo.cs index fc9c41b..6d12c35 100644 --- a/Assets/YooAsset/Editor/AssetBundleCollector/CollectAssetInfo.cs +++ b/Assets/YooAsset/Editor/AssetBundleCollector/CollectAssetInfo.cs @@ -14,7 +14,7 @@ namespace YooAsset.Editor /// 资源包名称 /// public string BundleName { private set; get; } - + /// /// 可寻址地址 /// @@ -25,30 +25,30 @@ namespace YooAsset.Editor /// public string AssetPath { private set; get; } - /// - /// 资源分类标签 - /// - public List AssetTags { private set; get; } - /// /// 是否为原生资源 /// public bool IsRawAsset { private set; get; } + /// + /// 资源分类标签 + /// + public List AssetTags { private set; get; } + /// /// 依赖的资源列表 /// public List DependAssets = new List(); - public CollectAssetInfo(ECollectorType collectorType, string bundleName, string address, string assetPath, List assetTags, bool isRawAsset) + public CollectAssetInfo(ECollectorType collectorType, string bundleName, string address, string assetPath, bool isRawAsset, List assetTags) { CollectorType = collectorType; BundleName = bundleName; Address = address; AssetPath = assetPath; - AssetTags = assetTags; IsRawAsset = isRawAsset; + AssetTags = assetTags; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/CollectCommand.cs b/Assets/YooAsset/Editor/AssetBundleCollector/CollectCommand.cs index 0501a37..2f6d3bb 100644 --- a/Assets/YooAsset/Editor/AssetBundleCollector/CollectCommand.cs +++ b/Assets/YooAsset/Editor/AssetBundleCollector/CollectCommand.cs @@ -8,15 +8,27 @@ namespace YooAsset.Editor /// public EBuildMode BuildMode { private set; get; } + /// + /// 包裹名称 + /// + public string PackageName { private set; get; } + /// /// 是否启用可寻址资源定位 /// public bool EnableAddressable { private set; get; } - public CollectCommand(EBuildMode buildMode, bool enableAddressable) + /// + /// 资源包名唯一化 + /// + public bool UniqueBundleName { private set; get; } + + public CollectCommand(EBuildMode buildMode, string packageName, bool enableAddressable, bool uniqueBundleName) { BuildMode = buildMode; + PackageName = packageName; EnableAddressable = enableAddressable; + UniqueBundleName = uniqueBundleName; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/CollectResult.cs b/Assets/YooAsset/Editor/AssetBundleCollector/CollectResult.cs index 5eca265..3cbd1cf 100644 --- a/Assets/YooAsset/Editor/AssetBundleCollector/CollectResult.cs +++ b/Assets/YooAsset/Editor/AssetBundleCollector/CollectResult.cs @@ -6,19 +6,14 @@ namespace YooAsset.Editor public class CollectResult { /// - /// 包裹名称 + /// 收集命令 /// - public string PackageName { private set; get; } + public CollectCommand Command { private set; get; } /// - /// 是否启用可寻址资源定位 + /// 着色器统一全名称 /// - public bool EnableAddressable { private set; get; } - - /// - /// 资源包名唯一化 - /// - public bool UniqueBundleName { private set; get; } + public string ShadersBundleName { private set; get; } /// /// 收集的资源信息列表 @@ -26,11 +21,13 @@ namespace YooAsset.Editor public List CollectAssets { private set; get; } - public CollectResult(string packageName, bool enableAddressable, bool uniqueBundleName) + public CollectResult(CollectCommand command) { - PackageName = packageName; - EnableAddressable = enableAddressable; - UniqueBundleName = uniqueBundleName; + Command = command; + + // 着色器统一全名称 + var packRuleResult = DefaultPackRule.CreateShadersPackRuleResult(); + ShadersBundleName = packRuleResult.GetMainBundleName(command.PackageName, command.UniqueBundleName); } public void SetCollectAssets(List collectAssets) diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/DefaultFilterRule.cs b/Assets/YooAsset/Editor/AssetBundleCollector/DefaultFilterRule.cs index eba9b87..b24b0b2 100644 --- a/Assets/YooAsset/Editor/AssetBundleCollector/DefaultFilterRule.cs +++ b/Assets/YooAsset/Editor/AssetBundleCollector/DefaultFilterRule.cs @@ -4,6 +4,14 @@ using System.IO; namespace YooAsset.Editor { + public class DefaultFilterRule + { + /// + /// 忽略的文件类型 + /// + public static readonly string[] IgnoreFileExtensions = { "", ".so", ".dll", ".cs", ".js", ".boo", ".meta", ".cginc", ".hlsl" }; + } + [DisplayName("收集所有资源")] public class CollectAll : IFilterRule { diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/DefaultPackRule.cs b/Assets/YooAsset/Editor/AssetBundleCollector/DefaultPackRule.cs index 3dbc7c9..4d9d582 100644 --- a/Assets/YooAsset/Editor/AssetBundleCollector/DefaultPackRule.cs +++ b/Assets/YooAsset/Editor/AssetBundleCollector/DefaultPackRule.cs @@ -4,6 +4,31 @@ using UnityEditor; namespace YooAsset.Editor { + public class DefaultPackRule + { + /// + /// AssetBundle文件的后缀名 + /// + public const string AssetBundleFileExtension = "bundle"; + + /// + /// 原生文件的后缀名 + /// + public const string RawFileExtension = "rawfile"; + + /// + /// Unity着色器资源包名称 + /// + public const string ShadersBundleName = "unityshaders"; + + + public static PackRuleResult CreateShadersPackRuleResult() + { + PackRuleResult result = new PackRuleResult(ShadersBundleName, AssetBundleFileExtension); + return result; + } + } + /// /// 以文件路径作为资源包名 /// 注意:每个文件独自打资源包 @@ -13,9 +38,16 @@ namespace YooAsset.Editor [DisplayName("以文件路径作为资源包名")] public class PackSeparately : IPackRule { - string IPackRule.GetBundleName(PackRuleData data) + PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data) { - return StringUtility.RemoveExtension(data.AssetPath); + string bundleName = StringUtility.RemoveExtension(data.AssetPath); + PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension); + return result; + } + + bool IPackRule.IsRawFilePackRule() + { + return false; } } @@ -30,9 +62,16 @@ namespace YooAsset.Editor { public static PackDirectory StaticPackRule = new PackDirectory(); - string IPackRule.GetBundleName(PackRuleData data) + PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data) { - return Path.GetDirectoryName(data.AssetPath); + string bundleName = Path.GetDirectoryName(data.AssetPath); + PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension); + return result; + } + + bool IPackRule.IsRawFilePackRule() + { + return false; } } @@ -46,7 +85,7 @@ namespace YooAsset.Editor [DisplayName("以收集器路径下顶级文件夹为资源包名")] public class PackTopDirectory : IPackRule { - string IPackRule.GetBundleName(PackRuleData data) + PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data) { string assetPath = data.AssetPath.Replace(data.CollectPath, string.Empty); assetPath = assetPath.TrimStart('/'); @@ -56,13 +95,19 @@ namespace YooAsset.Editor if (Path.HasExtension(splits[0])) throw new Exception($"Not found root directory : {assetPath}"); string bundleName = $"{data.CollectPath}/{splits[0]}"; - return bundleName; + PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension); + return result; } else { throw new Exception($"Not found root directory : {assetPath}"); } } + + bool IPackRule.IsRawFilePackRule() + { + return false; + } } /// @@ -72,17 +117,26 @@ namespace YooAsset.Editor [DisplayName("以收集器路径作为资源包名")] public class PackCollector : IPackRule { - string IPackRule.GetBundleName(PackRuleData data) + PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data) { + string bundleName; string collectPath = data.CollectPath; if (AssetDatabase.IsValidFolder(collectPath)) { - return collectPath; + bundleName = collectPath; } else { - return StringUtility.RemoveExtension(collectPath); + bundleName = StringUtility.RemoveExtension(collectPath); } + + PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension); + return result; + } + + bool IPackRule.IsRawFilePackRule() + { + return false; } } @@ -93,9 +147,16 @@ namespace YooAsset.Editor [DisplayName("以分组名称作为资源包名")] public class PackGroup : IPackRule { - string IPackRule.GetBundleName(PackRuleData data) + PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data) { - return data.GroupName; + string bundleName = data.GroupName; + PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension); + return result; + } + + bool IPackRule.IsRawFilePackRule() + { + return false; } } @@ -106,23 +167,16 @@ namespace YooAsset.Editor [DisplayName("打包原生文件")] public class PackRawFile : IPackRule { - string IPackRule.GetBundleName(PackRuleData data) + PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data) { - string extension = StringUtility.RemoveFirstChar(Path.GetExtension(data.AssetPath)); - if (extension == EAssetFileExtension.unity.ToString() || extension == EAssetFileExtension.prefab.ToString() || - extension == EAssetFileExtension.mat.ToString() || extension == EAssetFileExtension.controller.ToString() || - extension == EAssetFileExtension.fbx.ToString() || extension == EAssetFileExtension.anim.ToString() || - extension == EAssetFileExtension.shader.ToString()) - { - throw new Exception($"{nameof(PackRawFile)} is not support file estension : {extension}"); - } + string bundleName = data.AssetPath; + PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.RawFileExtension); + return result; + } - // 注意:原生文件只支持无依赖关系的资源 - string[] depends = AssetDatabase.GetDependencies(data.AssetPath, true); - if (depends.Length != 1) - throw new Exception($"{nameof(PackRawFile)} is not support estension : {extension}"); - - return data.AssetPath; + bool IPackRule.IsRawFilePackRule() + { + return true; } } @@ -132,9 +186,14 @@ namespace YooAsset.Editor [DisplayName("打包着色器变种集合")] public class PackShaderVariants : IPackRule { - public string GetBundleName(PackRuleData data) + public PackRuleResult GetPackRuleResult(PackRuleData data) { - return YooAssetSettings.UnityShadersBundleName; + return DefaultPackRule.CreateShadersPackRuleResult(); + } + + bool IPackRule.IsRawFilePackRule() + { + return false; } } } \ No newline at end of file diff --git a/Assets/YooAsset/Editor/AssetBundleCollector/IPackRule.cs b/Assets/YooAsset/Editor/AssetBundleCollector/IPackRule.cs index c719002..7593baa 100644 --- a/Assets/YooAsset/Editor/AssetBundleCollector/IPackRule.cs +++ b/Assets/YooAsset/Editor/AssetBundleCollector/IPackRule.cs @@ -3,7 +3,7 @@ namespace YooAsset.Editor { public struct PackRuleData { - public string AssetPath; + public string AssetPath; public string CollectPath; public string GroupName; @@ -21,14 +21,59 @@ namespace YooAsset.Editor } } + public struct PackRuleResult + { + private readonly string _bundleName; + private readonly string _bundleExtension; + + public PackRuleResult(string bundleName, string bundleExtension) + { + _bundleName = bundleName; + _bundleExtension = bundleExtension; + } + + /// + /// 获取主资源包全名称 + /// + public string GetMainBundleName(string packageName, bool uniqueBundleName) + { + string fullName; + string bundleName = EditorTools.GetRegularPath(_bundleName).Replace('/', '_').Replace('.', '_').ToLower(); + if (uniqueBundleName) + fullName = $"{packageName}_{bundleName}.{_bundleExtension}"; + else + fullName = $"{bundleName}.{_bundleExtension}"; + return fullName.ToLower(); + } + + /// + /// 获取共享资源包全名称 + /// + public string GetShareBundleName(string packageName, bool uniqueBundleName) + { + string fullName; + string bundleName = EditorTools.GetRegularPath(_bundleName).Replace('/', '_').Replace('.', '_').ToLower(); + if (uniqueBundleName) + fullName = $"{packageName}_share_{bundleName}.{_bundleExtension}"; + else + fullName = $"share_{bundleName}.{_bundleExtension}"; + return fullName.ToLower(); + } + } + /// /// 资源打包规则接口 /// public interface IPackRule { /// - /// 获取资源打包所属的资源包名称 + /// 获取打包规则结果 /// - string GetBundleName(PackRuleData data); + PackRuleResult GetPackRuleResult(PackRuleData data); + + /// + /// 是否为原生文件打包规则 + /// + bool IsRawFilePackRule(); } } \ No newline at end of file