这篇文章主要介绍Unity编辑器下如何控制播放Animator,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
在Unity编辑器的Scene视图进行控制播放Animator,可以借助方法StartPlayback、StopPlayback、StartRecording和StopRecording,具体可以参照以下例子:
创建一个带Controller的Animator对象,可以看到此时人物呈现T型姿势。附上新脚本EditAnimator,此为空脚本,如下:
using UnityEngine;
public class EditAnimator : MonoBehaviour
{
}
创建一个这个脚本的编辑器类EditAnimatorInspector,代码如下:
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(EditAnimator))]
public class EditAnimatorInspector : 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;
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 || animator == null)
{
return;
}
const float frameRate = 30f;
const int frameCount = (int)((kDuration * frameRate) + 2);
animator.Rebind();
animator.StopPlayback();
animator.recorderStartTime = 0;
// 开始记录指定的帧数
animator.StartRecording(frameCount);
for (var i = 0; i < frameCount - 1; i++)
{
// 这里可以在指定的时间触发新的动画状态
if (i == 200)
{
animator.SetTrigger("Dance");
}
// 记录每一帧
animator.Update(1.0f / frameRate);
}
// 完成记录
animator.StopRecording();
// 开启回放模式
animator.StartPlayback();
m_HasBake = true;
m_RecorderStopTime = animator.recorderStopTime;
}
/// <summary>
/// 进行预览播放
/// </summary>
private void play()
{
if (Application.isPlaying || animator == null)
{
return;
}
bake();
m_RunningTime = 0f;
m_Playing = true;
}
/// <summary>
/// 停止预览播放
/// </summary>
private void stop()
{
if (Application.isPlaying || animator == null)
{
return;
}
m_Playing = false;
m_CurTime = 0f;
}
/// <summary>
/// 预览播放状态下的更新
/// </summary>
private void update()
{
if (Application.isPlaying || animator == null)
{
return;
}
if (m_RunningTime > m_RecorderStopTime)
{
m_Playing = false;
return;
}
// 设置回放的时间位置
animator.playbackTime = m_RunningTime;
animator.Update(0);
m_CurTime = m_RunningTime;
}
/// <summary>
/// 非预览播放状态下,通过滑杆来播放当前动画帧
/// </summary>
private void manualUpdate()
{
if (animator && !m_Playing && m_HasBake && m_CurTime < m_RecorderStopTime)
{
animator.playbackTime = m_CurTime;
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();
}
}
}
检视器效果如下:
点击"Bake",可以看到此时人物姿势变成了动画状态的第一帧,如下所示:
拖动滑杆,即可播放当前时间的那一帧,如下所示:
点击"Play",即可以自动播放整个动画,如下所示:
最后,u3dnotes.com温馨提示:通过Unity3d的Wwindow->Animation窗口,可方便地在编辑器线下非运行时预览乃至编辑动画。xD
以上是“Unity编辑器下如何控制播放Animator”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4589456/blog/4614912