Unity Animation ---Unity中录制某个物体的运动到AnimationClip(一)

在某些情况下,我们需要把物体的运动状态,材质变化等信息录制下来存储到Clip中。比如说,用到ITween、DoTween等插件控制物体运动,然后想把运动的过程记录下来。就需要在Editor Runtime下进行一些操作来达到我们的目的。
所幸Unity提供了一套还比较完善的API供我们使用。接下来就介绍一下步骤。
首先我们需要知道Unity支持的API,叫做GameObjectRecorder(类库是:UnityEditor.Animations,Unity 2018测试)。接下来只需要三步就可以完成。

  1. 创建GameObjectRecorder类型的实例。

  2. 调用GameObjectRecorder实例的方法 BindComponentOfType(GameObject , )绑定需要录制的组件,然后调用TakeSnapshot(Time.deltaTime),进行录制。这里要注意GameObject参数是录制Clip的根节点,如果要录制的动画层级很多,一定要把这个参数设为根节点。不然录制的Clip层级不对。

  3. 调用GameObjectRecorder实例的方法SaveToClip(AnimationClip),把绑定的帧存储在Clip中。
    代码如下:

using UnityEngine;
using UnityEditor.Animations;

public class RecordTransformHierarchy : MonoBehaviour
{
    public AnimationClip clip;

    private GameObjectRecorder m_Recorder;

    void Start()
    {
        // Create recorder and record the script GameObject.
        m_Recorder = new GameObjectRecorder(gameObject);

        // Bind all the Transforms on the GameObject and all its children.
        //这里的Bind操作,可以绑定各种UnityEngine的类型,比如MeshRender之类,
        //绑定之后就可以记录这个类型的值了。这里参数还需要注意,gameObject是Root节点,
        //如果要录制的物体有很多层级的话,最好参数设置为根节点。不然层级信息不对在Clip中无法播放。
        m_Recorder.BindComponentsOfType<Transform>(gameObject, true);
    }

    void LateUpdate()
    {
        if (clip == null)
            return;

        // Take a snapshot and record all the bindings values for this frame.
        m_Recorder.TakeSnapshot(Time.deltaTime);
    }

    void OnDisable()
    {
        if (clip == null)
            return;

        if (m_Recorder.isRecording)
        {
            // Save the recorded session to the clip.
            m_Recorder.SaveToClip(clip);
        }
    }
}

准备好代码之后,可以把代码直接绑定到要录制的物体上,然后Play。之后就可以录制物体的动画文件了。下边是录制了Meshrenderer的BlendShape信息:
在这里插入图片描述
OK,到这里就完成了录制某个物体的运动、材质变化、等等一切可以被录制成动画的信息。有问题请留言哦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章