This commit is contained in:
zhangzheng
2026-01-06 16:22:45 +08:00
parent f055116d4d
commit 8ef57d9079
10 changed files with 127 additions and 152 deletions

View File

@@ -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<OneKeyBuildEntity> 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<DomainConfig>(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<string, string> addressDic = new Dictionary<string, string>();
private static Dictionary<string, string> addressDic = new Dictionary<string, string>();
public static Dictionary<string, AssetBundleCollectorGroup> collectorGroupDic =
private static Dictionary<string, AssetBundleCollectorGroup> _collectorGroupDic =
new Dictionary<string, AssetBundleCollectorGroup>();
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<ShaderVariantCollection>(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;
}
}

View File

@@ -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; // 关键:标记为原生文件
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: bf8a560e6a06431d9f65c4503460451b
timeCreated: 1767671600

View File

@@ -11,6 +11,8 @@ namespace Stary.Evo.Editor
{
public static class ResFileGet
{
private static Dictionary<string, string> _addressDic = new Dictionary<string, string>();
public static void CreateContent(StringBuilder variable, string path, string tab)
{
tab += "\t\t";
@@ -43,9 +45,11 @@ namespace Stary.Evo.Editor
/// </summary>
/// <param name="className">类名</param>
/// <param name="content">字符串事件</param>
public static void CreateClass(string className, string package, string outputPath,
public static void CreateClass(Dictionary<string, string> addressDic, string className, string package,
string outputPath,
Action<StringBuilder> 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
/// <param name="fileName"></param>
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 = "";

View File

@@ -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<string> UncompressedBundles { get; set; }
public VideoUncompressedParameters(BuildTarget target,
BuildTargetGroup group,
string outputFolder) : base(target, group, outputFolder)
{
UncompressedBundles = new HashSet<string>();
}
// 关键:按 bundle 名返回压缩方式
public override UnityEngine.BuildCompression GetCompressionForIdentifier(string identifier)
{
if (UncompressedBundles.Contains(identifier))
return UnityEngine.BuildCompression.Uncompressed; // 无压缩
return base.GetCompressionForIdentifier(identifier); // 其余走默认
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 9bb39b8978f643919dc49fac6f74504b
timeCreated: 1767672764