PlayAnimator

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();
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值