| Assets/Editor/Tool/BatchTexturePlatformSettings.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Assets/Editor/Tool/BatchTexturePlatformSettings.cs.meta | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Assets/Editor/Tool/ConvertWebGLTextureToETC2.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Assets/Editor/Tool/TexturePlatformAssetPostprocessor.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Assets/Editor/Tool/TexturePlatformAssetPostprocessor.cs.meta | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Assets/Editor/Tool/TexturePlatformFormatHelper.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Assets/Editor/Tool/TexturePlatformFormatHelper.cs.meta | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Assets/Editor/Tool/BatchTexturePlatformSettings.cs
New file @@ -0,0 +1,126 @@ using UnityEditor; using UnityEditor.U2D; using UnityEngine; /// <summary> /// 批量设置贴图和图集的平台压缩格式: /// - PC(Standalone):不设置覆盖,保持默认 /// - Android:ETC2(有Alpha→RGBA8 / 无Alpha→RGB4) /// - iPhone:ASTC_6x6 /// - WebGL:ASTC_6x6 /// /// 图集只设置 SpriteAtlas 自身格式,不触碰其中的 Sprite。 /// /// 菜单:程序/Sprite/批量设置贴图平台格式 /// </summary> public class BatchTexturePlatformSettings { private static readonly string TARGET_FOLDER = TexturePlatformFormatHelper.TARGET_FOLDER; [MenuItem("程序/Sprite/批量设置贴图平台格式(全部)")] public static void SetAll() { SetTextures(); SetSpriteAtlases(); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } [MenuItem("程序/Sprite/批量设置贴图平台格式(仅贴图)")] public static void SetTexturesOnly() { SetTextures(); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } [MenuItem("程序/Sprite/批量设置贴图平台格式(仅图集)")] public static void SetAtlasesOnly() { SetSpriteAtlases(); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } // ============================================================ // 贴图 // ============================================================ static void SetTextures() { var guids = AssetDatabase.FindAssets("t:Texture2D", new[] { TARGET_FOLDER }); int total = guids.Length; int converted = 0; int skipped = 0; for (int i = 0; i < total; i++) { var assetPath = AssetDatabase.GUIDToAssetPath(guids[i]); EditorUtility.DisplayProgressBar("批量设置贴图平台格式", $"[{i + 1}/{total}] {assetPath}", (float)i / total); var importer = AssetImporter.GetAtPath(assetPath) as TextureImporter; if (importer == null) { skipped++; continue; } if (TexturePlatformFormatHelper.ApplyTexturePlatformSettings(importer)) { importer.SaveAndReimport(); converted++; Debug.Log($"[BatchTex] 贴图: {assetPath}"); } else { skipped++; } } EditorUtility.ClearProgressBar(); Debug.Log($"[BatchTex] 贴图完成:转换 {converted},跳过 {skipped},共 {total}"); EditorUtility.DisplayDialog("贴图格式设置完成", $"转换 {converted} 个,跳过 {skipped} 个,共 {total} 个贴图。\nAndroid → ETC2\niPhone → ASTC_6x6\nWebGL → ASTC_6x6\nPC → 默认", "OK"); } // ============================================================ // 图集 // ============================================================ static void SetSpriteAtlases() { var guids = AssetDatabase.FindAssets("t:SpriteAtlas", new[] { TARGET_FOLDER }); int total = guids.Length; int converted = 0; int skipped = 0; for (int i = 0; i < total; i++) { var assetPath = AssetDatabase.GUIDToAssetPath(guids[i]); EditorUtility.DisplayProgressBar("批量设置图集平台格式", $"[{i + 1}/{total}] {assetPath}", (float)i / total); try { var importer = SpriteAtlasImporter.GetAtPath(assetPath) as SpriteAtlasImporter; if (importer == null) { skipped++; continue; } if (TexturePlatformFormatHelper.ApplyAtlasPlatformSettings(importer)) { importer.SaveAndReimport(); converted++; Debug.Log($"[BatchTex] 图集: {assetPath}"); } else { skipped++; } } catch (System.Exception ex) { Debug.LogError($"[BatchTex] 图集失败 {assetPath}: {ex.Message}"); } } EditorUtility.ClearProgressBar(); Debug.Log($"[BatchTex] 图集完成:转换 {converted},跳过 {skipped},共 {total}"); EditorUtility.DisplayDialog("图集格式设置完成", $"转换 {converted} 个,跳过 {skipped} 个,共 {total} 个图集。\nAndroid → ETC2_RGBA8\niPhone → ASTC_6x6\nWebGL → ASTC_6x6\nPC → 默认", "OK"); } } Assets/Editor/Tool/BatchTexturePlatformSettings.cs.metacopy from Assets/Editor/Tool/ConvertWebGLTextureToETC2.cs.meta copy to Assets/Editor/Tool/BatchTexturePlatformSettings.cs.meta
File was copied from Assets/Editor/Tool/ConvertWebGLTextureToETC2.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 guid: 692c5aa4ed3ecc04b8ae0ba3f4036893 guid: bd9861c931f198a4cb8f83cf69263157 MonoImporter: externalObjects: {} serializedVersion: 2 Assets/Editor/Tool/ConvertWebGLTextureToETC2.cs
File was deleted Assets/Editor/Tool/TexturePlatformAssetPostprocessor.cs
New file @@ -0,0 +1,63 @@ using UnityEditor; using UnityEditor.U2D; using UnityEngine; /// <summary> /// 新资源导入时自动设置平台压缩格式: /// - 纹理(Texture2D):Android→ETC2(有Alpha→RGBA8 / 无Alpha→RGB4) iPhone→ASTC_6x6 WebGL→ASTC_6x6 /// - 图集(SpriteAtlas):Android→ETC2_RGBA8 iPhone→ASTC_6x6 WebGL→ASTC_6x6 /// - PC(Standalone):不设置覆盖,保持默认 /// /// 仅处理 Assets/ResourcesOut 下的资源。 /// </summary> public class TexturePlatformAssetPostprocessor : AssetPostprocessor { private static readonly string TARGET_FOLDER = TexturePlatformFormatHelper.TARGET_FOLDER; void OnPreprocessTexture() { if (!assetPath.StartsWith(TARGET_FOLDER)) return; var importer = assetImporter as TextureImporter; if (importer == null) return; if (TexturePlatformFormatHelper.ApplyTexturePlatformSettings(importer)) { Debug.Log($"[TexImport] 贴图: {assetPath}"); } } static void OnPostprocessAllAssets( string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { foreach (var assetPath in importedAssets) { if (!assetPath.StartsWith(TARGET_FOLDER)) continue; if (!assetPath.EndsWith(".spriteatlasv2") && !assetPath.EndsWith(".spriteatlas")) continue; try { var importer = SpriteAtlasImporter.GetAtPath(assetPath) as SpriteAtlasImporter; if (importer == null) continue; if (TexturePlatformFormatHelper.ApplyAtlasPlatformSettings(importer)) { importer.SaveAndReimport(); Debug.Log($"[TexImport] 图集: {assetPath}"); } } catch (System.Exception ex) { Debug.LogError($"[TexImport] 图集失败 {assetPath}: {ex.Message}"); } } } } Assets/Editor/Tool/TexturePlatformAssetPostprocessor.cs.metacopy from Assets/Editor/Tool/ConvertWebGLTextureToETC2.cs.meta copy to Assets/Editor/Tool/TexturePlatformAssetPostprocessor.cs.meta
File was copied from Assets/Editor/Tool/ConvertWebGLTextureToETC2.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 guid: 692c5aa4ed3ecc04b8ae0ba3f4036893 guid: f6e49ac02361c224184ad490e10d98cb MonoImporter: externalObjects: {} serializedVersion: 2 Assets/Editor/Tool/TexturePlatformFormatHelper.cs
New file @@ -0,0 +1,201 @@ using UnityEditor; using UnityEditor.U2D; using UnityEngine; /// <summary> /// 贴图平台压缩格式的公共常量、工具方法,以及平台设置的核心逻辑。 /// Batch 和 Import 只需调用 Apply 方法,不重复编写设置代码。 /// </summary> public static class TexturePlatformFormatHelper { // ---- 格式常量 ---- public const TextureImporterFormat ANDROID_RGBA = TextureImporterFormat.ASTC_6x6; public const TextureImporterFormat ANDROID_RGB = TextureImporterFormat.ASTC_6x6; public const TextureImporterFormat IOS_FORMAT = TextureImporterFormat.ASTC_6x6; public const TextureImporterFormat WEBGL_FORMAT = TextureImporterFormat.ASTC_6x6; // ---- 目标文件夹 ---- public const string TARGET_FOLDER = "Assets/ResourcesOut"; // ---- 图集固定尺寸 ---- public const int ATLAS_MAX_SIZE = 2048; // ---- 压缩质量 ---- public const int COMPRESSION_QUALITY = 50; // ============================================================ // 核心:对单个 importer 应用平台格式设置 // ============================================================ /// <summary> /// 对 TextureImporter 设置 Android=ETC2 / iPhone=ASTC / WebGL=ASTC。 /// 返回 true 表示有改动,调用方负责 SaveAndReimport。 /// </summary> public static bool ApplyTexturePlatformSettings(TextureImporter importer) { bool needsAlpha = NeedsAlpha(importer); var androidTarget = needsAlpha ? ANDROID_RGBA : ANDROID_RGB; int maxSize = GetMaxTextureSize(importer); bool changed = false; // Android → ETC2 { var s = importer.GetPlatformTextureSettings("Android"); if (!s.overridden || s.format != androidTarget) { s.overridden = true; s.maxTextureSize = maxSize; s.textureCompression = TextureImporterCompression.Compressed; s.format = androidTarget; s.compressionQuality = COMPRESSION_QUALITY; importer.SetPlatformTextureSettings(s); changed = true; } } // iPhone → ASTC { var s = importer.GetPlatformTextureSettings("iPhone"); if (!s.overridden || s.format != IOS_FORMAT) { s.overridden = true; s.maxTextureSize = maxSize; s.textureCompression = TextureImporterCompression.Compressed; s.format = IOS_FORMAT; s.compressionQuality = COMPRESSION_QUALITY; importer.SetPlatformTextureSettings(s); changed = true; } } // WebGL → ASTC { var s = importer.GetPlatformTextureSettings("WebGL"); if (!s.overridden || s.format != WEBGL_FORMAT) { s.overridden = true; s.maxTextureSize = maxSize; s.textureCompression = TextureImporterCompression.Compressed; s.format = WEBGL_FORMAT; s.compressionQuality = COMPRESSION_QUALITY; importer.SetPlatformTextureSettings(s); changed = true; } } return changed; } /// <summary> /// 对 SpriteAtlasImporter 设置 Android=ETC2_RGBA8 / iPhone=ASTC / WebGL=ASTC。 /// 返回 true 表示有改动,调用方负责 SaveAndReimport。 /// </summary> public static bool ApplyAtlasPlatformSettings(SpriteAtlasImporter importer) { bool changed = false; // Android → ETC2_RGBA8(图集始终含 Alpha) { var s = importer.GetPlatformSettings("Android"); if (!s.overridden || s.format != ANDROID_RGBA) { s.overridden = true; s.maxTextureSize = ATLAS_MAX_SIZE; s.textureCompression = TextureImporterCompression.Compressed; s.format = ANDROID_RGBA; s.compressionQuality = COMPRESSION_QUALITY; importer.SetPlatformSettings(s); changed = true; } } // iPhone → ASTC { var s = importer.GetPlatformSettings("iPhone"); if (!s.overridden || s.format != IOS_FORMAT) { s.overridden = true; s.maxTextureSize = ATLAS_MAX_SIZE; s.textureCompression = TextureImporterCompression.Compressed; s.format = IOS_FORMAT; s.compressionQuality = COMPRESSION_QUALITY; importer.SetPlatformSettings(s); changed = true; } } // WebGL → ASTC { var s = importer.GetPlatformSettings("WebGL"); if (!s.overridden || s.format != WEBGL_FORMAT) { s.overridden = true; s.maxTextureSize = ATLAS_MAX_SIZE; s.textureCompression = TextureImporterCompression.Compressed; s.format = WEBGL_FORMAT; s.compressionQuality = COMPRESSION_QUALITY; importer.SetPlatformSettings(s); changed = true; } } return changed; } // ============================================================ // 工具方法 // ============================================================ public static bool NeedsAlpha(TextureImporter importer) { if (importer.DoesSourceTextureHaveAlpha()) return true; foreach (var platform in new[] { "Android", "iPhone", "Standalone" }) { var s = importer.GetPlatformTextureSettings(platform); if (s.overridden && IsAlphaFormat(s.format)) return true; } if (importer.alphaSource != TextureImporterAlphaSource.None) return importer.DoesSourceTextureHaveAlpha(); return false; } public static bool IsAlphaFormat(TextureImporterFormat format) { switch (format) { case TextureImporterFormat.RGBA32: case TextureImporterFormat.RGBA16: case TextureImporterFormat.ARGB32: case TextureImporterFormat.ARGB16: case TextureImporterFormat.DXT5: case TextureImporterFormat.ETC2_RGBA8: case TextureImporterFormat.ASTC_4x4: case TextureImporterFormat.ASTC_5x5: case TextureImporterFormat.ASTC_6x6: case TextureImporterFormat.ASTC_8x8: case TextureImporterFormat.ASTC_10x10: case TextureImporterFormat.ASTC_12x12: case TextureImporterFormat.PVRTC_RGBA2: case TextureImporterFormat.PVRTC_RGBA4: return true; default: return false; } } public static int GetMaxTextureSize(TextureImporter importer) { foreach (var platform in new[] { "Android", "iPhone", "Standalone" }) { var s = importer.GetPlatformTextureSettings(platform); if (s.overridden) return s.maxTextureSize; } return importer.maxTextureSize; } } Assets/Editor/Tool/TexturePlatformFormatHelper.cs.meta
File was renamed from Assets/Editor/Tool/ConvertWebGLTextureToETC2.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 guid: 692c5aa4ed3ecc04b8ae0ba3f4036893 guid: db99799271bc10d41b02c4ef7a2142ac MonoImporter: externalObjects: {} serializedVersion: 2