using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
public class PlayAnimator : Editor
{
/// <summary>
/// 滑动杆的当前时间
/// </summary>
private float m_CurTime;
/// <summary>
/// 是否已经烘培过
/// </summary>
private bool m_HasBake;
/// <summary>
/// 当前是否是预览播放状态
/// </summary>
private bool m_Playing;
/// <summary>
/// 当前运行时间
/// </summary>
private float m_RunningTime;
/// <summary>
/// 上一次系统时间
/// </summary>
private double m_PreviousTime;
/// <summary>
/// 总的记录时间
/// </summary>
private float m_RecorderStopTime;
/// <summary>
/// 滑动杆总长度
/// </summary>
private const float kDuration = 30f;
public List<GameObject> childs=new List<GameObject>();
private Animator m_Animator;
// private EditAnimator editAnimator { get { return target as EditAnimator; } }
//
// private Animator animator
// {
// get { return m_Animator ?? (m_Animator = editAnimator.GetComponent<Animator>()); }
// }
void OnEnable()
{
m_PreviousTime = EditorApplication.timeSinceStartup;
EditorApplication.update += inspectorUpdate;
}
void OnDisable()
{
EditorApplication.update -= inspectorUpdate;
}
public override void OnInspectorGUI()
{
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("Bake"))
{
m_HasBake = false;
bake();
}
if (GUILayout.Button("Play"))
{
play();
}
if (GUILayout.Button("Stop"))
{
stop();
}
EditorGUILayout.EndHorizontal();
m_CurTime = EditorGUILayout.Slider("Time:", m_CurTime, 0f, kDuration);
manualUpdate();
}
/// <summary>
/// 烘培记录动画数据
/// </summary>
private void bake()
{
if (m_HasBake)
{
return;
}
if (Application.isPlaying)
{
return;
}
for(int i=0;i<childs.Count;i++)
{
const float frameRate = 30f;
const int frameCount = (int)((kDuration * frameRate) + 2);
childs[i].GetComponent<Animator>().Rebind();
childs[i].GetComponent<Animator>().StopPlayback();
childs[i].GetComponent<Animator>().recorderStartTime = 0;
// 开始记录指定的帧数
childs[i].GetComponent<Animator>().StartRecording(frameCount);
for (var j = 0; j < frameCount - 1; j++)
{
// 这里可以在指定的时间触发新的动画状态
// if (j == 200)
// {
// childs[i].GetComponent<Animator>().SetTrigger("Dance");
// }
// 记录每一帧
childs[i].GetComponent<Animator>().Update(1.0f / frameRate);
}
// 完成记录
childs[i].GetComponent<Animator>().StopRecording();
// 开启回放模式
childs[i].GetComponent<Animator>().StartPlayback();
m_HasBake = true;
m_RecorderStopTime = childs[i].GetComponent<Animator>().recorderStopTime;
}
}
/// <summary>
/// 进行预览播放
/// </summary>
public void play()
{
if (Application.isPlaying)
{
return;
}
bake();
m_RunningTime = 0f;
m_Playing = true;
}
/// <summary>
/// 停止预览播放
/// </summary>
public void stop()
{
if (Application.isPlaying )
{
return;
}
m_Playing = false;
m_CurTime = 0f;
}
/// <summary>
/// 预览播放状态下的更新
/// </summary>
private void update()
{
if (Application.isPlaying)
{
return;
}
if (m_CurTime > m_RecorderStopTime)
{
m_Playing = false;
return;
}
// 设置回放的时间位置
for (int i=0; i<childs.Count; i++)
{
if(childs[i]!=null)
{
childs[i].GetComponent<Animator>().playbackTime = m_RunningTime;
childs[i].GetComponent<Animator>().Update (0);
}
}
m_CurTime = m_RunningTime;
}
/// <summary>
/// 非预览播放状态下,通过滑杆来播放当前动画帧
/// </summary>
private void manualUpdate()
{
for (int i=0; i<childs.Count; i++)
{
if ( !m_Playing && m_HasBake && m_CurTime < m_RecorderStopTime) {
childs[i].GetComponent<Animator>().playbackTime = m_CurTime;
childs[i].GetComponent<Animator>().Update (0);
}
}
}
private void inspectorUpdate()
{
var delta = EditorApplication.timeSinceStartup - m_PreviousTime;
m_PreviousTime = EditorApplication.timeSinceStartup;
if (!Application.isPlaying && m_Playing)
{
m_RunningTime = Mathf.Clamp(m_RunningTime + (float)delta, 0f, kDuration);
update();
}
}
}