在Unity中修改Fbx中的动画文件

来源:互联网 发布:unity3d导入贴图 编辑:程序博客网 时间:2024/05/14 08:57

在Unity中修改Fbx中的动画文件

背景

  • Unity导入fbx格式分为Avatar model、 Animation fbx
  • 为了进行骨架加点优化,将所有的model都选用了GameObject optimied ,所有的childer Transform 在hierarchy中不可见
  • 在animator controller中看到的所有animationclip中的节点都是丢失的,并且animationclip是readOnly的,不能修改
  • 不能在Ediotr中拖动animationclip来实现动画预览

需求

  • 能够在Editor中通过拖动animationClip来进行动画预览
  • 能够简单的编辑AnimationClip中的动画节点,例如:拖动,删除,增加
  • 对animtor controller逻辑无影响

流程

  • 打开AnimationClip Helper Window
  • 选中当前需要操作的Avatar
  • 选中当前Avator的动画文件对应的fbx目录–【修改为直接选取一个Animator Controller】
        controller = FindController(AssetDatabase.GetAssetPath(animatorFolder));        if (null != controller)        {            AnimatorController ac = controller as AnimatorController;            AnimatorStateMachine sm = (ac != null ? ac.layers[0].stateMachine : null);//这里只考虑第一层,因为不需要有多层            int count = (sm != null ? sm.states.Length : 0);            for (int i = 0; i < count; i++)            {                Motion mt = sm.states[i].state.motion;                if (mt != null)                {
  • 将所有的动画fbx中的Animation Clip段copy到一个新的目录【do Once】
private AnimationClip CreateMotion(Motion mt)    {        AnimationClip sourceClip = mt as AnimationClip;        string path = AssetDatabase.GetAssetPath(sourceClip);        path = Path.Combine(Path.GetDirectoryName(path), sourceClip.name) + ".anim";        string newPath = newAnimClipsPath + "/" + sourceClip.name + ".anim";        AnimationClip newClip = new AnimationClip();        EditorUtility.CopySerialized(sourceClip, newClip);        newClip = Compress(newClip);        AssetDatabase.CreateAsset(newClip, newPath);        return newClip;    }     static AnimationClip Compress(AnimationClip clip)    {        AnimationClipCurveData[] curves = AnimationUtility.GetAllCurves(clip);        Keyframe key;        Keyframe[] keyFrames;        foreach (AnimationClipCurveData curveDate in curves)        {            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;            clip.SetCurve(curveDate.path, curveDate.type, curveDate.propertyName, curveDate.curve);        }        return clip;    }
  • 重新绑定animator controller中的Animation Clip的引用
  • 修改当前的avator的GameObject optimied选项为false
    string path = AssetDatabase.GetAssetPath(animator.avatar);    ModelImporter model = AssetImporter.GetAtPath(path) as ModelImporter;    if (model.optimizeGameObjects != optimized)    {        model.optimizeGameObjects = optimized;        AssetDatabase.ImportAsset(path);    }
  • 在hierarchy中创建当前角色mesh的GameObject
  • 打开Animation编辑器,因为取消了Avatar的Gameobject Optimied选项,所以当前的Animation Clip是可见与可编辑的
  • 切换Avatar时,删除Hierarchy中的Avatar GameObject,
  • 修改Avatar的GameObject Optimied选项为true【重新optimied的时候,虽然不能在Editor模式下直接预览Animation Clip了,但是在RunTIme模式下,Animator Controller还是能够正常运行的!】

优化

  • 因为所有的Animation Clip是Copy出来的,已经与美术提供的动画Fbx文件解除绑定,所以如果美术重新修改了Fbx的动画片段,那么对应的AnimationClip需要自己手动修改
  • 把之前的AnimationClip的文件md5信息记录下来,当资源re-import的时候,如果md5信息变化了,则提示用户修改!
  • 能否自动修改?这个比较复杂
0 0
原创粉丝点击