3dsMax制作弯曲动画导入Unity后弯曲动画丢失

1,008 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

问题描述

上图是在3ds中预览的效果,可以看见对上面的平面进行了一个bend变形操作。在输出为下图的FBX后,发现其他动画还保留,唯独bend动画丢失。 那么应该如何保留所有动画呢? 在这里插入图片描述 在这里插入图片描述

几种思路,一种是找到能导出导入的方法;第二种是平面动画改成在unity实现,两个动画结合起来;第三种是换个平台重新做动画,比如catia,但是如何导出导入尚不清楚;第四种是录屏,然后单击事件后播放视频。(2021/2/9发现问题)

目前的解决方式

(2021/2/28找到了解决方法) 网上下载了MegaFiers资源包,导入Unity后可对GameObject进行弯曲操作,当然还有各种其他操作,有诸多大佬讲解,不在此作为重点。

FBX文件导入到Unity,依然只有简单地动画而会丢失弯曲动画。所以保留其他动画的同时用Unity按Unity的方式建立物体和动画。 在这里插入图片描述 可以添加Bend组件,接着就可以根据需求录制动画了。 在这里插入图片描述

新出现的问题

事情并没有这么简单。

两组动画的整体性

由于普通动画和弯曲动画是分开来做的,所以失去了整体性。

刚导入的结构基本什么组件都没有。 在这里插入图片描述 可以打开这个三角 在这里插入图片描述 在里面找到它的动画,直接拖到物体上。 在这里插入图片描述 会发现生成了Animator组件 在这里插入图片描述 这和Animation还是有区别的,但是我不是很清楚。 (2021/3/3撰写)

如何控制动画的播放

结构动画的控制

刚导入结构时自带的Animator,启动后就开始播放动画Take 001,只播一次且不受控制。目标是实现可控制的动画播放。 在这里插入图片描述 尝试了一些方法后找到一个暂时可行的。 建立一个空状态New State,将New StateTake 001连接如图,设置成Boolrun切换。再使用代码控制。更详细的教程 在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 
/// </summary>
public class Drawtest : MonoBehaviour
{
    private Animator animator;
    private void Start()
    {
        animator = GetComponent<Animator>();
    }

    private void OnGUI()
    {
        if(GUILayout.Button("开始"))
        {
            animator.SetBool("run", true);
        }
        if (GUILayout.Button("停止"))
        {
            animator.SetBool("run", false);
        }

    }
}

效果如下 在这里插入图片描述

平面的弯曲动画

可以采取类似的方式控制,即用Animator控制。 所以将之前做的AnimationLegacy取消勾选,将平面的Animation组件删除,添加Animator组件,将之前的Skin动画添加到Animator中,其余操作类似。 在这里插入图片描述 也就是说用同一组代码可以分别实现对两者的控制。

如何同时控制

可见,如果都显示的话使用按钮不能实现两组动画的控制 在这里插入图片描述 原因是按钮叠加了。结构的开始停止两个按钮与平面的两个按钮重合了,也就是运行后分别生成了两组、四个按钮。

如何实现一个按钮同时控制两组动画

因为两个脚本分别控制的会生成两组按钮,为了使用一组按钮实现对两个动画的控制,需要整合到一个脚本中。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Drawtest : MonoBehaviour
{
    private Animator animator;
    private Animator childanimator;
    private GameObject skin;
    private void Start()
    {
        animator = GetComponent<Animator>();
        skin = GameObject.Find("Plane");
        childanimator = skin.GetComponent<Animator>();
    }


    private void OnGUI()
    {
        if(GUILayout.Button("开始"))
        {
            animator.SetBool("run", true);
            childanimator.SetBool("run", true);
        }
        if (GUILayout.Button("停止"))
        {
            animator.SetBool("run", false);
            childanimator.SetBool("run", false);
        }

    }
}

(2021/3/5撰写)