三国卡牌客户端基础资源仓库
yyl
昨天 e40b40163151bb8c20581b88de7cdb8057010906
texture importer跟设置相关的内容
2 文件已复制
1个文件已删除
1 文件已重命名
3个文件已添加
626 ■■■■■ 已修改文件
Assets/Editor/Tool/BatchTexturePlatformSettings.cs 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/BatchTexturePlatformSettings.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/ConvertWebGLTextureToETC2.cs 230 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/TexturePlatformAssetPostprocessor.cs 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/TexturePlatformAssetPostprocessor.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/TexturePlatformFormatHelper.cs 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/TexturePlatformFormatHelper.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | 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.meta
copy 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.meta
copy 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