diff --git a/UnityProject/Assets/AssetArt/Atlas/UIRaw_Atlas_Common.spriteatlasv2 b/UnityProject/Assets/AssetArt/Atlas/UIRaw_Atlas_Common.spriteatlas similarity index 54% rename from UnityProject/Assets/AssetArt/Atlas/UIRaw_Atlas_Common.spriteatlasv2 rename to UnityProject/Assets/AssetArt/Atlas/UIRaw_Atlas_Common.spriteatlas index c57c1a08..74fa3b91 100644 --- a/UnityProject/Assets/AssetArt/Atlas/UIRaw_Atlas_Common.spriteatlasv2 +++ b/UnityProject/Assets/AssetArt/Atlas/UIRaw_Atlas_Common.spriteatlas @@ -1,14 +1,13 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!612988286 &4096168566840163508 -SpriteAtlasAsset: +--- !u!687078895 &4343727234628468602 +SpriteAtlas: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: UIRaw_Atlas_Common - m_MasterAtlas: {fileID: 0} - m_ImporterData: + m_EditorData: serializedVersion: 2 textureSettings: serializedVersion: 2 @@ -34,6 +33,30 @@ SpriteAtlasAsset: m_Overridden: 1 m_AndroidETC2FallbackOverride: 0 m_ForceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + m_BuildTarget: Android + m_MaxTextureSize: 2048 + m_ResizeAlgorithm: 0 + m_TextureFormat: 50 + m_TextureCompression: 1 + m_CompressionQuality: 100 + m_CrunchedCompression: 0 + m_AllowsAlphaSplitting: 0 + m_Overridden: 1 + m_AndroidETC2FallbackOverride: 0 + m_ForceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + m_BuildTarget: WebGL + m_MaxTextureSize: 2048 + m_ResizeAlgorithm: 0 + m_TextureFormat: 50 + m_TextureCompression: 1 + m_CompressionQuality: 50 + m_CrunchedCompression: 0 + m_AllowsAlphaSplitting: 0 + m_Overridden: 1 + m_AndroidETC2FallbackOverride: 0 + m_ForceMaximumCompressionQuality_BC6H_BC7: 0 packingSettings: serializedVersion: 2 padding: 2 @@ -50,6 +73,19 @@ SpriteAtlasAsset: - {fileID: 21300000, guid: d623a2b7e069a4c4592d3da48f476189, type: 3} - {fileID: 21300000, guid: 57e4117f4cd6ae54284898652e70d553, type: 3} bindAsDefault: 1 - isAtlasV2: 1 + isAtlasV2: 0 cachedData: {fileID: 0} + m_MasterAtlas: {fileID: 0} + m_PackedSprites: + - {fileID: 21300000, guid: 2761fc23b4aa7e34187ac5ffbc3fad9b, type: 3} + - {fileID: 21300000, guid: f9a06e163014f4f46b14f4499d3e7240, type: 3} + - {fileID: 21300000, guid: d623a2b7e069a4c4592d3da48f476189, type: 3} + - {fileID: 21300000, guid: 57e4117f4cd6ae54284898652e70d553, type: 3} + m_PackedSpriteNamesToIndex: + - red_button + - blue_button + - white_background + - white_button + m_RenderDataMap: {} + m_Tag: UIRaw_Atlas_Common m_IsVariant: 0 diff --git a/UnityProject/Assets/AssetArt/Atlas/UIRaw_Atlas_Common.spriteatlas.meta b/UnityProject/Assets/AssetArt/Atlas/UIRaw_Atlas_Common.spriteatlas.meta new file mode 100644 index 00000000..e3de747d --- /dev/null +++ b/UnityProject/Assets/AssetArt/Atlas/UIRaw_Atlas_Common.spriteatlas.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c91b064c2cd7a34448ae0d6d7ee58e7f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 4343727234628468602 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Assets/AssetArt/Atlas/UIRaw_Atlas_Common.spriteatlasv2.meta b/UnityProject/Assets/AssetArt/Atlas/UIRaw_Atlas_Common.spriteatlasv2.meta deleted file mode 100644 index b02baad3..00000000 --- a/UnityProject/Assets/AssetArt/Atlas/UIRaw_Atlas_Common.spriteatlasv2.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: b9eaf6bdacd0683468b1dd697e3d2bce -SpriteAtlasImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UnityProject/Assets/TEngine/Editor/Postprocessor/SpritePostprocessor.cs b/UnityProject/Assets/TEngine/Editor/Postprocessor/SpritePostprocessor.cs index 6a425088..17526c43 100644 --- a/UnityProject/Assets/TEngine/Editor/Postprocessor/SpritePostprocessor.cs +++ b/UnityProject/Assets/TEngine/Editor/Postprocessor/SpritePostprocessor.cs @@ -7,521 +7,542 @@ using UnityEngine; using UnityEngine.U2D; using Object = UnityEngine.Object; -/// -/// 图集导入管线。 -/// -public class SpritePostprocessor : AssetPostprocessor +namespace GameFramework.Editor { - static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) - { - foreach (var s in importedAssets) - { - EditorSpriteSaveInfo.OnImportSprite(s); - } - - foreach (var s in deletedAssets) - { - EditorSpriteSaveInfo.OnDeleteSprite(s); - } - - foreach (var s in movedFromAssetPaths) - { - EditorSpriteSaveInfo.OnDeleteSprite(s); - } - - foreach (var s in movedAssets) - { - EditorSpriteSaveInfo.OnImportSprite(s); - } - } -} - -public static class EditorSpriteSaveInfo -{ - private const string NormalAtlasDir = "Assets/AssetArt/Atlas"; - private const string UISpritePath = "Assets/AssetRaw/UIRaw"; - private const string UIAtlasPath = "Assets/AssetRaw/UIRaw/Atlas"; - private const string UIRawPath = "Assets/AssetRaw/UIRaw/UIRaw"; - private static List m_dirtyAtlasList = new List(); - private static Dictionary> m_allASprites = new Dictionary>(); - private static Dictionary m_uiAtlasMap = new Dictionary(); - private static bool m_inited = false; - private static bool m_dirty = false; - - public static void Init() - { - if (m_inited) - { - return; - } - - EditorApplication.update += CheckDirty; - - //读取所有图集信息 - string[] findAssets = AssetDatabase.FindAssets("t:SpriteAtlas", new[] { NormalAtlasDir }); - foreach (var findAsset in findAssets) - { - var path = AssetDatabase.GUIDToAssetPath(findAsset); - SpriteAtlas sa = AssetDatabase.LoadAssetAtPath(path, typeof(SpriteAtlas)) as SpriteAtlas; - if (sa == null) - { - Debug.LogError($"加载图集数据{path}失败"); - continue; - } - - string atlasName = Path.GetFileNameWithoutExtension(path); - var objects = sa.GetPackables(); - foreach (var o in objects) - { - if (!m_allASprites.TryGetValue(atlasName, out var list)) - { - list = new List(); - m_allASprites.Add(atlasName, list); - } - list.Add(AssetDatabase.GetAssetPath(o)); - } - } - - m_inited = true; - } - - public static void CheckDirty() - { - if (m_dirty) - { - m_dirty = false; - - AssetDatabase.Refresh(); - float lastProgress = -1; - for (int i = 0; i < m_dirtyAtlasList.Count; i++) - { - string atlasName = m_dirtyAtlasList[i]; - Debug.Log("更新图集 : " + atlasName); - var curProgress = (float)i / m_dirtyAtlasList.Count; - if (curProgress > lastProgress + 0.01f) - { - lastProgress = curProgress; - var progressText = $"当前进度:{i}/{m_dirtyAtlasList.Count} {atlasName}"; - bool cancel = EditorUtility.DisplayCancelableProgressBar("刷新图集" + atlasName, progressText, curProgress); - if (cancel) - { - break; - } - } - - bool isUI = atlasName.StartsWith("UIRaw"); - SaveAtlas(atlasName, isUI); - } - - EditorUtility.ClearProgressBar(); - AssetDatabase.SaveAssets(); - AssetDatabase.Refresh(); - m_dirtyAtlasList.Clear(); - } - } - - public static void OnImportSprite(string assetPath) - { - if (!assetPath.StartsWith(UISpritePath)) - { - return; - } - - TextureImporter ti = AssetImporter.GetAtPath(assetPath) as TextureImporter; - - if (ti != null) - { - var modify = false; - - if (assetPath.StartsWith(UISpritePath)) - { - if (ti.textureType != TextureImporterType.Sprite) - { - ti.textureType = TextureImporterType.Sprite; - modify = true; - } - - if (!string.IsNullOrEmpty(ti.spritePackingTag)) - { - ti.spritePackingTag = string.Empty; - modify = true; - } - - var setting = new TextureImporterSettings(); - ti.ReadTextureSettings(setting); - if (setting.spriteGenerateFallbackPhysicsShape) - { - setting.spriteGenerateFallbackPhysicsShape = false; - ti.SetTextureSettings(setting); - modify = true; - } - - if (IsKeepRawImage(assetPath)) - { - //调整android格式 - var andPlatformSettings = ti.GetPlatformTextureSettings("Android"); - if (!andPlatformSettings.overridden) - { - andPlatformSettings.overridden = true; - modify = true; - } - - if (andPlatformSettings.format != TextureImporterFormat.ASTC_6x6) - { - andPlatformSettings.format = TextureImporterFormat.ASTC_6x6; - ti.SetPlatformTextureSettings(andPlatformSettings); - modify = true; - } - - //调整ios格式 - var iosPlatformSettings = ti.GetPlatformTextureSettings("iPhone"); - if (!iosPlatformSettings.overridden) - { - iosPlatformSettings.overridden = true; - modify = true; - } - - if (iosPlatformSettings.format != TextureImporterFormat.ASTC_5x5) - { - iosPlatformSettings.format = TextureImporterFormat.ASTC_5x5; - iosPlatformSettings.compressionQuality = 50; - ti.SetPlatformTextureSettings(iosPlatformSettings); - modify = true; - } - } - } - - if (modify) - { - ti.SaveAndReimport(); - } - - if (ti.textureType == TextureImporterType.Sprite) - { - OnProcessSprite(assetPath); - } - } - } - /// - /// 是否保持散图(不打图集) + /// 图集导入管线。 /// - /// - /// - public static bool IsKeepRawImage(string dirPath) + public class SpritePostprocessor : AssetPostprocessor { - return dirPath.Contains("UIRaw/Raw/") || dirPath.Contains("UIRaw_Raw_"); - } - - public static string GetSpritePath(string assetPath) - { - string path = assetPath.Substring(0, assetPath.LastIndexOf(".")); - path = path.Replace("Assets/AssetRaw/", ""); - return path; - } - - /// - /// 根据文件路径,返回图集名称 - /// - /// - /// - public static string GetPackageTag(string fullName) - { - fullName = fullName.Replace("\\", "/"); - int idx = fullName.LastIndexOf("UIRaw", StringComparison.Ordinal); - if (idx == -1) + static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { - return ""; - } - - if (IsKeepRawImage(fullName)) - { - return ""; - } - - var atlasPath = fullName.Substring(idx); - string str = atlasPath; - str = str.Substring(0, str.LastIndexOf("/", StringComparison.Ordinal)).Replace("/", "_"); - - return str; - } - - public static void OnProcessSprite(string assetPath) - { - if (!assetPath.StartsWith("Assets")) - { - return; - } - - if (assetPath.StartsWith("Assets/UIRaw_Delete")) - { - return; - } - - Init(); - - var spriteName = Path.GetFileNameWithoutExtension(assetPath); - var spritePath = GetSpritePath(assetPath); - if (!m_uiAtlasMap.TryGetValue(spriteName, out string oldAssetPath) || spritePath == oldAssetPath) - { - m_uiAtlasMap[spriteName] = spritePath; - m_dirty = true; - } - else - { - Debug.LogError($"有重名的图片:{spriteName}\n旧图集:{oldAssetPath}\n新图集:{spritePath} "); - m_uiAtlasMap[spriteName] = spritePath; - m_dirty = true; - } - - string atlasName = GetPackageTag(assetPath); - if (string.IsNullOrEmpty(atlasName)) - { - bool keepRaw = IsKeepRawImage(assetPath); - if (!keepRaw) + foreach (var s in importedAssets) { - Debug.LogError($"empty packingTag of asset :{assetPath} !!!"); + EditorSpriteSaveInfo.OnImportSprite(s); } - return; - } - else - { - List ret; - if (!m_allASprites.TryGetValue(atlasName, out ret)) + foreach (var s in deletedAssets) { - ret = new List(); - m_allASprites.Add(atlasName, ret); + EditorSpriteSaveInfo.OnDeleteSprite(s); } - if (!ret.Contains(assetPath)) + foreach (var s in movedFromAssetPaths) { - ret.Add(assetPath); - m_dirty = true; - if (!m_dirtyAtlasList.Contains(atlasName)) + EditorSpriteSaveInfo.OnDeleteSprite(s); + } + + foreach (var s in movedAssets) + { + EditorSpriteSaveInfo.OnImportSprite(s); + } + } + } + + public static class EditorSpriteSaveInfo + { + private const string NormalAtlasDir = "Assets/AssetArt/Atlas"; + private const string UISpritePath = "Assets/AssetRaw/UIRaw"; + private const string UIAtlasPath = "Assets/AssetRaw/UIRaw/Atlas"; + private static readonly List _dirtyAtlasList = new List(); + private static readonly Dictionary> _allASprites = new Dictionary>(); + private static readonly Dictionary _uiAtlasMap = new Dictionary(); + private static bool _isInit = false; + private static bool m_dirty = false; + + public static void Init() + { + if (_isInit) + { + return; + } + + EditorApplication.update += CheckDirty; + + //读取所有图集信息 + string[] findAssets = AssetDatabase.FindAssets("t:SpriteAtlas", new[] { NormalAtlasDir }); + foreach (var findAsset in findAssets) + { + var path = AssetDatabase.GUIDToAssetPath(findAsset); + SpriteAtlas sa = AssetDatabase.LoadAssetAtPath(path, typeof(SpriteAtlas)) as SpriteAtlas; + if (sa == null) { - m_dirtyAtlasList.Add(atlasName); + Debug.LogError($"加载图集数据{path}失败"); + continue; } - } - } - } - public static void OnDeleteSprite(string assetPath) - { - if (assetPath.StartsWith("Assets/UIRaw_Delete")) - { - return; - } - - if (!assetPath.StartsWith(UISpritePath)) - { - return; - } - - Init(); - string atlasName = GetPackageTag(assetPath); - if (!m_allASprites.TryGetValue(atlasName, out var ret)) - { - return; - } - - //改成文件名的匹配 - if (!ret.Exists(s => Path.GetFileName(s) == Path.GetFileName(assetPath))) - { - return; - } - - if (assetPath.StartsWith(UISpritePath)) - { - var spriteName = Path.GetFileNameWithoutExtension(assetPath); - if (m_uiAtlasMap.ContainsKey(spriteName)) - { - m_uiAtlasMap.Remove(spriteName); - m_dirty = true; - } - } - - ret.Remove(assetPath); - m_dirty = true; - if (!m_dirtyAtlasList.Contains(atlasName)) - { - m_dirtyAtlasList.Add(atlasName); - } - } - - #region 更新图集 - - public static void SaveAtlas(string atlasName, bool isUI) - { - List spriteList = new List(); - if (m_allASprites.TryGetValue(atlasName, out var list)) - { - list.Sort(StringComparer.Ordinal); - - foreach (var s in list) - { - var sprite = AssetDatabase.LoadAssetAtPath(s); - if (sprite != null) + string atlasName = Path.GetFileNameWithoutExtension(path); + var objects = sa.GetPackables(); + foreach (var o in objects) { - spriteList.Add(sprite); - } - } - } - - var pathv2 = $"{NormalAtlasDir}/{atlasName}.spriteatlasv2"; - var path = $"{NormalAtlasDir}/{atlasName}.asset"; - - if (spriteList.Count == 0) - { - if (File.Exists(path)) - { - AssetDatabase.DeleteAsset(path); - } - if (File.Exists(pathv2)) - { - AssetDatabase.DeleteAsset(pathv2); - } - - return; - } - - var atlas = new SpriteAtlasAsset(); - var setting = new SpriteAtlasPackingSettings - { - blockOffset = 1, - padding = 2, - enableRotation = true - }; - - bool isOpaque = atlasName.Contains("Opaque"); - - var textureSetting = new SpriteAtlasTextureSettings - { - generateMipMaps = false, - sRGB = true, - filterMode = FilterMode.Bilinear - }; - atlas.SetTextureSettings(textureSetting); - - var iphonePlatformSetting = atlas.GetPlatformSettings("iPhone"); - if (!iphonePlatformSetting.overridden) - { - iphonePlatformSetting.overridden = true; - iphonePlatformSetting.format = isOpaque ? TextureImporterFormat.ASTC_5x5 : TextureImporterFormat.ASTC_5x5; - iphonePlatformSetting.compressionQuality = 100; - atlas.SetPlatformSettings(iphonePlatformSetting); - } - - var androidPlatformSetting = atlas.GetPlatformSettings("Android"); - if (isOpaque && !androidPlatformSetting.overridden) - { - androidPlatformSetting.overridden = true; - androidPlatformSetting.format = TextureImporterFormat.ETC_RGB4; - androidPlatformSetting.compressionQuality = 100; - atlas.SetPlatformSettings(androidPlatformSetting); - } - - atlas.SetPackingSettings(setting); - atlas.Add(spriteList.ToArray()); - - AssetDatabase.CreateAsset(atlas, path); - if (File.Exists(pathv2)) - { - AssetDatabase.DeleteAsset(pathv2); - } - File.Move(path, pathv2); - AssetDatabase.Refresh(); - } - - #endregion - - #region 重新生成图集 - - private static Dictionary> m_tempAllASprites = new Dictionary>(); - - [MenuItem("TEngine/图集/重新生成UI图集")] - static void ForceGenAtlas() - { - Init(); - List needSaveAtlas = new List(); - m_tempAllASprites.Clear(); - m_allASprites.Clear(); - var findAssets = AssetDatabase.FindAssets("t:sprite", new[] { UIAtlasPath }); - foreach (var findAsset in findAssets) - { - var path = AssetDatabase.GUIDToAssetPath(findAsset); - var atlasName = GetPackageTag(path); - if (!m_tempAllASprites.TryGetValue(atlasName, out var spriteList)) - { - spriteList = new List(); - m_tempAllASprites[atlasName] = spriteList; - } - - if (!spriteList.Contains(path)) - { - spriteList.Add(path); - } - } - - //有变化的才刷 - var iter = m_tempAllASprites.GetEnumerator(); - while (iter.MoveNext()) - { - bool needSave = false; - var atlasName = iter.Current.Key; - var newSpritesList = iter.Current.Value; - - if (m_allASprites.TryGetValue(atlasName, out var existSprites)) - { - if (existSprites.Count != newSpritesList.Count) - { - needSave = true; - existSprites.Clear(); - existSprites.AddRange(newSpritesList); - } - else - { - for (int i = 0; i < newSpritesList.Count; i++) + if (!_allASprites.TryGetValue(atlasName, out var list)) { - if (!existSprites.Contains(newSpritesList[i])) + list = new List(); + _allASprites.Add(atlasName, list); + } + + list.Add(AssetDatabase.GetAssetPath(o)); + } + } + + _isInit = true; + } + + public static void CheckDirty() + { + if (m_dirty) + { + m_dirty = false; + + AssetDatabase.Refresh(); + float lastProgress = -1; + for (int i = 0; i < _dirtyAtlasList.Count; i++) + { + string atlasName = _dirtyAtlasList[i]; + Debug.Log("更新图集 : " + atlasName); + var curProgress = (float)i / _dirtyAtlasList.Count; + if (curProgress > lastProgress + 0.01f) + { + lastProgress = curProgress; + var progressText = $"当前进度:{i}/{_dirtyAtlasList.Count} {atlasName}"; + bool cancel = EditorUtility.DisplayCancelableProgressBar("刷新图集" + atlasName, progressText, curProgress); + if (cancel) { - needSave = true; break; } } - if (needSave) + bool isUI = atlasName.StartsWith("UIRaw"); + SaveAtlas(atlasName, isUI); + } + + EditorUtility.ClearProgressBar(); + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + _dirtyAtlasList.Clear(); + } + } + + public static void OnImportSprite(string assetPath) + { + if (!assetPath.StartsWith(UISpritePath)) + { + return; + } + + TextureImporter ti = AssetImporter.GetAtPath(assetPath) as TextureImporter; + + if (ti != null) + { + var modify = false; + + if (assetPath.StartsWith(UISpritePath)) + { + if (ti.textureType != TextureImporterType.Sprite) { - existSprites.Clear(); - existSprites.AddRange(newSpritesList); + ti.textureType = TextureImporterType.Sprite; + modify = true; + } + + if (!string.IsNullOrEmpty(ti.spritePackingTag)) + { + ti.spritePackingTag = string.Empty; + modify = true; + } + + var setting = new TextureImporterSettings(); + ti.ReadTextureSettings(setting); + if (setting.spriteGenerateFallbackPhysicsShape) + { + setting.spriteGenerateFallbackPhysicsShape = false; + ti.SetTextureSettings(setting); + modify = true; + } + + if (IsKeepRawImage(assetPath)) + { + //调整android格式 + var andPlatformSettings = ti.GetPlatformTextureSettings("Android"); + if (!andPlatformSettings.overridden) + { + andPlatformSettings.overridden = true; + modify = true; + } + + if (andPlatformSettings.format != TextureImporterFormat.ASTC_6x6) + { + andPlatformSettings.format = TextureImporterFormat.ASTC_6x6; + andPlatformSettings.compressionQuality = 50; + ti.SetPlatformTextureSettings(andPlatformSettings); + modify = true; + } + + //调整ios格式 + var iosPlatformSettings = ti.GetPlatformTextureSettings("iPhone"); + if (!iosPlatformSettings.overridden) + { + iosPlatformSettings.overridden = true; + modify = true; + } + + if (iosPlatformSettings.format != TextureImporterFormat.ASTC_5x5) + { + iosPlatformSettings.format = TextureImporterFormat.ASTC_5x5; + iosPlatformSettings.compressionQuality = 50; + ti.SetPlatformTextureSettings(iosPlatformSettings); + modify = true; + } + + //调整WebGL格式 + var webglSettings = ti.GetPlatformTextureSettings("WebGL"); + if (!webglSettings.overridden) + { + webglSettings.overridden = true; + modify = true; + } + + if (webglSettings.format != TextureImporterFormat.ASTC_6x6) + { + webglSettings.format = TextureImporterFormat.ASTC_6x6; + webglSettings.compressionQuality = 50; + ti.SetPlatformTextureSettings(webglSettings); + modify = true; + } } } + + if (modify) + { + ti.SaveAndReimport(); + } + + if (ti.textureType == TextureImporterType.Sprite) + { + OnProcessSprite(assetPath); + } + } + } + + /// + /// 是否保持散图(不打图集) + /// + /// + /// + public static bool IsKeepRawImage(string dirPath) + { + return dirPath.Contains("UIRaw/Raw/") || dirPath.Contains("UIRaw_Raw_"); + } + + public static string GetSpritePath(string assetPath) + { + string path = assetPath.Substring(0, assetPath.LastIndexOf(".", StringComparison.Ordinal)); + path = path.Replace("Assets/AssetRaw/", ""); + return path; + } + + /// + /// 根据文件路径,返回图集名称 + /// + /// + /// + public static string GetPackageTag(string fullName) + { + fullName = fullName.Replace("\\", "/"); + int idx = fullName.LastIndexOf("UIRaw", StringComparison.Ordinal); + if (idx == -1) + { + return ""; + } + + if (IsKeepRawImage(fullName)) + { + return ""; + } + + var atlasPath = fullName.Substring(idx); + string str = atlasPath; + str = str.Substring(0, str.LastIndexOf("/", StringComparison.Ordinal)).Replace("/", "_"); + + return str; + } + + public static void OnProcessSprite(string assetPath) + { + if (!assetPath.StartsWith("Assets")) + { + return; + } + + if (assetPath.StartsWith("Assets/UIRaw_Delete")) + { + return; + } + + Init(); + + var spriteName = Path.GetFileNameWithoutExtension(assetPath); + var spritePath = GetSpritePath(assetPath); + if (!_uiAtlasMap.TryGetValue(spriteName, out string oldAssetPath) || spritePath == oldAssetPath) + { + _uiAtlasMap[spriteName] = spritePath; + m_dirty = true; } else { - needSave = true; - m_allASprites.Add(atlasName, new List(newSpritesList)); + Debug.LogError($"有重名的图片:{spriteName}\n旧图集:{oldAssetPath}\n新图集:{spritePath} "); + _uiAtlasMap[spriteName] = spritePath; + m_dirty = true; } - if (needSave && !needSaveAtlas.Contains(atlasName)) + string atlasName = GetPackageTag(assetPath); + if (string.IsNullOrEmpty(atlasName)) { - needSaveAtlas.Add(atlasName); + bool keepRaw = IsKeepRawImage(assetPath); + if (!keepRaw) + { + Debug.LogError($"empty packingTag of asset :{assetPath} !!!"); + } + + return; + } + else + { + List ret; + if (!_allASprites.TryGetValue(atlasName, out ret)) + { + ret = new List(); + _allASprites.Add(atlasName, ret); + } + + if (!ret.Contains(assetPath)) + { + ret.Add(assetPath); + m_dirty = true; + if (!_dirtyAtlasList.Contains(atlasName)) + { + _dirtyAtlasList.Add(atlasName); + } + } } } - iter.Dispose(); - foreach (var atlas in needSaveAtlas) + public static void OnDeleteSprite(string assetPath) { - Debug.LogFormat("Gen atlas:{0}", atlas); - SaveAtlas(atlas, true); + if (assetPath.StartsWith("Assets/UIRaw_Delete")) + { + return; + } + + if (!assetPath.StartsWith(UISpritePath)) + { + return; + } + + Init(); + string atlasName = GetPackageTag(assetPath); + if (!_allASprites.TryGetValue(atlasName, out var ret)) + { + return; + } + + //改成文件名的匹配 + if (!ret.Exists(s => Path.GetFileName(s) == Path.GetFileName(assetPath))) + { + return; + } + + if (assetPath.StartsWith(UISpritePath)) + { + var spriteName = Path.GetFileNameWithoutExtension(assetPath); + if (_uiAtlasMap.ContainsKey(spriteName)) + { + _uiAtlasMap.Remove(spriteName); + m_dirty = true; + } + } + + ret.Remove(assetPath); + m_dirty = true; + if (!_dirtyAtlasList.Contains(atlasName)) + { + _dirtyAtlasList.Add(atlasName); + } } - AssetDatabase.SaveAssets(); - AssetDatabase.Refresh(); + #region 更新图集 - SpriteAtlasUtility.PackAllAtlases(EditorUserBuildSettings.activeBuildTarget); - Debug.Log("Gen end"); + public static void SaveAtlas(string atlasName, bool isUI) + { + List spriteList = new List(); + if (_allASprites.TryGetValue(atlasName, out var list)) + { + list.Sort(StringComparer.Ordinal); + + foreach (var s in list) + { + var sprite = AssetDatabase.LoadAssetAtPath(s); + if (sprite != null) + { + spriteList.Add(sprite); + } + } + } + + var path = $"{NormalAtlasDir}/{atlasName}.spriteatlas"; + + if (spriteList.Count == 0) + { + if (File.Exists(path)) + { + AssetDatabase.DeleteAsset(path); + } + + return; + } + + var atlas = new SpriteAtlas(); + // var atlas = new SpriteAtlasAsset(); + var setting = new SpriteAtlasPackingSettings + { + blockOffset = 1, + padding = 2, + enableRotation = true + }; + + bool isOpaque = atlasName.Contains("Opaque"); + + var textureSetting = new SpriteAtlasTextureSettings + { + generateMipMaps = false, + sRGB = true, + filterMode = FilterMode.Bilinear + }; + atlas.SetTextureSettings(textureSetting); + + var iphonePlatformSetting = atlas.GetPlatformSettings("iPhone"); + if (!iphonePlatformSetting.overridden) + { + iphonePlatformSetting.overridden = true; + iphonePlatformSetting.format = TextureImporterFormat.ASTC_5x5; + iphonePlatformSetting.compressionQuality = 100; + atlas.SetPlatformSettings(iphonePlatformSetting); + } + + var androidPlatformSetting = atlas.GetPlatformSettings("Android"); + if (!androidPlatformSetting.overridden) + { + androidPlatformSetting.overridden = true; + androidPlatformSetting.format = TextureImporterFormat.ASTC_6x6; + androidPlatformSetting.compressionQuality = 100; + atlas.SetPlatformSettings(androidPlatformSetting); + } + + var webglSettings = atlas.GetPlatformSettings("WebGL"); + if (!webglSettings.overridden) + { + webglSettings.overridden = true; + webglSettings.format = TextureImporterFormat.ASTC_6x6; + webglSettings.compressionQuality = 50; + atlas.SetPlatformSettings(webglSettings); + } + + atlas.SetPackingSettings(setting); + atlas.Add(spriteList.ToArray()); + + AssetDatabase.CreateAsset(atlas, path); + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + } + + #endregion + + #region 重新生成图集 + + private static readonly Dictionary> m_tempAllASprites = new Dictionary>(); + + [MenuItem("TEngine/Atlas/重新生成UI图集", false, 90)] + static void ForceGenAtlas() + { + Init(); + List needSaveAtlas = new List(); + m_tempAllASprites.Clear(); + _allASprites.Clear(); + var findAssets = AssetDatabase.FindAssets("t:sprite", new[] { UIAtlasPath }); + foreach (var findAsset in findAssets) + { + var path = AssetDatabase.GUIDToAssetPath(findAsset); + var atlasName = GetPackageTag(path); + if (!m_tempAllASprites.TryGetValue(atlasName, out var spriteList)) + { + spriteList = new List(); + m_tempAllASprites[atlasName] = spriteList; + } + + if (!spriteList.Contains(path)) + { + spriteList.Add(path); + } + } + + //有变化的才刷 + var iter = m_tempAllASprites.GetEnumerator(); + while (iter.MoveNext()) + { + bool needSave = false; + var atlasName = iter.Current.Key; + var newSpritesList = iter.Current.Value; + + if (_allASprites.TryGetValue(atlasName, out var existSprites)) + { + if (existSprites.Count != newSpritesList.Count) + { + needSave = true; + existSprites.Clear(); + existSprites.AddRange(newSpritesList); + } + else + { + for (int i = 0; i < newSpritesList.Count; i++) + { + if (!existSprites.Contains(newSpritesList[i])) + { + needSave = true; + break; + } + } + + if (needSave) + { + existSprites.Clear(); + existSprites.AddRange(newSpritesList); + } + } + } + else + { + needSave = true; + _allASprites.Add(atlasName, new List(newSpritesList)); + } + + if (needSave && !needSaveAtlas.Contains(atlasName)) + { + needSaveAtlas.Add(atlasName); + } + } + + iter.Dispose(); + foreach (var atlas in needSaveAtlas) + { + Debug.LogFormat("Gen atlas:{0}", atlas); + SaveAtlas(atlas, true); + } + + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + + SpriteAtlasUtility.PackAllAtlases(EditorUserBuildSettings.activeBuildTarget); + Debug.Log("Gen end"); + } + + #endregion } - - #endregion } \ No newline at end of file