在Unity编辑器的Scene视图进行控制播放Animator,可以借助方法StartPlayback、StopPlayback、StartRecording和StopRecording,具体可以参照以下例子:

创建一个带Controller的Animator对象,可以看到此时人物呈现T型姿势。附上新脚本EditAnimator,此为空脚本,如下:
C# Code 
1
2
3
4
5
6
using UnityEngine;

public class EditAnimator : MonoBehaviour 
{
}

创建一个这个脚本的编辑器类EditAnimatorInspector,代码如下:

C# Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
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",即可以自动播放整个动画,如下所示:

Unity 编辑器下控制播放Animator相关推荐

  1. Unity 编辑器下运行没有声音

    Unity 编辑器下运行没有声音 一.环境 Mac 二.问题 游戏场景中导入一个音频文件运行时没有声音 三.原因 按下去运行时就没有声音了 四.解题过程 1.Mac本身似乎没有能够单独控制某个软件的音 ...

  2. Unity3D中项目在Unity编辑器下正常运行打包成功exe后无法正常运行

    Unity3D中项目在Unity编辑器下正常运行打包成功exe后无法正常运行 一.遇到的情况描述: 项目中涉及到了文件读取的相关操作 项目在Unity下能够正常获取到文件信息并且不报错 项目能够成功打 ...

  3. Unity编辑器下Console面板查看完整打印日志

    最近在做客户端遇到这样一个问题,对于Console面板上的打印日志,每条打印的内容是有上限的,比如我有一个包含100个国王信息的消息打印日志 往下拖动 划到底也只是显示了63条国王信息. 解决方法: ...

  4. Unity编辑器下红点树实现方案

    背景 开发过程中,经常会对装备,背包,邮件等按钮设置红点状态,内部的查看状态,影响外部红点状态,这时候加入红点树方案,会方便,快捷,易于管理.上篇文章的方案不是最佳,刚好发现一种比较不错的方案. 操作 ...

  5. Unity编辑器下添加圆锥模型

    网上资料已经有了,生成圆锥的模型的代码,但是没有保存生成的Mesh,运行会看不到圆锥的,所以这里将代码改了一下将生成的圆锥保存到工程的一个路径里,下面是生成圆锥的代码Mesh的代码. using Sy ...

  6. 实现Unity编辑器模式下的旋转

    最近在做一个模型展示的项目,我的想法是根据滑动屏幕的x方向差值和Y方向的差值,来根据世界坐标下的X轴和Y轴进行旋转,但是实习时候总是有一些卡顿.在观察unity编辑器下的旋转之后,发现编辑器下的旋转非 ...

  7. unity 手机端和编辑器下播放带有透明通道的视频详解

    unity 手机端和编辑器下播放带有透明通道的视频详解 在项目开发中,可能会涉及到视频的播放,普通的视频播放如果大家不会的请自行百度,今天主要讲解带有透明通道的视频的播放问题,尤其是在手机端的处理,下 ...

  8. Unity(三十九):非运行状态下脚本播放动画、Animator Override Controller、RuntimeAnimatorController

    非运行状态下脚本播放动画 脚本 using UnityEngine;namespace Example_01.Scripts {[RequireComponent(typeof(Animator))] ...

  9. Unity环境下RTMP推流+RTMP播放低延迟解决方案

    在本文之前,我们发布了Unity环境下的RTMP推流(Windows平台+Android平台)和RTMP|RTSP拉流(Windows平台+Android平台+iOS平台)低延迟的解决方案,今天做个整 ...

  10. Unity 视屏播放插件AvProVideo-鼠标控制播放、暂停和更换视频!

    Unity学习 - 视屏播放插件AvProVideo-鼠标控制播放.暂停和更换视频! 一:前言 二:效果图 三:插件资源下载 四:资源导入程序 五:手机上在线播放视频 六:Demo下载 七:关注公主号 ...

最新文章

  1. __name__ ==“ __main__”怎么办?
  2. Linux学习之033_2
  3. Windows下 jupyter notebook 运行multiprocessing 报错的问题与解决方法
  4. typora用什么文档管理_会展经济与管理专业自考本科毕业后有什么用
  5. Android 系统(58)---Android 系统 UI - SystemUI之功能介绍和UI布局实现
  6. mysql三高讲解(二):2.8 mysql视图相关概念
  7. Halcon产品描述
  8. 如何使用cURL一次测量请求和响应时间?
  9. 使用 LaTeX 绘制 PGM(Probabilistic Graphical Models)中的贝叶斯网络(bayesian networks)
  10. 彻底解决VS中找不到 Windows SDK 版本 8.1的错误
  11. 安装IDEA,还有插件推荐
  12. Perl脚本常用操作
  13. python查询电脑序列号 CPU、主板、硬盘、MAC、BIOS
  14. java 检测usb_如何从android中检测和打印USB打印机
  15. windows cmd批处理终端 快速编辑模式
  16. edge浏览器安装扩展插件报错:出现错误Download interrupted
  17. html caption属性,HTML caption align 属性 | 菜鸟教程
  18. 基于单片机的智能照明灯系统
  19. WFD_RTSP交互包分析
  20. 计算机专业的可迁移技能,动词可迁移技能的发现.PPT

热门文章

  1. 流量计算机组成keypad,曾经的我
  2. rest风格使用两个变量_SpringBoot2.x系列教程|构建RESTful风格的API接口
  3. 图片夹_【第8期】EHS大咖答疑解惑吊运事故的罪魁祸首之一:钢丝绳夹!不看不知道!...
  4. jstree取消勾选_zTree 节点勾选取消勾选 选中取消选中
  5. 用C#在Visual Studio写Javascript单元测试
  6. 关于block的回调使用-防止内存泄露问题
  7. 杰出的橙色网站设计案例
  8. git上传本地文件方法
  9. hbase 安装_如何搭建一个HBase集群
  10. Compile syslog-win32