在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. 取出表A中第31到第40记录
  2. python爬虫抓取图片-python网络爬虫源代码(可直接抓取图片)
  3. 第07课:动手实战基于 ML 的中文短文本聚类
  4. python截取字符串函数substr_PHP substr():截取字符串
  5. SQL Server 2008存储结构之GAM、SGAM
  6. Linux 分区管理与swqp与逻辑卷创建修改删除
  7. LUA验证系统PHP,用Nginx+Lua实现高性能、高可靠、安全的登陆验证
  8. 圆拟合与点云数据球拟合算法
  9. Nagios客户端的安装步骤(要监控的服务器)
  10. android 字符串 转json,从字符串到json对象的转换android
  11. 安装NIVIDIA CUDA toolkit
  12. 怎样将excel表格合并
  13. flutter 单线程异步 及 isolate 使用过程遇到的问题
  14. 奇怪,发不出去,只能截图发了
  15. 转载:Ceph论文译文
  16. 防止FPGA设计中综合后的信号被优化
  17. 默哀日网站置灰,支持IE浏览器h5
  18. 再论牛逼、装逼、傻逼的区别
  19. 我是如何做到自律的?
  20. VSCode代码格式化快捷键及保存时自动格式化

热门文章

  1. javaagent的优势
  2. 计算机学术会议英语作文,计算机专业资料——重要国际学术会议
  3. python的flask实现接口_python+flask:实现POST接口功能
  4. 只腐蚀毛刺 腐蚀算法_工件刺虽小,去除却难!介绍几种先进去毛刺工艺,操作简单实用...
  5. Lambda表达式只是一颗语法糖?
  6. iOS:主流启动优化方案浅析
  7. Python实现8中常用排序算法
  8. 十三、结构类型(5)——联合
  9. Java中的Filter过滤器
  10. spring mvc 返回json的配置