Unity 资源导入时预处理 AssetPostprocessor

本文详细介绍Unity3D中自定义资源导入处理器CustomAssetPostprocessor的实现方式,包括模型、纹理和音频资源的预处理与后处理方法。通过具体代码示例,展示了如何在资源导入前后执行特定操作,如调整纹理格式、大小和类型,记录导入、删除、移动资源的日志等。

官方API: https://docs.unity3d.com/ScriptReference/AssetPostprocessor.html

using UnityEngine;
using UnityEditor;
 
/// <summary>
/// 注意:自定义的AssetPostprocessor应该以dll的方式调用,可以确保即使脚本有编译错误,也可以始终执行它们
/// </summary>
public class CustomAssetPostprocessor : AssetPostprocessor
{
    //模型导入之前调用
    public void OnPreprocessModel()
    {
        Debug.Log("OnPreprocessModel=" + this.assetPath);
    }
 
    public void OnPostprocessModel(GameObject go)
    {
        Debug.Log("OnPostprocessModel=" + go.name);
    }

    //纹理导入之前调用,针对入到的纹理进行设置
    public void OnPreprocessTexture()
    {
        Debug.Log("OnPreProcessTexture=" + this.assetPath);
        //TextureImporter impor = this.assetImporter as TextureImporter;
        //impor.textureFormat = TextureImporterFormat.ARGB32;
        //impor.maxTextureSize = 512;
        //impor.textureType = TextureImporterType.Default;
        //impor.mipmapEnabled = false;
 
    }

    public void OnPostprocessTexture(Texture2D tex)
    {
        Debug.Log("OnPostProcessTexture=" + this.assetPath);
    }
 
 
    public void OnPostprocessAudio(AudioClip clip)
    {
 
    }

    public void OnPreprocessAudio()
    {
        AudioImporter audio = this.assetImporter as AudioImporter;
        //audio. = AudioCompressionFormat.MP3;
    }

    //所有的资源的导入,删除,移动,都会调用此方法,注意,这个方法是static的
    public static void OnPostprocessAllAssets(string[] importedAsset, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
    {
        Debug.Log("OnPostprocessAllAssets");
        foreach (string str in importedAsset)
        {
            Debug.Log("importedAsset = " + str);
        }
        foreach (string str in deletedAssets)
        {
            Debug.Log("deletedAssets = " + str);
        }
        foreach (string str in movedAssets)
        {
            Debug.Log("movedAssets = " + str);
        }
        foreach (string str in movedFromAssetPaths)
        {
            Debug.Log("movedFromAssetPaths = " + str);
        }
    }
}

 

Unity预处理在开发中,尤其是跨平台开发中十分重要。它的作用主要体现在跨平台开发,由于不同平台(如安卓版、苹果版、PC版等)可能需要进行不同的操作,利用Unity的自带平台宏定义方式进行平台判断,从而在不同平台执行特定代码[^1]。 Unity预处理的使用方法如下: 在代码中使用条件编译指令,根据不同的平台宏定义来执行不同的代码块。例如下面的代码展示了如何使用平台宏定义进行不同平台的输出: ```csharp using UnityEngine; using System.Collections; public class Test : MonoBehaviour { void Start() { #if UNITY_EDITOR Debug.Log("只在编辑器中输出"); #endif #if UNITY_ANDROID Debug.Log("Android平台中输出"); // 你定义的方法也在这里面,编辑器也不会帮你智能提示的 #elif UNITY_STANDALONE_OSX Debug.Log("OSX平台中输出"); #endif // 不在Unity编辑器,IOS和android系统上面 #if (UNITY_IOS || UNITY_ANDROID) Debug.Log("IOS 和 安卓上面"); #else #endif } } ``` 上述代码中,`#if`、`#elif`、`#endif` 等就是条件编译指令,`UNITY_EDITOR`、`UNITY_ANDROID`、`UNITY_STANDALONE_OSX`、`UNITY_IOS` 是Unity定义的平台宏。当代码在不同平台编译,会根据当前平台的宏定义来决定执行哪些代码块[^2]。 另外,在资源导入预处理方面,可通过继承 `AssetPostprocessor` 类并重写相关方法来实现。例如,下面的代码实现了对导入纹理资源预处理: ```csharp public class MyTexturePostprocessor : AssetPostprocessor { void OnPreprocessTexture() { Debug.Log(assetPath); if (assetPath.Contains("_bumpmap")) { TextureImporter textureImporter = (TextureImporter)assetImporter; textureImporter.convertToNormalmap = true; textureImporter.textureType = TextureImporterType.NormalMap; } } } ``` 这段代码会在导入纹理资源,判断资源路径是否包含 `_bumpmap`,如果包含则将其转换为法线贴图类型[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值