Unity 之 自动设置导入资源属性选项(模型、图片、声音)

在项目开发中会经常性的更换、导入很多资源,而且对于资源的设置容易出现设置错误或者忘记设置的情况,下面的Code是用untyi自带的AssetPostprocessor功能把导入的资源根据一定的规则自动设置对应的格式选项,使用的时候也很方便,只需要把脚本放在Editor文件夹下就可以

代码有相应的注释 可根据项目需求自定义即可,例如按照下面代码的例子是图片名称含有_UI字段的情况下(不分大小写),图片对应的TextureType自动设置成Sprite,音频之类的也是类似这种机制,模型方面会有精度压缩,在不影响模型效果的情况下降低对应的Asstbundle包体

简单示例如下

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
using System.Text.RegularExpressions;
using System;

public class EditorResourceSetting : AssetPostprocessor
{

    #region 模型处理
    //模型导入之前调用  
    public void OnPreprocessModel()
    {
        Debuger.Log("模型导入之前调用=" + this.assetPath);
        ModelImporter modelImporter = (ModelImporter)assetImporter;
        //模型优化
        //modelImporter.optimizeMesh = true;
        modelImporter.optimizeGameObjects = true;
        modelImporter.animationCompression = ModelImporterAnimationCompression.Optimal;
        modelImporter.animationRotationError = 1.0f;
        modelImporter.animationPositionError = 1.0f;
        modelImporter.animationScaleError = 1.0f;
    }
    //模型导入之后调用  
    public void OnPostprocessModel(GameObject go)
    {

        // for skeleton animations.
        Debuger.Log("模型导入之后调用  ");
        List<AnimationClip> animationClipList = new List<AnimationClip>(AnimationUtility.GetAnimationClips(go));
        if (animationClipList.Count == 0)
        {
            AnimationClip[] objectList = UnityEngine.Object.FindObjectsOfType(typeof(AnimationClip)) as AnimationClip[];
            animationClipList.AddRange(objectList);
        }

        foreach (AnimationClip theAnimation in animationClipList)
        {
            try
            {
                //  去除scale曲线
                //foreach (EditorCurveBinding theCurveBinding in AnimationUtility.GetCurveBindings(theAnimation))
                //{
                //    string name = theCurveBinding.propertyName.ToLower();
                //    if (name.Contains("scale"))
                //    {
                //        AnimationUtility.SetEditorCurve(theAnimation, theCurveBinding, null);
                //    }
                //}

                // 浮点数精度压缩到f3
                AnimationClipCurveData[] curves = null;
                curves = AnimationUtility.GetAllCurves(theAnimation);
                Keyframe key;
                Keyframe[] keyFrames;
                for (int ii = 0; ii < curves.Length; ++ii)
                {
                    AnimationClipCurveData curveDate = curves[ii];
                    if (curveDate.curve == null || curveDate.curve.keys == null)
                    {
                        //Debuger.LogWarning(string.Format("AnimationClipCurveData {0} don't have curve; Animation name {1} ", curveDate, animationPath));
                        continue;
                    }
                    keyFrames = curveDate.curve.keys;
                    for (int i = 0; i < keyFrames.Length; i++)
                    {
                        key = keyFrames[i];
                        key.value = float.Parse(key.value.ToString("f3"));
                        key.inTangent = float.Parse(key.inTangent.ToString("f3"));
                        key.outTangent = float.Parse(key.outTangent.ToString("f3"));
                        keyFrames[i] = key;
                    }
                    curveDate.curve.keys = keyFrames;
                    theAnimation.SetCurve(curveDate.path, curveDate.type, curveDate.propertyName, curveDate.curve);
                    Debuger.Log("设定数值");
                }
            }
            catch (System.Exception e)
            {
                Debuger.LogError(string.Format("CompressAnimationClip Failed !!! animationPath : {0} error: {1}", assetPath, e));
            }
        }
    }
    #endregion

    #region 纹理处理

    /// <summary>
    /// 检索Texture的类型是否为Sprite
    /// </summary>
    private string RetrivalTextureType = @"[_][Uu][Ii]";
    /// <summary>
    /// 检索Texture的MaxSize大小
    /// </summary>
    private string RetrivalTextureMaxSize = @"[&]\d{2,4}";
    /// <summary>
    /// 检索Texture是否为带Alpha通道
    /// </summary>
    private string RetrivalTextureIsAlpha = @"[Aa][Ll][Pp][Hh][Aa]";

