Unity资源导入自动化处理

AssetPostprocessor

AssetPostprocessor类用于在Unity中对导入的资源进行自动化处理,比如修改纹理设置、调整模型导入选项等。通过重写其方法,可以在资源导入前后进行自定义操作,从而提高工作效率和资源管理的灵活性。

纹理示例

在纹理处理方面,AssetPostprocessor提供了OnPreprocessTextureOnPostprocessTexture两个主要方法。OnPreprocessTexture允许你在纹理导入前设置属性,比如调整压缩格式、最大尺寸或设置为高级导入选项。而OnPostprocessTexture则可以在纹理导入后进行修改,如进一步处理纹理或应用自定义滤镜。

using UnityEngine;
using UnityEditor;

public class TexturePostProcessor : AssetPostprocessor
{
    // 在纹理导入前调用
    void OnPreprocessTexture()
    {
        TextureImporter importer = (TextureImporter)assetImporter;

        // 设置纹理的最大尺寸
        importer.maxTextureSize = 1024;

        // 设置纹理的类型为默认(可以根据需要更改)
        importer.textureType = TextureImporterType.Default;

        // 设置纹理的压缩格式
        importer.textureCompression = TextureImporterCompression.Compressed;

        // 其他设置...
    }

    // 在纹理导入后调用
    void OnPostprocessTexture(Texture2D texture)
    {
        // 这里可以进一步处理导入后的纹理
        Debug.Log("Texture imported: " + texture.name);

        // 例如,可以在这里应用一些自定义滤镜或效果
        //灰度滤镜
        ApplyGrayscale(texture);
    }
    
    private void ApplyGrayscale(Texture2D texture)
    {         
        // 获取纹理的像素数据         
        Color[] pixels = texture.GetPixels();          
        // 遍历每个像素并转换为灰度
        for (int i = 0; i < pixels.Length; i++)         
        {             
            float grayValue = pixels[i].grayscale;             
            pixels[i] = new Color(grayValue, grayValue, grayValue, pixels[i].a);         
        }          
        // 将修改后的像素数据重新设置回纹理         
        texture.SetPixels(pixels);         
        texture.Apply(); // 应用更改     
    }
}

模型示例

在模型处理方面,AssetPostprocessor提供了OnPreprocessModelOnPostprocessModel方法。通过这两个方法,你可以在导入3D模型时自动设置各种选项,比如调整网格的缩放、改变法线计算方式或设置材质等。

using UnityEngine;
using UnityEditor;

public class ModelPostProcessor : AssetPostprocessor
{
    void OnPreprocessModel()
    {
        ModelImporter importer = (ModelImporter)assetImporter;

        // 设置模型的法线计算方式
        importerNormals = ModelImporterNormals.Calculate;

        // 设置切线计算方式
        importer.tangentImportMode = ModelImporterTangents.Calculate;

        // 可选择设置缩放因子
        importer.globalScale = 1.0f; // 修改为需要的缩放因子
    }

    void OnPostprocessModel(GameObject model)
    {
        // 获取模型的所有子对象
        foreach (Transform child in model.transform)
        {
            // 自动应用指定的材质(假设材质在Resources文件夹中)
            var renderer = child.GetComponent<Renderer>();
            if (renderer != null)
            {
                Material material = Resources.Load<Material>("Materials/MyMaterial"); // 修改为你的材质路径
                if (material != null)
                {
                    renderer.material = material;
                }
            }
        }

        Debug.Log("Processed model: " + model.name);
    }
}

实际使用示例

using UnityEditor;
using UnityEngine;

public class TextureImporterSettings : AssetPostprocessor
{
    private const int MaxTextureSize = 8192;

    //这是主要的回调函数,当导入纹理时被调用。
    private void OnPreprocessTexture()
    {
        //首先检查 assetImporter 是否为 TextureImporter,并排除在 Packages 文件夹中的纹理。
        if (assetImporter is TextureImporter importer)
        {
            if (IsInPackagesFolder(assetImporter.assetPath))
            {
                return;
            }
            //如果导入设置缺失,设置纹理为不可读,过滤模式为双线性,禁用 mipmap。
            //第一次导入
            if (importer.importSettingsMissing)
            {
                importer.isReadable = false;
                importer.filterMode = FilterMode.Bilinear;
                importer.mipmapEnabled = false;
            }

            Debug.Log($"Before Compression == AssetName:{importer.name}, AssetPath:{importer.assetPath}, TextureSize:{importer.maxTextureSize}, TextureFormat:{importer.GetAutomaticFormat("Default")}");

            var defaultSettings = importer.GetDefaultPlatformTextureSettings();
            var platform = "DefaultTexturePlatform";
//根据当前平台(Android 或 iOS)获取默认纹理设置,并计算最大纹理尺寸。
#if UseUASEditor || UNITY_ANDROID
            var textureImporterSettings = importer.GetPlatformTextureSettings("Android");
            platform = "Android";
#elif UNITY_IOS
            var textureImporterSettings = importer.GetPlatformTextureSettings("iPhone");
            platform = "iPhone";
#endif
            var textureImporterMaxSize = Mathf.Min(textureImporterSettings.maxTextureSize, MaxTextureSize, defaultSettings.maxTextureSize);
            
            //根据纹理类型(法线贴图或默认类型)设置不同的纹理格式(ASTC 4x4 或 ASTC 6x6)。
            if (importer.textureType == TextureImporterType.NormalMap)
            {
                SetPlatformSettings(importer, platform, TextureImporterFormat.ASTC_4x4, textureImporterMaxSize);
            }
            else if (importer.textureType == TextureImporterType.Default)
            {
                SetPlatformSettings(importer, platform, TextureImporterFormat.ASTC_6x6, textureImporterMaxSize);
            }
            
            //使用 AssetDatabase.ImportAsset 强制更新纹理设置。
            AssetDatabase.ImportAsset(assetImporter.assetPath, ImportAssetOptions.ForceUpdate);

            Debug.Log($"After Compression == AssetName:{importer.name}, AssetPath:{importer.assetPath}, TextureSize:{importer.maxTextureSize}, TextureFormat:{importer.GetAutomaticFormat(platform)}");

        }
    }
    
    //创建 TextureImporterPlatformSettings 对象,并配置纹理格式、最大尺寸和压缩类型。
    private void SetPlatformSettings(TextureImporter importer, string platformName, TextureImporterFormat format, int maxTextureSize)
    {
        var platformSettings = new TextureImporterPlatformSettings
        {
            name = platformName,
            overridden = true, //表示将使用此设置覆盖默认设置。
            format = format,
            maxTextureSize = maxTextureSize,
            //指定纹理的压缩类型,比如 TextureImporterCompression.Compressed(压缩)或 TextureImporterCompression.Uncompressed(未压缩)。
            //选择压缩类型会影响纹理的加载速度、内存使用和视觉效果。
            textureCompression = TextureImporterCompression.Compressed
        };

        importer.SetPlatformTextureSettings(platformSettings);
    }

    private bool IsInPackagesFolder(string assetPath)
    {
        // 检查路径是否包含 "Packages" 或者 ThirdParty
        return assetPath.Contains("Packages/") || assetPath.Contains("/ThirdParty/");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值