一、动画窗口
通过 Window -->
Animation -->
Animation 打开 Animation 窗口
Animation窗口主要用于在 Unity 内部创建和修改动画,所有在场景中的对象都可以通过 Animation 窗口为其制作动画
原理:
制作动画时:记录在固定时间点对象挂载的脚本的变量变化
播放动画时:将制作动画时记录的数据在固定时间点进行改变,产生动画效果
动画时间轴:
每一个动画文件都有自己的一个生命周期,从动画开始到结束
我们可以在动画时间轴上编辑每一个动画生命周期中变化
动画中的帧:
假设某个动画的帧率为 60 帧每秒,意味着该动画 1 秒钟最多会有 60 次改变机会
每一帧的间隔时间是 1s / 60 ≈ 16.67 毫秒
也就是说 我们最快可以每 16.67 毫秒改变一次对象状态
关键帧:动画在时间轴上的某一个时间节点上处于的状态
![](https://i-blog.csdnimg.cn/blog_migrate/3697dbe218c187d840c8df745240ce01.png#pic_center)
- 预览模式(开关)
- 录制模式(开关),打开后预览模式默认开启
- 回到动画开头
- 上一个关键帧(快捷键:“,”)
- 播放动画(快捷键:“Alt” + “,”)
- 下一个关键帧(快捷键:“。”)
- 回到动画结尾(快捷键:“Alt” + “。”)
- 当前处于第几帧
- 按选择筛选
- 添加关键帧
- 添加事件
- 关键帧模式
- 曲线模式
二、创建与编辑动画
(一)创建动画
-
在场景中选中想要创建动画的对象
-
在 Animation 窗口中点击创建
-
选择动画文件将要保存到的位置
保存动画文件时,Unity 会帮助我们完成以下操作
-
创建一个 Animator Controller(动画控制器或称之为动画状态机)资源(新动画系统)
-
将新创建的动画文件添加到 Animator Controller 中
-
为动画对象添加 Animator 组件
-
为 Animator 组件关联创建的 Animator Controller 文件
(二)编辑动画
创建 Animation 文件后,点击对应的游戏对象,才可以编辑动画界面。在这里切换需要编辑的 Animation 文件
![](https://i-blog.csdnimg.cn/blog_migrate/46aea1ebec0ae69012d6408ace2dbb17.png#pic_center)
这里可以添加变化属性,也可以任意添加想要在动画中变化的脚本变量
![](https://i-blog.csdnimg.cn/blog_migrate/68369d81bb28e6d1ded0dfb48ff1249e.png#pic_center)
也可以在录制模式下直接选中对象修改其属性,Unity 会自动记录这样的改变
(三)曲线设置
点击 Curves,进入曲线设置。右键一个序列帧,会出现如下的参数:
![](https://i-blog.csdnimg.cn/blog_migrate/01f15e1cca977830dcc869be5d320cc6.png#pic_center)
- Delete Keys:删除关键帧
- Edit Keys:编辑关键帧
- Clamped Auto:切线模式,自动设置切线
- Auto:旧版切线模式,和 Clamped Auto 类似,主要用于老动画系统,建议不使用,除非是老动画
- Free Smooth:自由设置切线
- Flat:切线设置为水平
- Broken:单独控制左右曲线切线
- Left / Right / Both Tangent:切线的模式
- Free:自由设置
- Linear:直线
- Constant:常量切换
- Weighted:权重切换
(四)Animation 文件界面参数
点击 Animation 文件,在 Inspector 面板看到如下参数:
![](https://i-blog.csdnimg.cn/blog_migrate/5f4270d30db6485fd267046bc2e7c889.png#pic_center)
- Loop Time:是否循环播放
- Loop Pose:起点和终点是否无缝衔接
- Cycle Offset:循环动画在其他时间开始时的周期偏移
三、老动画系统
(一)老动画系统
Unity 中有两套动画系统
- 新:Mecanim 动画系统——主要用 Animator 组件控制动画
- 老:Animation 动画系统——主要用 Animation 组件控制动画(Unity4 之前的版本可能会用到)
目前我们为对象在 Animation 窗口创建的动画都会被新动画系统支配
有特殊需求或者针对一些简易动画,才会使用老动画系统
老动画系统主要用于处理老版本项目和简单的一些自制动画,新项目都不建议大家使用了
关键组件:Animation
注意:在创建动画之前为对象添加 Animation 组件之后再制作动画,这时制作出的动画和之前的动画格式是有区别的,创建动画时 Unity 不会自动生成动画状态机 Animator
同时,创建的动画文件中显示的参数也和之前的不一样
![](https://i-blog.csdnimg.cn/blog_migrate/8c9d530eabff9be3e6768a232da4cbc9.png#pic_center)
- Default:读取设置得到更高的默认重复模式
- Once:播放一次就停止,播放结束
- Loop:从头到尾不停循环播放
- PingPong:从头到尾、再从尾到头播放,不断循环
- ClampForever:播放结束后会停留在最后一帧,并且会一直播放最后一帧,状态不停止,一直在播放动画。表现效果和 Once 一样
(二)参数介绍
![](https://i-blog.csdnimg.cn/blog_migrate/4bc6bfff033be91592643bd9631c33b0.png#pic_center)
- Animation:默认播放的动画
- Animations:该动画组件可以控制的所有动画
- Play Automatically:是否一开始就自动播放默认动画
- Animate Physics:动画是否与物理交互
- Culling Type:决定什么时候不播放动画
- Always Animate:始终播放
- Based On Renderers:基于默认动画姿势剔除
(三)代码控制老动画系统
private Animation animation;
void Update()
{
// 1.播放动画
animation.Play("1");
animation.Play("2");
// 2.淡入播放,自动产生过渡效果
// 当你要播放的动画的开始状态 和当前的状态 不一样时
// 就会产生过渡效果
animation.CrossFade("3");
// 3.前一个播完再播放下一个
animation.PlayQueued("2");
animation.CrossFadeQueued("2");
// 4.停止播放所有动画
animation.Stop();
// 5.是否在播放某个动画
if (animation.IsPlaying("1")) { }
// 6.播放模式设置
animation.wrapMode = WrapMode.Loop;
// 7.其它(了解即可,新动画系统中会详细讲解)
// 层级和权重以及混合(老动画系统需要通过代码来达到动画的遮罩、融合等效果)
// 设置层级
animation["1"].layer = 1;
// 设置权重
animation["1"].weight = 1;
// 混合模式 叠加还是混合
animation["1"].blendMode = AnimationBlendMode.Additive;
// 设置混组相关骨骼信息
animation[""].AddMixingTransform();
}
(四)动画事件
动画事件主要用于处理,当动画播放到某一时刻想要触发某些逻辑,比如进行伤害检测、发射子弹、特效播放等等
![](https://i-blog.csdnimg.cn/blog_migrate/d8273ec2c48311484fc9061a6246c497.png#pic_center)
在 Inspector 面板中选择 Function 添加进事件,这里的 Function 需要我们自己在脚本中写方法挂载到对应物体上
![](https://i-blog.csdnimg.cn/blog_migrate/563d3b5c972ab1700b0645bcc5a2a1d9.png#pic_center)
四、Animator 窗口
(一)有限状态机(Finite - state machine,FSM)
又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型
有限:表示是有限度的不是无限的
状态:指所拥有的所有状态
举例说明:
假设我们人会做很多个动作,也就是有很多种状态,这些状态包括 站立、走路、跑步、攻击、防守、睡觉等等
我们每天都会在这些状态中切换,而且这些状态虽然多但是是有限的,当达到某种条件时,我们就会在这些状态中进行切换,而且这种切换时随时可能发生的
游戏开发中有很多功能系统都是有限状态机,最典型的状态机系统
动作系统 —— 当满足某个条件切换一个动作,且动作是有限的
AI(人工智能)系统 —— 当满足某个条件切换一个状态,且状态时有限的
所以状态机是游戏开发中一个必不可少的概念
(二)动画状态机窗口
创建动画状态机的两种方式:
- 通过为场景中物体创建动画时自动创建,名称和物体名称一样
- 手动创建动画状态机文件
![](https://i-blog.csdnimg.cn/blog_migrate/3b2fad7d6018d9651c1f0ebe4c3bc15e.png#pic_center)
-
Layers:动画层级页签,为动画添加更多的层级,层级高的动画播放会覆盖层级低的
-
Parameters:参数页签,为动画状态机添加控制状态切换的参数
-
网格化布局区域:
主要用于编辑状态之前的切换关系
- 窗口中的每一个矩形表示一个状态
- 窗口中的每一个箭头表示一个切换条件
默认三大矩形:
- 绿色 Entry 矩形:进入状态机流程
- 红色 Exit 矩形:退出状态机流程
- Any State:任意状态,代表状态机中的任意状态
人为添加矩形:
- 橙色矩形:一开始的默认状态动画,和 Entry 相连表示一开始播放的动画
- 灰色矩形:自己添加的某一种动作状态
添加动画:
- 自动添加——为对象创建动画后会自动将动画添加到状态机中
- 手动添加1——将动画文件拖入到状态机中(注意:老动画拖入会有警告)
- 手动添加2——右键创建状态,再关联动画
添加切换连线:
选择一个状态,右键选择 Make Transition 添加连线,再点击想要连接的状态即可
添加切换条件:
在左侧面板点击参数页签,可以在这里添加 4 种类型的切换条件
![](https://i-blog.csdnimg.cn/blog_migrate/fe93f67c8f9235ad4e536a16a65ee324.png#pic_center)
设置切换条件:
点击连线,在 Inspector 面板中的 Conditions 添加切换条件,多个条件存在时会进行与操作判断:
![](https://i-blog.csdnimg.cn/blog_migrate/7ab4b5868a3240933e0fab46c277fb77.png#pic_center)
五、Animator
(一)参数介绍
![](https://i-blog.csdnimg.cn/blog_migrate/d7d495478a9b995dd3274a66dfa31f65.png#pic_center)
- Controller:对应的动画控制器(状态机)
- Avatar:对应的替身配置信息(3D 模型相关)
- Aplly Root Motion:是否启用动画位移更新
- Update Mode:更新模式,一般不修改
- Normal:正常更新
- Animate Physics:物理更新
- Unscaled Time:不受时间缩放影响
- Culling Mode:裁剪剔除模式
- Always Animate:始终播放
- Cull Update Transforms:摄像机没有渲染该物体时,停止位置、IK 的写入
- Cull Completely:摄像机没有渲染物体时,整个动画被完全禁用
(二)代码控制
我们用代码控制状态机切换主要使用的就是 Animator 提供给我们的 API
我们知道一共有四种切换条件:int、float、bool、trigger,所以对应的 API 也是和这四种类型有关系的
private Animator animator;
// 1.通过状态机条件切换动画
animator.SetFloat("条件名", 1.2f);
animator.SetInteger("条件名", 5);
animator.SetBool("条件名", true);
animator.SetTrigger("条件名");
animator.GetFloat("条件名");
animator.GetInteger("条件名");
animator.GetBool("条件名");
// 2.直接切换动画 除非特殊情况 不然一般不使用
animator.Play("状态名");