    //纹理导入之前调用,针对入到的纹理进行设置
    public void OnPreprocessTexture()
    {
        string dirName = System.IO.Path.GetDirectoryName(assetPath);
        Debuger.Log(dirName);//从Asset开始的目录信息
        string folderStr = System.IO.Path.GetFileName(dirName);
        Debuger.Log(folderStr);//最近文件夹信息
        TextureImporter textureImporter = (TextureImporter)assetImporter;
        Debuger.Log(assetPath);//从Asset开始全路径
        string FileName = System.IO.Path.GetFileName(assetPath);
        Debuger.Log("导入文件名称:" + FileName);
        string[] FileNameArray = FileName.Split(new string[] { "_" }, System.StringSplitOptions.RemoveEmptyEntries);

        //含有UI指定字符,此图片是的类型为Sprite
        if (Regex.IsMatch(FileName, RetrivalTextureType))
        {
            Debuger.Log("含有指定字符");
            textureImporter.textureType = TextureImporterType.Sprite;
            textureImporter.mipmapEnabled = false;
        }
        else
        {
            textureImporter.textureType = TextureImporterType.Default;
            //textureImporter.mipmapEnabled = true;
        }

        //判断是否使用Alpha通道
        if (Regex.IsMatch(FileName, RetrivalTextureIsAlpha))
        {
            textureImporter.alphaIsTransparency = true;
        }
        else
        {
            textureImporter.alphaIsTransparency = false;
        }

        // 设置MaxSize尺寸
        Regex tempRegex = new Regex(RetrivalTextureMaxSize);
        if (tempRegex.IsMatch(FileName))
        {
            string MaxSizeStr = tempRegex.Match(FileName).Value.Replace("&", "");
            int TempMaxSize = Convert.ToInt32(MaxSizeStr);
            if (TempMaxSize < 50)
            {
                TempMaxSize = 32;
            }
            else if (TempMaxSize < 100)
            {
                TempMaxSize = 64;
            }
            else if (TempMaxSize < 150)
            {
                TempMaxSize = 128;
            }
            else if (TempMaxSize < 300)
            {
                TempMaxSize = 256;
            }
            else if (TempMaxSize < 600)
            {
                TempMaxSize = 512;
            }
            else
            {
                TempMaxSize = 1024;
            }
            textureImporter.maxTextureSize = TempMaxSize;
            Debuger.Log("设置的Texture尺寸为:" + TempMaxSize);
        }



        #region         -------------------------根据平台分别设置-------------------------------------
        // Debuger.Log("名称:" + textureImporter.GetDefaultPlatformTextureSettings().name);
        // TextureImporterPlatformSettings TempTexture = new TextureImporterPlatformSettings();
        // TempTexture.overridden = true;
        // TempTexture.name = "Android";
        // TempTexture.maxTextureSize = 512;
        // TempTexture.format = TextureImporterFormat.ETC_RGB4;
        // textureImporter.SetPlatformTextureSettings(TempTexture);
        // textureImporter.wrapMode = TextureWrapMode.Clamp;


        //textureImporter.maxTextureSize = 1024;
        //textureImporter.textureCompression = TextureImporterCompression.Compressed;
        //textureImporter.crunchedCompression = true;
        //textureImporter.compressionQuality = 60;
        #endregion
    }
    public void OnPostprocessTexture(Texture2D tex)
    {
        Debuger.Log("导入" + "tex" + "图片后处理");
    }

    void OnPostprocessSprites(Texture2D texture, Sprite[] sprites)
    {
        Debuger.Log("Sprites: " + sprites.Length);
        Debuger.Log("Texture2D: " + texture.name);
    }
    #endregion

    #region 音频处理
    public void OnPreprocessAudio()
    {
        Debuger.Log("音频导前预处理");

        AudioImporterSampleSettings AudioSetting = new AudioImporterSampleSettings();
        //加载方式选择
        AudioSetting.loadType = AudioClipLoadType.CompressedInMemory;
        //压缩方式选择
        AudioSetting.compressionFormat = AudioCompressionFormat.Vorbis;
        //设置播放质量
        AudioSetting.quality = 0.1f;
        //优化采样率
        AudioSetting.sampleRateSetting = AudioSampleRateSetting.OptimizeSampleRate;


        AudioImporter audio = assetImporter as AudioImporter;
        //开启单声道 
        audio.forceToMono = true;
        audio.preloadAudioData = true;
        audio.defaultSampleSettings = AudioSetting;

    }
    public void OnPostprocessAudio(AudioClip clip)
    {
        Debuger.Log("音频导后处理");
    }
    #endregion

