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;
|
}
|
}
|