using System; using System.IO; 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; } } /// /// 以文件路径作为资源包名 /// 注意:每个文件独自打资源包 /// 例如:"Assets/UIPanel/Shop/Image/backgroud.png" --> "assets_uipanel_shop_image_backgroud.bundle" /// 例如:"Assets/UIPanel/Shop/View/main.prefab" --> "assets_uipanel_shop_view_main.bundle" /// [DisplayName("资源包名: 文件路径")] public class PackSeparately : IPackRule { PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data) { string bundleName = PathUtility.RemoveExtension(data.AssetPath); PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension); return result; } bool IPackRule.IsRawFilePackRule() { return false; } } /// /// 以父类文件夹路径作为资源包名 /// 注意:文件夹下所有文件打进一个资源包 /// 例如:"Assets/UIPanel/Shop/Image/backgroud.png" --> "assets_uipanel_shop_image.bundle" /// 例如:"Assets/UIPanel/Shop/View/main.prefab" --> "assets_uipanel_shop_view.bundle" /// [DisplayName("资源包名: 父类文件夹路径")] public class PackDirectory : IPackRule { PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data) { string bundleName = Path.GetDirectoryName(data.AssetPath); PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension); return result; } bool IPackRule.IsRawFilePackRule() { return false; } } /// /// 以收集器路径下顶级文件夹为资源包名 /// 注意:文件夹下所有文件打进一个资源包 /// 例如:收集器路径为 "Assets/UIPanel" /// 例如:"Assets/UIPanel/Shop/Image/backgroud.png" --> "assets_uipanel_shop.bundle" /// 例如:"Assets/UIPanel/Shop/View/main.prefab" --> "assets_uipanel_shop.bundle" /// [DisplayName("资源包名: 收集器下顶级文件夹路径")] public class PackTopDirectory : IPackRule { PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data) { string assetPath = data.AssetPath.Replace(data.CollectPath, string.Empty); assetPath = assetPath.TrimStart('/'); string[] splits = assetPath.Split('/'); if (splits.Length > 0) { if (Path.HasExtension(splits[0])) throw new Exception($"Not found root directory : {assetPath}"); string bundleName = $"{data.CollectPath}/{splits[0]}"; PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension); return result; } else { throw new Exception($"Not found root directory : {assetPath}"); } } bool IPackRule.IsRawFilePackRule() { return false; } } /// /// 以收集器路径作为资源包名 /// 注意:收集的所有文件打进一个资源包 /// [DisplayName("资源包名: 收集器路径")] public class PackCollector : IPackRule { PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data) { string bundleName; string collectPath = data.CollectPath; if (AssetDatabase.IsValidFolder(collectPath)) { bundleName = collectPath; } else { bundleName = PathUtility.RemoveExtension(collectPath); } PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension); return result; } bool IPackRule.IsRawFilePackRule() { return false; } } /// /// 以分组名称作为资源包名 /// 注意:收集的所有文件打进一个资源包 /// [DisplayName("资源包名: 分组名称")] public class PackGroup : IPackRule { PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data) { string bundleName = data.GroupName; PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension); return result; } bool IPackRule.IsRawFilePackRule() { return false; } } /// /// 打包原生文件 /// [DisplayName("打包原生文件")] public class PackRawFile : IPackRule { PackRuleResult IPackRule.GetPackRuleResult(PackRuleData data) { string bundleName = data.AssetPath; PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.RawFileExtension); return result; } bool IPackRule.IsRawFilePackRule() { return true; } } /// /// 打包着色器变种集合 /// [DisplayName("打包着色器变种集合文件")] public class PackShaderVariants : IPackRule { public PackRuleResult GetPackRuleResult(PackRuleData data) { return DefaultPackRule.CreateShadersPackRuleResult(); } bool IPackRule.IsRawFilePackRule() { return false; } } }