    #region 其他处理
    //所有的资源的导入,删除,移动,都会调用此方法,注意,这个方法是static的  (这个是在对应资源的导入前后函数执行后触发)
    //public static void OnPostprocessAllAssets(string[] importedAsset, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
    //{
    //    Debuger.Log("EditorResourceSetting", "有文件处理");

    //    foreach (string str in importedAsset)
    //    {
    //        Debuger.Log("导入文件 = " + str);

    //    }
    //    foreach (string str in deletedAssets)
    //    {
    //        Debuger.Log("删除文件 = " + str);
    //    }
    //    foreach (string str in movedAssets)
    //    {
    //        Debuger.Log("移动后文件 = " + str);
    //    }
    //    foreach (string str in movedFromAssetPaths)
    //    {
    //        Debuger.Log("移动前文件 = " + str);
    //    }
    //}
    /// <summary>
    /// 在对应的资源已经设置Assetbundle名称后更改其名称触发
    /// </summary>
    /// <param name="assetPath"></param>
    /// <param name="previousAssetBundleName"></param>
    /// <param name="newAssetBundleName"></param>
    public void OnPostprocessAssetbundleNameChanged(string assetPath, string previousAssetBundleName, string newAssetBundleName)
    {
        Debuger.Log("AssetBundle资源 " + assetPath + " 从名称: " + previousAssetBundleName + " 变更到: " + newAssetBundleName + ".");
    }

    /// <summary>
    /// 模型 max、maya数值相关
    /// </summary>
    /// <param name="go"></param>
    /// <param name="propNames"></param>
    /// <param name="values"></param>
    void OnPostprocessGameObjectWithUserProperties(GameObject go, string[] propNames, System.Object[] values)
    {
        //for (int i = 0; i < propNames.Length; i++)
        //{
        //    string propName = propNames[i];
        //    System.Object value = (System.Object)values[i];

        //    Debug.Log("Propname: " + propName + " value: " + values[i]);

        //    if (value.GetType().ToString() == "System.Int32")
        //    {
        //        int myInt = (int)value;
        //        // do something useful
        //    }

        //    // etc...
        //}
    }
    /// <summary>
    /// 模型 贴图相关
    /// </summary>
    /// <param name="material"></param>
    /// <param name="renderer"></param>
    public void OnAssignMaterialModel(Material material, Renderer renderer)
    {
        //Debug.Log("OnAssignMaterialModel");
    }

    //void OnPostprocessMaterial(Material material)
    //{
    //    material.color = Color.red;
    //    Debuger.Log("更改材质球");
    //}


    //将该函数添加到子类中,以便在导入模型(.fbx,.mb文件等)的动画之前获取通知。    这使您可以通过代码控制导入设置。
    void OnPreprocessAnimation()
    {
        //Debuger.Log("OnPreprocessAnimation");
        //var modelImporter = assetImporter as ModelImporter;
        //modelImporter.clipAnimations = modelImporter.defaultClipAnimations;
    }

    //private uint m_Version = 0;
    //public override uint GetVersion() { return m_Version; }
    #endregion

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,103评论 4 62
  • 今天因为回款的问题,一下子掉到情绪里面了。 我看到自己焦虑,委屈发牢骚而且哭了,在看《接纳力》里面这些...
    徐丽红阅读 156评论 1 0
  • 有人信仰权力。 有人信仰友情。 而沈炼信仰的是一个女人。 一个不属于他的女人。 江湖人称北斋先生。她是山水画师,画...
    宁木紫菀阅读 384评论 0 2
  • 我喜欢萧红,因为她写了呼兰河传,呼兰河传是最平凡的故事,却是这个世界上最暖的文字,美好中透着悲凉,浪漫的像一首诗。...
    ii南有乔木阅读 428评论 1 4
  • 我是彦彦,这是我的每天一篇原创文章之第66篇。 我最近正在写我的第一本书。写着写着发现总是缺点什么? 于是我苦思冥...
    彦值圈阅读 291评论 1 0