修正SpritePostprocessor处理Atlas的override

This commit is contained in:
ALEXTANG
2024-04-25 15:43:44 +08:00
parent dff043e075
commit 4f8c1cdfdd
4 changed files with 548 additions and 490 deletions

View File

@@ -1,14 +1,13 @@
%YAML 1.1 %YAML 1.1
%TAG !u! tag:unity3d.com,2011: %TAG !u! tag:unity3d.com,2011:
--- !u!612988286 &4096168566840163508 --- !u!687078895 &4343727234628468602
SpriteAtlasAsset: SpriteAtlas:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_Name: UIRaw_Atlas_Common m_Name: UIRaw_Atlas_Common
m_MasterAtlas: {fileID: 0} m_EditorData:
m_ImporterData:
serializedVersion: 2 serializedVersion: 2
textureSettings: textureSettings:
serializedVersion: 2 serializedVersion: 2
@@ -34,6 +33,30 @@ SpriteAtlasAsset:
m_Overridden: 1 m_Overridden: 1
m_AndroidETC2FallbackOverride: 0 m_AndroidETC2FallbackOverride: 0
m_ForceMaximumCompressionQuality_BC6H_BC7: 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: packingSettings:
serializedVersion: 2 serializedVersion: 2
padding: 2 padding: 2
@@ -50,6 +73,19 @@ SpriteAtlasAsset:
- {fileID: 21300000, guid: d623a2b7e069a4c4592d3da48f476189, type: 3} - {fileID: 21300000, guid: d623a2b7e069a4c4592d3da48f476189, type: 3}
- {fileID: 21300000, guid: 57e4117f4cd6ae54284898652e70d553, type: 3} - {fileID: 21300000, guid: 57e4117f4cd6ae54284898652e70d553, type: 3}
bindAsDefault: 1 bindAsDefault: 1
isAtlasV2: 1 isAtlasV2: 0
cachedData: {fileID: 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 m_IsVariant: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c91b064c2cd7a34448ae0d6d7ee58e7f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 4343727234628468602
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: b9eaf6bdacd0683468b1dd697e3d2bce
SpriteAtlasImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -7,11 +7,13 @@ using UnityEngine;
using UnityEngine.U2D; using UnityEngine.U2D;
using Object = UnityEngine.Object; using Object = UnityEngine.Object;
/// <summary> namespace GameFramework.Editor
/// 图集导入管线。
/// </summary>
public class SpritePostprocessor : AssetPostprocessor
{ {
/// <summary>
/// 图集导入管线。
/// </summary>
public class SpritePostprocessor : AssetPostprocessor
{
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
{ {
foreach (var s in importedAssets) foreach (var s in importedAssets)
@@ -34,23 +36,22 @@ public class SpritePostprocessor : AssetPostprocessor
EditorSpriteSaveInfo.OnImportSprite(s); EditorSpriteSaveInfo.OnImportSprite(s);
} }
} }
} }
public static class EditorSpriteSaveInfo public static class EditorSpriteSaveInfo
{ {
private const string NormalAtlasDir = "Assets/AssetArt/Atlas"; private const string NormalAtlasDir = "Assets/AssetArt/Atlas";
private const string UISpritePath = "Assets/AssetRaw/UIRaw"; private const string UISpritePath = "Assets/AssetRaw/UIRaw";
private const string UIAtlasPath = "Assets/AssetRaw/UIRaw/Atlas"; private const string UIAtlasPath = "Assets/AssetRaw/UIRaw/Atlas";
private const string UIRawPath = "Assets/AssetRaw/UIRaw/UIRaw"; private static readonly List<string> _dirtyAtlasList = new List<string>();
private static List<string> m_dirtyAtlasList = new List<string>(); private static readonly Dictionary<string, List<string>> _allASprites = new Dictionary<string, List<string>>();
private static Dictionary<string, List<string>> m_allASprites = new Dictionary<string, List<string>>(); private static readonly Dictionary<string, string> _uiAtlasMap = new Dictionary<string, string>();
private static Dictionary<string, string> m_uiAtlasMap = new Dictionary<string, string>(); private static bool _isInit = false;
private static bool m_inited = false;
private static bool m_dirty = false; private static bool m_dirty = false;
public static void Init() public static void Init()
{ {
if (m_inited) if (_isInit)
{ {
return; return;
} }
@@ -73,16 +74,17 @@ public static class EditorSpriteSaveInfo
var objects = sa.GetPackables(); var objects = sa.GetPackables();
foreach (var o in objects) foreach (var o in objects)
{ {
if (!m_allASprites.TryGetValue(atlasName, out var list)) if (!_allASprites.TryGetValue(atlasName, out var list))
{ {
list = new List<string>(); list = new List<string>();
m_allASprites.Add(atlasName, list); _allASprites.Add(atlasName, list);
} }
list.Add(AssetDatabase.GetAssetPath(o)); list.Add(AssetDatabase.GetAssetPath(o));
} }
} }
m_inited = true; _isInit = true;
} }
public static void CheckDirty() public static void CheckDirty()
@@ -93,15 +95,15 @@ public static class EditorSpriteSaveInfo
AssetDatabase.Refresh(); AssetDatabase.Refresh();
float lastProgress = -1; float lastProgress = -1;
for (int i = 0; i < m_dirtyAtlasList.Count; i++) for (int i = 0; i < _dirtyAtlasList.Count; i++)
{ {
string atlasName = m_dirtyAtlasList[i]; string atlasName = _dirtyAtlasList[i];
Debug.Log("更新图集 : " + atlasName); Debug.Log("更新图集 : " + atlasName);
var curProgress = (float)i / m_dirtyAtlasList.Count; var curProgress = (float)i / _dirtyAtlasList.Count;
if (curProgress > lastProgress + 0.01f) if (curProgress > lastProgress + 0.01f)
{ {
lastProgress = curProgress; lastProgress = curProgress;
var progressText = $"当前进度:{i}/{m_dirtyAtlasList.Count} {atlasName}"; var progressText = $"当前进度:{i}/{_dirtyAtlasList.Count} {atlasName}";
bool cancel = EditorUtility.DisplayCancelableProgressBar("刷新图集" + atlasName, progressText, curProgress); bool cancel = EditorUtility.DisplayCancelableProgressBar("刷新图集" + atlasName, progressText, curProgress);
if (cancel) if (cancel)
{ {
@@ -116,7 +118,7 @@ public static class EditorSpriteSaveInfo
EditorUtility.ClearProgressBar(); EditorUtility.ClearProgressBar();
AssetDatabase.SaveAssets(); AssetDatabase.SaveAssets();
AssetDatabase.Refresh(); AssetDatabase.Refresh();
m_dirtyAtlasList.Clear(); _dirtyAtlasList.Clear();
} }
} }
@@ -169,6 +171,7 @@ public static class EditorSpriteSaveInfo
if (andPlatformSettings.format != TextureImporterFormat.ASTC_6x6) if (andPlatformSettings.format != TextureImporterFormat.ASTC_6x6)
{ {
andPlatformSettings.format = TextureImporterFormat.ASTC_6x6; andPlatformSettings.format = TextureImporterFormat.ASTC_6x6;
andPlatformSettings.compressionQuality = 50;
ti.SetPlatformTextureSettings(andPlatformSettings); ti.SetPlatformTextureSettings(andPlatformSettings);
modify = true; modify = true;
} }
@@ -188,6 +191,22 @@ public static class EditorSpriteSaveInfo
ti.SetPlatformTextureSettings(iosPlatformSettings); ti.SetPlatformTextureSettings(iosPlatformSettings);
modify = true; 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;
}
} }
} }
@@ -215,7 +234,7 @@ public static class EditorSpriteSaveInfo
public static string GetSpritePath(string assetPath) public static string GetSpritePath(string assetPath)
{ {
string path = assetPath.Substring(0, assetPath.LastIndexOf(".")); string path = assetPath.Substring(0, assetPath.LastIndexOf(".", StringComparison.Ordinal));
path = path.Replace("Assets/AssetRaw/", ""); path = path.Replace("Assets/AssetRaw/", "");
return path; return path;
} }
@@ -262,15 +281,15 @@ public static class EditorSpriteSaveInfo
var spriteName = Path.GetFileNameWithoutExtension(assetPath); var spriteName = Path.GetFileNameWithoutExtension(assetPath);
var spritePath = GetSpritePath(assetPath); var spritePath = GetSpritePath(assetPath);
if (!m_uiAtlasMap.TryGetValue(spriteName, out string oldAssetPath) || spritePath == oldAssetPath) if (!_uiAtlasMap.TryGetValue(spriteName, out string oldAssetPath) || spritePath == oldAssetPath)
{ {
m_uiAtlasMap[spriteName] = spritePath; _uiAtlasMap[spriteName] = spritePath;
m_dirty = true; m_dirty = true;
} }
else else
{ {
Debug.LogError($"有重名的图片:{spriteName}\n旧图集{oldAssetPath}\n新图集{spritePath} "); Debug.LogError($"有重名的图片:{spriteName}\n旧图集{oldAssetPath}\n新图集{spritePath} ");
m_uiAtlasMap[spriteName] = spritePath; _uiAtlasMap[spriteName] = spritePath;
m_dirty = true; m_dirty = true;
} }
@@ -288,19 +307,19 @@ public static class EditorSpriteSaveInfo
else else
{ {
List<string> ret; List<string> ret;
if (!m_allASprites.TryGetValue(atlasName, out ret)) if (!_allASprites.TryGetValue(atlasName, out ret))
{ {
ret = new List<string>(); ret = new List<string>();
m_allASprites.Add(atlasName, ret); _allASprites.Add(atlasName, ret);
} }
if (!ret.Contains(assetPath)) if (!ret.Contains(assetPath))
{ {
ret.Add(assetPath); ret.Add(assetPath);
m_dirty = true; m_dirty = true;
if (!m_dirtyAtlasList.Contains(atlasName)) if (!_dirtyAtlasList.Contains(atlasName))
{ {
m_dirtyAtlasList.Add(atlasName); _dirtyAtlasList.Add(atlasName);
} }
} }
} }
@@ -320,7 +339,7 @@ public static class EditorSpriteSaveInfo
Init(); Init();
string atlasName = GetPackageTag(assetPath); string atlasName = GetPackageTag(assetPath);
if (!m_allASprites.TryGetValue(atlasName, out var ret)) if (!_allASprites.TryGetValue(atlasName, out var ret))
{ {
return; return;
} }
@@ -334,18 +353,18 @@ public static class EditorSpriteSaveInfo
if (assetPath.StartsWith(UISpritePath)) if (assetPath.StartsWith(UISpritePath))
{ {
var spriteName = Path.GetFileNameWithoutExtension(assetPath); var spriteName = Path.GetFileNameWithoutExtension(assetPath);
if (m_uiAtlasMap.ContainsKey(spriteName)) if (_uiAtlasMap.ContainsKey(spriteName))
{ {
m_uiAtlasMap.Remove(spriteName); _uiAtlasMap.Remove(spriteName);
m_dirty = true; m_dirty = true;
} }
} }
ret.Remove(assetPath); ret.Remove(assetPath);
m_dirty = true; m_dirty = true;
if (!m_dirtyAtlasList.Contains(atlasName)) if (!_dirtyAtlasList.Contains(atlasName))
{ {
m_dirtyAtlasList.Add(atlasName); _dirtyAtlasList.Add(atlasName);
} }
} }
@@ -354,7 +373,7 @@ public static class EditorSpriteSaveInfo
public static void SaveAtlas(string atlasName, bool isUI) public static void SaveAtlas(string atlasName, bool isUI)
{ {
List<Object> spriteList = new List<Object>(); List<Object> spriteList = new List<Object>();
if (m_allASprites.TryGetValue(atlasName, out var list)) if (_allASprites.TryGetValue(atlasName, out var list))
{ {
list.Sort(StringComparer.Ordinal); list.Sort(StringComparer.Ordinal);
@@ -368,8 +387,7 @@ public static class EditorSpriteSaveInfo
} }
} }
var pathv2 = $"{NormalAtlasDir}/{atlasName}.spriteatlasv2"; var path = $"{NormalAtlasDir}/{atlasName}.spriteatlas";
var path = $"{NormalAtlasDir}/{atlasName}.asset";
if (spriteList.Count == 0) if (spriteList.Count == 0)
{ {
@@ -377,15 +395,12 @@ public static class EditorSpriteSaveInfo
{ {
AssetDatabase.DeleteAsset(path); AssetDatabase.DeleteAsset(path);
} }
if (File.Exists(pathv2))
{
AssetDatabase.DeleteAsset(pathv2);
}
return; return;
} }
var atlas = new SpriteAtlasAsset(); var atlas = new SpriteAtlas();
// var atlas = new SpriteAtlasAsset();
var setting = new SpriteAtlasPackingSettings var setting = new SpriteAtlasPackingSettings
{ {
blockOffset = 1, blockOffset = 1,
@@ -407,29 +422,34 @@ public static class EditorSpriteSaveInfo
if (!iphonePlatformSetting.overridden) if (!iphonePlatformSetting.overridden)
{ {
iphonePlatformSetting.overridden = true; iphonePlatformSetting.overridden = true;
iphonePlatformSetting.format = isOpaque ? TextureImporterFormat.ASTC_5x5 : TextureImporterFormat.ASTC_5x5; iphonePlatformSetting.format = TextureImporterFormat.ASTC_5x5;
iphonePlatformSetting.compressionQuality = 100; iphonePlatformSetting.compressionQuality = 100;
atlas.SetPlatformSettings(iphonePlatformSetting); atlas.SetPlatformSettings(iphonePlatformSetting);
} }
var androidPlatformSetting = atlas.GetPlatformSettings("Android"); var androidPlatformSetting = atlas.GetPlatformSettings("Android");
if (isOpaque && !androidPlatformSetting.overridden) if (!androidPlatformSetting.overridden)
{ {
androidPlatformSetting.overridden = true; androidPlatformSetting.overridden = true;
androidPlatformSetting.format = TextureImporterFormat.ETC_RGB4; androidPlatformSetting.format = TextureImporterFormat.ASTC_6x6;
androidPlatformSetting.compressionQuality = 100; androidPlatformSetting.compressionQuality = 100;
atlas.SetPlatformSettings(androidPlatformSetting); 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.SetPackingSettings(setting);
atlas.Add(spriteList.ToArray()); atlas.Add(spriteList.ToArray());
AssetDatabase.CreateAsset(atlas, path); AssetDatabase.CreateAsset(atlas, path);
if (File.Exists(pathv2)) AssetDatabase.SaveAssets();
{
AssetDatabase.DeleteAsset(pathv2);
}
File.Move(path, pathv2);
AssetDatabase.Refresh(); AssetDatabase.Refresh();
} }
@@ -437,15 +457,15 @@ public static class EditorSpriteSaveInfo
#region #region
private static Dictionary<string, List<string>> m_tempAllASprites = new Dictionary<string, List<string>>(); private static readonly Dictionary<string, List<string>> m_tempAllASprites = new Dictionary<string, List<string>>();
[MenuItem("TEngine/图集/重新生成UI图集")] [MenuItem("TEngine/Atlas/重新生成UI图集", false, 90)]
static void ForceGenAtlas() static void ForceGenAtlas()
{ {
Init(); Init();
List<string> needSaveAtlas = new List<string>(); List<string> needSaveAtlas = new List<string>();
m_tempAllASprites.Clear(); m_tempAllASprites.Clear();
m_allASprites.Clear(); _allASprites.Clear();
var findAssets = AssetDatabase.FindAssets("t:sprite", new[] { UIAtlasPath }); var findAssets = AssetDatabase.FindAssets("t:sprite", new[] { UIAtlasPath });
foreach (var findAsset in findAssets) foreach (var findAsset in findAssets)
{ {
@@ -471,7 +491,7 @@ public static class EditorSpriteSaveInfo
var atlasName = iter.Current.Key; var atlasName = iter.Current.Key;
var newSpritesList = iter.Current.Value; var newSpritesList = iter.Current.Value;
if (m_allASprites.TryGetValue(atlasName, out var existSprites)) if (_allASprites.TryGetValue(atlasName, out var existSprites))
{ {
if (existSprites.Count != newSpritesList.Count) if (existSprites.Count != newSpritesList.Count)
{ {
@@ -500,7 +520,7 @@ public static class EditorSpriteSaveInfo
else else
{ {
needSave = true; needSave = true;
m_allASprites.Add(atlasName, new List<string>(newSpritesList)); _allASprites.Add(atlasName, new List<string>(newSpritesList));
} }
if (needSave && !needSaveAtlas.Contains(atlasName)) if (needSave && !needSaveAtlas.Contains(atlasName))
@@ -524,4 +544,5 @@ public static class EditorSpriteSaveInfo
} }
#endregion #endregion
}
} }