开发中时时必要,对绘画模型举办部分拍卖。(以fbx为例)

  例如,供给把动作的名字、start和end参预animations的clips。

  假设手动操作,正是在模型的Inspector窗口,2个动作点一遍加号,然后编辑start和end。2个模子往往十7个动作,那样做很扎眼浪费人力。

  由此须求3个足以活动导入帧数表的工具,工具应该有所一下职能。

  壹、依据布置(txt大概json)自动安装模型参数

  配置的格式依据使用习惯,txt、json都足以,那里运用txt。用File.ReadAllLines(“路径”),可以获取配置的每一行音讯,只要依照规定办法填写,就足以分析出大家想要的参数。

  例如 动作名+制表符+start+制表符+end。

  二、每一次导入模型时,自动生效

  继承了AssetPostprocessor,并且放置艾德itor目录下,每一遍能源产生变动时会自动调用里面包车型地铁方法。

  三、批量拍卖每二个动作。

  如下,将首先步取出来的参数,用下边方法填入clip列表中,然后复制给模型的ModelImporter的clipAnimations。

 public class clipArrayListCreater
    {
        private List<ModelImporterClipAnimation> clipList = new List<ModelImporterClipAnimation>();
        public void addClip(string name, int firstFrame, int lastFrame, bool loop, WrapMode wrapMode)
        {
            ModelImporterClipAnimation tempClip = new ModelImporterClipAnimation();
            tempClip.name = name;
            tempClip.firstFrame = firstFrame;
            tempClip.lastFrame = lastFrame;
            tempClip.loop = loop;
            tempClip.wrapMode = wrapMode;
            clipList.Add(tempClip);
        }
        public ModelImporterClipAnimation[] getArray()
        {
            return clipList.ToArray();
        }
    }

  5、设置模型类型和动作系统误差

  ModelImporter中多少个参数一般都在导入时须要处理,animationType
,animationCompression,animationPositionError
,**
animationRotationError,***animationScaleError 。*

  1般依照必要设置即可。

  有几点须要证实

  一、帧数表的命名供给肯定标准,如,模型名+“帧数表”,

  二、模型应该都放置内定目录,方便管理和工具集中处理。

  把代码放到工程里,路径依据本人的来,等待转菊达成,就duang的弹指帧数表自动导入了。

using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public class AssetsImportTools : AssetPostprocessor
{

    void OnPreprocessModel()
    {
        ModelImporter modelImporter = (ModelImporter)assetImporter;
        string lode = modelImporter.assetPath;
        if (lode.Contains("Assets/Avatars/FBX"))//模型目录
        {
       //模型类型和动作误差
            modelImporter.animationType = ModelImporterAnimationType.Legacy;
            modelImporter.animationCompression = ModelImporterAnimationCompression.KeyframeReduction;
            modelImporter.animationPositionError = 0.5f;
            modelImporter.animationRotationError = 0.5f;
            modelImporter.animationScaleError = 0.5f;
            lode = lode.Replace(".FBX", "帧数表.txt");
            if (!File.Exists(lode))
            {
                Debug.Log(lode + "不存在");
                return;
            }
            string[] modellist = File.ReadAllLines(lode);
            editorImporterUtil.clipArrayListCreater creater = new editorImporterUtil.clipArrayListCreater();
            for (int i = 0; i < modellist.Length; i++)
            {
                if (modellist[i].Contains("//") || string.IsNullOrEmpty(modellist[i]))//注释和空字符串跳过
                    continue;
                string[] s = modellist[i].Split('\t');//按照制表符切割为,名称 start end 是否循环(可选参数,非必填)
                if (s.Length < 3)
                {
                    if (EditorUtility.DisplayDialog("错误", "{0} 文件的第".EFormat(lode) + (i + 1) + "行出错", "确定"))
                    {
                        return;
                    }
                }
                bool isLoop = false;
                if (s[0] == "idle" )//循环的动作可以在这里设置,也可以在配置中设置
                    isLoop = true;
                else
                    isLoop = false;
                if (s.Length==4)
                {
                    if (!string.IsNullOrEmpty(s[3]))
                    {
                        isLoop = s[3] == "1";
                    }
                }
                if (isLoop)
                    creater.addClip(s[0], int.Parse(s[1]), int.Parse(s[2]), false, WrapMode.Loop);
                else
                    creater.addClip(s[0], int.Parse(s[1]), int.Parse(s[2]), false, WrapMode.Default);
                modelImporter.clipAnimations = creater.getArray();
            }
        }
    }
}
namespace editorImporterUtil
{
    public class clipArrayListCreater
    {
        private List<ModelImporterClipAnimation> clipList = new List<ModelImporterClipAnimation>();
        public void addClip(string name, int firstFrame, int lastFrame, bool loop, WrapMode wrapMode)
        {
            ModelImporterClipAnimation tempClip = new ModelImporterClipAnimation();
            tempClip.name = name;
            tempClip.firstFrame = firstFrame;
            tempClip.lastFrame = lastFrame;
            tempClip.loop = loop;
            tempClip.wrapMode = wrapMode;
            clipList.Add(tempClip);
        }
        public ModelImporterClipAnimation[] getArray()
        {
            return clipList.ToArray();
        }
    }
}

 

  

  

相关文章

网站地图xml地图