diff --git a/Assets/00.StaryEvoTools/Editor/Build/AutoBuildPackage.cs b/Assets/00.StaryEvoTools/Editor/Build/AutoBuildPackage.cs index ea438d7..bbda032 100644 --- a/Assets/00.StaryEvoTools/Editor/Build/AutoBuildPackage.cs +++ b/Assets/00.StaryEvoTools/Editor/Build/AutoBuildPackage.cs @@ -64,7 +64,7 @@ namespace Stary.Evo.Editor { if (oneKeyBUildEntity.isRaw) { - MarkAdressable.CollectSVC(MarkAdressable.DomainRoot, oneKeyBUildEntity.DomainName, + MarkAdressable.CollectSvc(MarkAdressable.DomainRoot, oneKeyBUildEntity.DomainName, () => { EditorUtility.DisplayDialog("收集shader【材质异常或资源修改】", "收集成功", "确定"); }); } } diff --git a/Assets/00.StaryEvoTools/Editor/BuildAsset/IBuildPipelineViewer.cs b/Assets/00.StaryEvoTools/Editor/BuildAsset/IBuildPipelineViewer.cs index 7df4b6e..dd9f9db 100644 --- a/Assets/00.StaryEvoTools/Editor/BuildAsset/IBuildPipelineViewer.cs +++ b/Assets/00.StaryEvoTools/Editor/BuildAsset/IBuildPipelineViewer.cs @@ -172,6 +172,15 @@ namespace Stary.Evo.Editor return null; } - + /// + /// 内置着色器资源包名称 + /// 注意:和自动收集的着色器资源包名保持一致! + /// + protected string GetBuiltinShaderBundleName() + { + var uniqueBundleName = AssetBundleCollectorSettingData.Setting.UniqueBundleName; + var packRuleResult = DefaultPackRule.CreateShadersPackRuleResult(); + return packRuleResult.GetBundleName(packageName, uniqueBundleName); + } } } \ No newline at end of file diff --git a/Assets/00.StaryEvoTools/Editor/BuildAsset/PipelineViewer/ScriptableBuildPipelineViewer.cs b/Assets/00.StaryEvoTools/Editor/BuildAsset/PipelineViewer/ScriptableBuildPipelineViewer.cs index 002bb52..037ee34 100644 --- a/Assets/00.StaryEvoTools/Editor/BuildAsset/PipelineViewer/ScriptableBuildPipelineViewer.cs +++ b/Assets/00.StaryEvoTools/Editor/BuildAsset/PipelineViewer/ScriptableBuildPipelineViewer.cs @@ -43,8 +43,8 @@ namespace Stary.Evo.Editor buildParameters.UseAssetDependencyDB = useAssetDependencyDB; buildParameters.BuiltinShadersBundleName = builtinShaderBundleName; buildParameters.EncryptionServices = CreateEncryptionInstance(); - - + + ScriptableBuildPipeline pipeline = new ScriptableBuildPipeline(); var buildResult = pipeline.Run(buildParameters, true); if (buildResult.Success) @@ -56,15 +56,6 @@ namespace Stary.Evo.Editor } - /// - /// 内置着色器资源包名称 - /// 注意:和自动收集的着色器资源包名保持一致! - /// - private string GetBuiltinShaderBundleName() - { - var uniqueBundleName = AssetBundleCollectorSettingData.Setting.UniqueBundleName; - var packRuleResult = DefaultPackRule.CreateShadersPackRuleResult(); - return packRuleResult.GetBundleName(packageName, uniqueBundleName); - } + } } \ No newline at end of file diff --git a/Assets/00.StaryEvoTools/Editor/MarkAdressable/MarkAdressable.cs b/Assets/00.StaryEvoTools/Editor/MarkAdressable/MarkAdressable.cs index b0a880d..ce32e1e 100644 --- a/Assets/00.StaryEvoTools/Editor/MarkAdressable/MarkAdressable.cs +++ b/Assets/00.StaryEvoTools/Editor/MarkAdressable/MarkAdressable.cs @@ -24,26 +24,16 @@ namespace Stary.Evo.Editor { get { return Application.dataPath + "/Domain"; } } - public static string ArtRoot - { - get { return Application.dataPath + "/Art"; } - } - - //[MenuItem("Evo/Hotfix/Addressable")] + public static void AddHotfixAddressableDll() { CopyDllHotUpdateAssembly(BuildAssetWindow.GetBuildPackageName(), $"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/AddressableRes"); CopyDllStrippedAOTDllOutputRootDir($"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/AddressableRes"); - - - //EditorUtility.DisplayDialog("自动标记", "自动Hotfix成功", "确定"); } public static void AddHotfixAddressableDllAll(List oneKeyBUildEntities) { - var DomainAll = CreatAssetWindow.GetCreatDomainAll(); - foreach (var oneKeyBUildEntity in oneKeyBUildEntities) { if (oneKeyBUildEntity.isRaw) @@ -53,9 +43,6 @@ namespace Stary.Evo.Editor CopyDllStrippedAOTDllOutputRootDir($"{DomainRoot}/{oneKeyBUildEntity.DomainName}/AddressableRes"); } } - - - //EditorUtility.DisplayDialog("自动标记", "自动Hotfix成功", "确定"); } private static void CopyDllHotUpdateAssembly(string domain, string target) @@ -137,13 +124,12 @@ namespace Stary.Evo.Editor { YooAsset.Editor.AssetBundleCollectorSettingData.RemovePackage(assetBundleCollectorPackage); } - MarkDomain(); + + Mark(); CreateRes(_packageName, $"{DomainRoot}/{oneKeyBUildEntity.DomainName}/AddressableRes", $"{DomainRoot}/{oneKeyBUildEntity.DomainName}/HotUpdate"); - - } } } @@ -175,90 +161,36 @@ namespace Stary.Evo.Editor DomainConfig domainConfig = AssetDatabase.LoadAssetAtPath(configPath); _packageName = domainConfig.domain; - MarkDomain(); + Mark(); + CollectSvc(DomainRoot, BuildAssetWindow.GetBuildPackageName(), () => + { + CreateRes(_packageName, + $"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/AddressableRes", + $"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/HotUpdate"); - CreateRes(_packageName, - $"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/AddressableRes", - $"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/HotUpdate"); - CollectSVC(DomainRoot,BuildAssetWindow.GetBuildPackageName(),()=> - { - EditorUtility.DisplayDialog("自动标记", "自动标记成功", "确定"); - }); + EditorUtility.DisplayDialog("自动标记", "自动标记成功", "确定"); + }); } - // [MenuItem("Evo/Hotfix/一键Res")] - public static void CreateRes(string domain, string resPath, string outputPath) + private static void CreateRes(string domain, string resPath, string outputPath) { - ResFileGet.CreateClass("Res", domain, outputPath, + ResFileGet.CreateClass(addressDic, "Res", domain, outputPath, (a) => { ResFileGet.CreateContent(a, resPath, "\t"); }); } #region 自动标记 - public static Dictionary addressDic = new Dictionary(); + private static Dictionary addressDic = new Dictionary(); - public static Dictionary collectorGroupDic = + private static Dictionary _collectorGroupDic = new Dictionary(); - public static void MarkArt() + public static void Mark() { addressDic.Clear(); - collectorGroupDic.Clear(); - ///创建分组 - string remotedRoot = $"{ArtRoot}/{_packageName}"; - DirectoryInfo[] dirs = new DirectoryInfo(remotedRoot).GetDirectories(); - - var setting = YooAsset.Editor.AssetBundleCollectorSettingData.Setting; - setting.ShowPackageView = true; - setting.UniqueBundleName = true; - //创建Package文件 - package = YooAsset.Editor.AssetBundleCollectorSettingData.CreatePackage(_packageName); - - //检测Packages是否存在TestPackage - package.PackageName = _packageName; - package.EnableAddressable = true; - package.IncludeAssetGUID = true; - package.AutoCollectShaders = true; - package.IgnoreRuleName = "NormalIgnoreRule"; - - //检测Packages是否存在Group - foreach (var info in dirs) - { - string groupName = info.Name; - - if (info.Name == "Scenes"||info.Name == "Config") - { - AssetBundleCollectorGroup collectorGroup = - YooAsset.Editor.AssetBundleCollectorSettingData.CreateGroup(package, groupName); - collectorGroup.AssetTags = groupName; - if (!collectorGroupDic.ContainsKey(groupName)) - { - collectorGroupDic.Add(groupName, collectorGroup); - } - else - { - Debug.LogError("分组 : " + groupName + "已存在,请检查资源目录,避免重复"); - } - AutoMarkRootAddress(info); - } - } - // AssetDatabase.SaveAssets(); - // AssetDatabase.Refresh(); - MarkStatus(); - YooAsset.Editor.AssetBundleCollectorSettingData.SaveFile(); - - // CreateRes(); - - - Debug.Log("MarkAsset Successful"); - } - - public static void MarkDomain() - { - addressDic.Clear(); - collectorGroupDic.Clear(); + _collectorGroupDic.Clear(); ///创建分组 string remotedRoot = $"{DomainRoot}/{_packageName}/AddressableRes"; @@ -288,9 +220,10 @@ namespace Stary.Evo.Editor AssetBundleCollectorGroup collectorGroup = YooAsset.Editor.AssetBundleCollectorSettingData.CreateGroup(package, groupName); collectorGroup.AssetTags = groupName; - if (!collectorGroupDic.ContainsKey(groupName)) + + if (!_collectorGroupDic.ContainsKey(groupName)) { - collectorGroupDic.Add(groupName, collectorGroup); + _collectorGroupDic.Add(groupName, collectorGroup); } else { @@ -307,8 +240,6 @@ namespace Stary.Evo.Editor ///自动创建图集 Debug.Log("开始创建图集"); AutoCreateSpriteAtlas(remotedRoot); - // AssetDatabase.SaveAssets(); - // AssetDatabase.Refresh(); MarkStatus(); YooAsset.Editor.AssetBundleCollectorSettingData.SaveFile(); @@ -342,14 +273,10 @@ namespace Stary.Evo.Editor { if (Path.GetExtension(file) != ".meta" && Path.GetExtension(file) != ".spriteatlas") { - // string[] dirSplit = file.Split(new string[] { $"AddressableRes\\{dir.Name}\\" }, - // StringSplitOptions.RemoveEmptyEntries); - // string address = (dirSplit[dirSplit.Length - 1]).Replace("\\", "/"); - // Debug.Log("address:" + address); string groupName = dir.Name; string assetPath = FilesUtils.AbsoluteToRelativePath("Assets", file); //Asset到文件的路径 var guid = AssetDatabase.AssetPathToGUID(assetPath); - var group = collectorGroupDic[groupName]; + var group = _collectorGroupDic[groupName]; if (group != null) { AssetBundleCollector collector = new AssetBundleCollector() @@ -385,13 +312,13 @@ namespace Stary.Evo.Editor public static void AutoCreateSpriteAtlas(string domainRootRes) { - string AtlasRemotedRoot = domainRootRes + "/SpriteAtlas"; - string SpriteRemotedAtlas = domainRootRes + "/Sprites"; - DirectoryInfo[] remotedirs = new DirectoryInfo(SpriteRemotedAtlas).GetDirectories(); + string atlasRemotedRoot = domainRootRes + "/SpriteAtlas"; + string spriteRemotedAtlas = domainRootRes + "/Sprites"; + DirectoryInfo[] remotedirs = new DirectoryInfo(spriteRemotedAtlas).GetDirectories(); foreach (var info in remotedirs) { - AddSpriteAtlas(SpriteRemotedAtlas + "/" + info.Name, SpriteRemotedAtlas, - AtlasRemotedRoot, info); + AddSpriteAtlas(spriteRemotedAtlas + "/" + info.Name, spriteRemotedAtlas, + atlasRemotedRoot, info); } } @@ -404,16 +331,11 @@ namespace Stary.Evo.Editor { var groupname = "SpriteAtlas"; var dirs = dir.GetDirectories(); - if (dirs == null || dirs.Length == 0) + if (dirs.Length == 0) { string name = path.Replace(atlasRoot + "/", string.Empty).Replace("/", "_"); string filePath = $"{spriteAtlas}/{name}.spriteatlas"; - // string[] dirSplit = - // filePath.Split(new string[] { $"AddressableRes/{Path.GetFileName(spriteAtlas)}" }, - // StringSplitOptions.RemoveEmptyEntries); - // string address = (dirSplit[dirSplit.Length - 1]).Substring(1).Replace("\\", "/"); - // Debug.Log("spriteatlasaddress:" + address); - int assetIndex = filePath.IndexOf("Assets"); + int assetIndex = filePath.IndexOf("Assets", StringComparison.Ordinal); string guidPath = filePath.Remove(0, assetIndex); if (!File.Exists(filePath)) { @@ -449,7 +371,7 @@ namespace Stary.Evo.Editor }; atlas.SetPlatformSettings(platformSettings); AssetDatabase.CreateAsset(atlas, guidPath); - int pathIndex = path.IndexOf("Assets"); + int pathIndex = path.IndexOf("Assets", StringComparison.Ordinal); string spritePath = path.Remove(0, pathIndex); UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath(spritePath, typeof(UnityEngine.Object)); atlas.Add(new[] { obj }); @@ -459,7 +381,7 @@ namespace Stary.Evo.Editor var guid = AssetDatabase.AssetPathToGUID(guidPath); - var group = collectorGroupDic[groupname]; + var group = _collectorGroupDic[groupname]; if (group != null) { AssetBundleCollector collector = new AssetBundleCollector() @@ -512,7 +434,14 @@ namespace Stary.Evo.Editor { string fileName = Path.GetFileNameWithoutExtension(assetPath); FileInfo fileInfo = new FileInfo(assetPath); - return $"{fileInfo.Directory.Name}_{fileName}"; + if (fileInfo.Directory != null) + { + return $"{fileInfo.Directory.Name}_{fileName}"; + } + else + { + return $"UnityEvo:{fileName}路径的fileInfo.Directory为Null"; + } } #endregion @@ -542,7 +471,7 @@ namespace Stary.Evo.Editor } } - public static void CollectSVC(string root,string packageName,Action complete) + public static void CollectSvc(string root, string packageName, Action complete) { string remotedRoot = $"{root}/{packageName}/ShaderVariants"; string remotedRootFileName = $"{remotedRoot}/{packageName}.shadervariants"; @@ -554,16 +483,14 @@ namespace Stary.Evo.Editor string localSavePath = FilesUtils.AbsoluteToRelativePath("Assets", remotedRootFileName); //Asset到文件的路径 - System.Action completedCallback = () => + void CompletedCallback() { ShaderVariantCollection collection = AssetDatabase.LoadAssetAtPath(localSavePath); if (collection != null) { - Debug.Log( - $"UnityEvo:【{packageName}】ShaderCount : {collection.shaderCount}"); - Debug.Log( - $"UnityEvo:【{packageName}】VariantCount : {collection.variantCount}"); + Debug.Log($"UnityEvo:【{packageName}】ShaderCount : {collection.shaderCount}"); + Debug.Log($"UnityEvo:【{packageName}】VariantCount : {collection.variantCount}"); CreateShaderVariantsGroup(packageName, localSavePath); @@ -573,8 +500,9 @@ namespace Stary.Evo.Editor { throw new Exception("Failed to Collect shader Variants."); } - }; - ShaderVariantCollector.Run(localSavePath, packageName, 1000, completedCallback); + } + + ShaderVariantCollector.Run(localSavePath, packageName, 1000, CompletedCallback); } // 新增方法:创建独立的ShaderVariants分组(防止多个package冲突) @@ -584,11 +512,12 @@ namespace Stary.Evo.Editor AssetBundleCollectorGroup collectorGroup = null; // 查找或创建package专属分组 - foreach (var package in AssetBundleCollectorSettingData.Setting.Packages) + foreach (var collectorPackage in AssetBundleCollectorSettingData.Setting.Packages) { - if (package.PackageName == packageName) + if (collectorPackage.PackageName == packageName) { - collectorGroup = YooAsset.Editor.AssetBundleCollectorSettingData.CreateGroup(package, groupname); + collectorGroup = + YooAsset.Editor.AssetBundleCollectorSettingData.CreateGroup(collectorPackage, groupname); break; } } diff --git a/Assets/00.StaryEvoTools/Editor/MarkAdressable/PackVideo.cs b/Assets/00.StaryEvoTools/Editor/MarkAdressable/PackVideo.cs new file mode 100644 index 0000000..737e53d --- /dev/null +++ b/Assets/00.StaryEvoTools/Editor/MarkAdressable/PackVideo.cs @@ -0,0 +1,17 @@ +using System.IO; +using YooAsset.Editor; + +namespace Stary.Evo.Editor +{ + public class PackVideo : IPackRule + { + public PackRuleResult GetPackRuleResult(PackRuleData data) + { + string bundleName = Path.ChangeExtension(data.AssetPath, null); // 用路径当包名 + string fileExt = Path.GetExtension(data.AssetPath).Substring(1); + return new PackRuleResult(bundleName, fileExt); + } + + public bool IsRawFilePackRule() => true; // 关键:标记为原生文件 + } +} \ No newline at end of file diff --git a/Assets/00.StaryEvoTools/Editor/MarkAdressable/PackVideo.cs.meta b/Assets/00.StaryEvoTools/Editor/MarkAdressable/PackVideo.cs.meta new file mode 100644 index 0000000..b55d57e --- /dev/null +++ b/Assets/00.StaryEvoTools/Editor/MarkAdressable/PackVideo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bf8a560e6a06431d9f65c4503460451b +timeCreated: 1767671600 \ No newline at end of file diff --git a/Assets/00.StaryEvoTools/Editor/MarkAdressable/ResFileGet.cs b/Assets/00.StaryEvoTools/Editor/MarkAdressable/ResFileGet.cs index af07996..0f02d18 100644 --- a/Assets/00.StaryEvoTools/Editor/MarkAdressable/ResFileGet.cs +++ b/Assets/00.StaryEvoTools/Editor/MarkAdressable/ResFileGet.cs @@ -11,6 +11,8 @@ namespace Stary.Evo.Editor { public static class ResFileGet { + private static Dictionary _addressDic = new Dictionary(); + public static void CreateContent(StringBuilder variable, string path, string tab) { tab += "\t\t"; @@ -43,9 +45,11 @@ namespace Stary.Evo.Editor /// /// 类名 /// 字符串事件 - public static void CreateClass(string className, string package, string outputPath, + public static void CreateClass(Dictionary addressDic, string className, string package, + string outputPath, Action content = null) { + ResFileGet._addressDic = addressDic; string tdClassName = className; StringBuilder variable = new StringBuilder(); //variable.Append("using System;\n"); @@ -67,6 +71,7 @@ namespace Stary.Evo.Editor { File.Delete(outputPath); } + FileHelper.WriteFile(outputPath, variable.ToString()); AssetDatabase.SaveAssets(); @@ -93,28 +98,15 @@ namespace Stary.Evo.Editor /// private static void CreateFile(StringBuilder variable, FileInfo fileName, string tab) { - var fullname =System.IO.Path.GetExtension(fileName.FullName); - if (fullname != ".meta"&&fullname!=".hint" ) + var fullname = System.IO.Path.GetExtension(fileName.FullName); + if (fullname != ".meta" && fullname != ".hint") { Debug.Log("FileInfo:" + fileName.Name); string[] fileSplit = fileName.FullName.Split(new string[] { "AddressableRes\\" }, StringSplitOptions.RemoveEmptyEntries); string[] resSplit = fileSplit[fileSplit.Length - 1].Split('\\'); - // fileSplit = fileName.FullName.Split(new string[] { $"AddressableRes\\{resSplit[0]}\\" }, - // StringSplitOptions.RemoveEmptyEntries); - // string filepath = fileSplit[fileSplit.Length - 1].Replace("\\", "/"); - // // 删除文件后缀 - // filepath = Path.Combine( - // Path.GetDirectoryName(filepath), - // Path.GetFileNameWithoutExtension(filepath) - // ).Replace("\\", "/"); - // Debug.Log(filepath); string filepath; - if (MarkAdressable.addressDic.ContainsKey(fileName.FullName)) - { - filepath = MarkAdressable.addressDic[fileName.FullName]; - } - else + if (!_addressDic.TryGetValue(fileName.FullName, out filepath)) { Debug.LogError("未找到地址,请检查资源自动化标记逻辑:" + fileName.FullName); filepath = ""; diff --git a/Assets/00.StaryEvoTools/Editor/MarkAdressable/VideoUncompressedParameters.cs b/Assets/00.StaryEvoTools/Editor/MarkAdressable/VideoUncompressedParameters.cs new file mode 100644 index 0000000..e623833 --- /dev/null +++ b/Assets/00.StaryEvoTools/Editor/MarkAdressable/VideoUncompressedParameters.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEditor.Build.Content; +using UnityEditor.Build.Pipeline; + +namespace Stary.Evo.Editor +{ + + + public class VideoUncompressedParameters : BundleBuildParameters + { + // 需要保持无压缩的 bundle 名列表 + public HashSet UncompressedBundles { get; set; } + + public VideoUncompressedParameters(BuildTarget target, + BuildTargetGroup group, + string outputFolder) : base(target, group, outputFolder) + { + UncompressedBundles = new HashSet(); + } + + // 关键:按 bundle 名返回压缩方式 + public override UnityEngine.BuildCompression GetCompressionForIdentifier(string identifier) + { + if (UncompressedBundles.Contains(identifier)) + return UnityEngine.BuildCompression.Uncompressed; // 无压缩 + return base.GetCompressionForIdentifier(identifier); // 其余走默认 + } + } +} \ No newline at end of file diff --git a/Assets/00.StaryEvoTools/Editor/MarkAdressable/VideoUncompressedParameters.cs.meta b/Assets/00.StaryEvoTools/Editor/MarkAdressable/VideoUncompressedParameters.cs.meta new file mode 100644 index 0000000..495ad58 --- /dev/null +++ b/Assets/00.StaryEvoTools/Editor/MarkAdressable/VideoUncompressedParameters.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9bb39b8978f643919dc49fac6f74504b +timeCreated: 1767672764 \ No newline at end of file diff --git a/Assets/00.StaryEvoTools/Editor/com.staryevo.tools.editor.asmdef b/Assets/00.StaryEvoTools/Editor/com.staryevo.tools.editor.asmdef index 7d902a3..a1ee771 100644 --- a/Assets/00.StaryEvoTools/Editor/com.staryevo.tools.editor.asmdef +++ b/Assets/00.StaryEvoTools/Editor/com.staryevo.tools.editor.asmdef @@ -15,7 +15,8 @@ "DOTween.Modules", "ImmersalSDK", "Informationsave.runtime", - "UniTask" + "UniTask", + "Unity.ScriptableBuildPipeline.Editor" ], "includePlatforms": [ "Editor"