在某些情况下,我们需要把物体的运动状态,材质变化等信息录制下来存储到Clip中。比如说,用到ITween、DoTween等插件控制物体运动,然后想把运动的过程记录下来。就需要在Editor Runtime下进行一些操作来达到我们的目的。所幸Unity提供了一套还比较完善的API供我们使用。接下来就介绍一下步骤。
首先我们需要知道Unity支持的API,叫做GameObjectRecorder
(类库是:UnityEditor.Animations,Unity 2018测试)。接下来只需要三步就可以完成。
创建GameObjectRecorder
类型的实例。
调用GameObjectRecorder
实例的方法 BindComponentOfType(GameObject , )绑定需要录制的组件,然后调用TakeSnapshot(Time.deltaTime),进行录制。这里要注意GameObject参数是录制Clip的根节点,如果要录制的动画层级很多,一定要把这个参数设为根节点。不然录制的Clip层级不对。
调用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,到这里就完成了录制某个物体的运动、材质变化、等等一切可以被录制成动画的信息。