using UnityEditor; using UnityEditor.U2D; using UnityEngine; /// /// 贴图平台压缩格式的公共常量、工具方法,以及平台设置的核心逻辑。 /// Batch 和 Import 只需调用 Apply 方法,不重复编写设置代码。 /// 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 应用平台格式设置 // ============================================================ /// /// 对 TextureImporter 设置 Android=ETC2 / iPhone=ASTC / WebGL=ASTC。 /// 返回 true 表示有改动,调用方负责 SaveAndReimport。 /// 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; } /// /// 对 SpriteAtlasImporter 设置 Android=ETC2_RGBA8 / iPhone=ASTC / WebGL=ASTC。 /// 返回 true 表示有改动,调用方负责 SaveAndReimport。 /// 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; } }