这是关于动画系统animator、animation使用总结的,同时,这篇文章主要针对2d游戏的动画制作,因为初学一直都是写的2d游戏,所以本人不是很了解3d游戏(擦汗
而且写完了发现文章比较长,啰啰嗦嗦而且表述可能不当,因此建议大家直接查看官方文档!!!本篇文章目的在于帮助我自己总结自己的阶段学习经验,如有不足,敬请指教
目录
0、简述
先了解一些名词
- animation clip 动画片段/动画剪辑
- animation controller 动画控制器
- animator 动画组件
1、动画片段也即动画切片。比如在ruby的冒险中,主角ruby的奔跑动画,空闲动画,发射子弹动画和受伤动画等,上面提到的这些动画都是一个个动画片段(animation clip)
动画片段是在animation窗口中进行制作的,animation窗口调出来的快捷键是ctrl+6
2、而动画控制器(animation controller)作用是将一堆animation clip用动画状态机animation state machine的方式去组织起来的,按照我们设定的条件方式去选择处理并播放动画片段。比如在ruby的冒险游戏中,管理主角ruby什么状态下播放哪一个动画片段,是通过animator进行控制的,操作的窗口是animator窗口。
3、animator组件是挂载在需要播放动画的组件,在给游戏场景物体创建动画时unity会自动给该物体挂载animator组件
在介绍完animation和animator两个窗口的用法后,可以学习官方免费教程的ruby的冒险的动画制作,这样对于理解动画系统的使用非常有帮助
1、在animation窗口制作动画片段
认识一下animation窗口,它是适合单个物体及其子物体的动画编辑。在给游戏物体创建动画的时候,一定需要先选中物体,这样才能在animation动画窗口去创建该物体的动画
1.1 了解animation界面
preview:启用/禁用场景预览模式。
1:录制:启用/禁用关键帧记录模式。开启后可以直接在物体上调整,unity会录制下来关键帧
2: 转到动画剪辑开头。
3: 转到上一个 keyframe(关键帧)
4: 播放动画剪辑。用来查看动画效果
5: 转到下一个keyframe(关键帧)
6: 转到动画剪辑末尾
7: 当前第几帧
samples 样本,每秒/分的帧数。每秒帧数越低,播放速度越慢
添加关键帧
添加事件
Dopesheet:简报
Curves:曲线,可以修改曲线的升降幅度以达到需要的动画效果
1.2 如何创建和设计动画片段和动画控制器
1.2.1 创建 Animation Clip
(1)先点击窗口中的create按钮
然后选择动画片段和动画控制器的存储位置,填写动画片段名称
(2)第二种添加动画片段的方式
就是如下图这样的界面效果。其中,create new clip是在此物体上创建新的动画片段,然后写好动画片段名字和选择存储位置
1.2.2 怎么添加关键帧
详细请查看官方文档
做好上面的创建 Animation Clip 步骤后,可以开始在 Animation 窗口中对这个 Animation Clip 添加关键帧
我们可以使用俩个方法在 Animation 窗口中对游戏对象进行动画化:预览模式 和 录制模式
(1)预览模式
预览模式下,我们需要手动创建关键帧,而且直接修改游戏动画对象本身不会直接创建关键帧
手动创建关键帧的方式可以直接点击 Add Property 键去选择需要添加的关键帧类型,对于精灵图可以直接拖动进去某个位置添加关键帧
(2)录制模式
在录制模式下,当移动旋转或者其他方式修改动画游戏对象的任何可以动画的属性时,unity会在白线处创建关键帧,所以要注意把白线移动到所需位置在改变动画对象。按下录制键可以启用录制模式,Animation 窗口时间轴显示为红色
1.3 动画片段设置循环
在上面自己选择好的存储动画片段和动画控制器的路径下去找到已经制作好的动画,鼠标单击,会出现下面的效果
右侧边栏中:
- Length:动画时间长度
- Loop Time:是否循环,如果勾选的话就是动画会不断循环播放
- Loop Pose:循环动作,循环时头尾衔接更平滑
- Cycle Offset:平滑度
这几个里面我比较经常用到的就是是否勾选Loop Time,来控制动画是否实现循环的效果。
1.4 如何预览制作好的动画片段
当我们制作好了动画之后,我们需要观察动画播放情况是否符合我们的要求(感觉下面俩种方法都笨笨的,但是 Animation 窗口中的Preview预览键不懂怎么预览,可能我搞错了什么
方法1:
把animation窗口拖到跟scene窗口不一样的位置,并调节scene窗口能观察到该物体,然后点击animation的播放键,就能在Scene窗口中直接观察到。
方法2:
找到该动画在文件中对应的存储位置,单击该动画片段,会发现右边侧栏下面的walkDown字样的一条栏目。在不一样的动画片段命名会有不一样的字样显示,所以是不是写着walkDown不重要,重要的是找到这个栏目并用鼠标拖动上去,如图
如果把这个walkDown栏目拖上去,没有看见有图片的话,就需要我们把Hierarchy窗口中的需要播放该动画片段的对应物体拖到walkDown栏目中,这样就能看见了有人物在栏目中出现了
最后再点击walkDown栏目左上角的三角符号,即播放键,就能看见动画播放效果了
这样我们可以确保动画效果符合我们的预想,如果出现错误能及时发现并修改。
1.5 插入动画事件
见下图,左边框住的是添加动画事件的按钮,右边框住的就是事件线,添加到剪辑的事件线中会显示一个标记
在标记上悬停鼠标可显示带有函数名称和参数值的工具提示
如何在事件线上某个位置添加事件
使用 Animation Events 在时间轴中的特定点调用函数。这些函数可以位于附加到游戏对象的任何脚本中,注意:脚本和animator组件所在的对象处于同一对象
在时间轴某个位置添加动画事件,要先将白线移动到事件需要放置在事件线的位置,然后鼠标单击,最后鼠标单击在事件线上的动画事件标记,可以在 Inspector 窗口选择事件需要执行的函数。
函数参数类型
有动画事件调用的函数也可以接受一个参数,该参数可以是float、string、int 或 object 引用或 AnimationEvent 对象
2、在animator窗口上管理动画播放逻辑
打开animator窗口的方式为,window->animation->animator,见下图
2.1动画状态 Animation State
在物体上创建新的Animation Clip之后,再打开animator窗口就会发现有很多矩形框框,这些矩形框框就是动画状态
animator窗口如下:
每一个矩形都是不一样的动画状态,橙色矩形的是默认动画状态,即游戏时该物体一开始播放的动画片段,可以鼠标右键点击某一个矩形去设置,如下图
2.1.1 创建混合树
上面官方链接关于混合树的说明已经非常详细,本人也没有什么新知拙见故不再赘述
2.2 状态转换是什么
简单来说,状态转换就是利用箭头的方式表现出来
2.2.1 设置状态转换
鼠标右键点击某一个动画状态,然后选择 Make Transition ,再将出现的箭头点击另外一个动画片段,这样就创建好了状态转换
状态转换意思就是,该状态转到另一个状态,表现在 animator 上就是一个个的箭头
在满足转换条件的时候,动画状态会根据箭头方向转换成另外一个状态。如果没有转换条件,上一个动画播放完成就会自动向链接的下一状态转换。转换条件的添加在下面 2.3.2 讲解
点击animator窗口中某一箭头,就能看见右侧栏
一定要选中hierarchy中的物体才能在animator上进行操作
2.2.2 对箭头的参数(上图右侧栏)进行详细讲解
1、Solo和Mute
当一个动画有多个后续动画时,当该动画播放完后优先选择动作列表中最前 / 上的状态进行状态转换
Solo:优先选择,仅播放该过渡
Mute:选择的状态转移被禁用
如果一个过渡启用了Solo,则unity将对其他过渡启用Mute;如果同时启用Solo和Mute,则启用Mute的过渡优先执行
可以从Transition Inspector 或 State Inspector 窗口中启用 Mute 和 Solo ,从State Inspector 窗口中能看见来自该状态的所有过渡(如下图)
State Inspector窗口打开只要点击动画状态即可
启用了Solo的状态转换箭头是绿色的,而启用Mute的状态转换箭头是红色的,如下图
2、Has Exit Time
是否有退出时间,如果勾选的话,就是只有当上一个动画播放结束时才能转换成下一动画。取消勾选就是无论上一动画播放到什么位置都可以转换到下一个动画,这个使用于跑步、休息动画状态切换
3、Settings
3.1 Fixed Duration:如果选中 Fixed Duration 复选框,则以秒为单位解读过渡时间;否则,过渡时间解读为源状态的标准化时间的一部分
3.2 Transition Durations:从一个动画过渡到另外一个动画需要的时间,如果勾选Fixed Duration,时间单位为秒
3.3 Transition Offset:从一个动画过渡到另外一个动画,下一个动画从哪里开始。
例如,这个值设置为0.5,就是从下一个动画的50%的位置开始播放,而不是从头开始播放
3.4 Interruption Source:打断优先级,如果一个动画正在播放,突然某个动画达到了播放条件,就会打断动画播放达到条件的动画
4、Conditions 转换条件
黄色标记部分就是转换条件列表
为了能够添加转换条件,我们就需要添加动画参数。那么下面就开始简述动画参数
2.3 动画参数
2.3.1 四种类型参数
点击Parameters,就可以看见动画参数表
点击下图标记的“+”号键,可以选择需要添加的参数类型,有Float 、Int 、Bool 、Trigger四种类型
- Integer - 整数
- Float - 带小数部分的数字
- Bool - true 或 false 值(由复选框表示)
- Trigger - 当被过渡使用时,由控制器重置的布尔值参数(以圆形按钮表示)
前三种类型都是比较好理解的
至于Trigger这个类型的动画参数,意思就是触发器,俗话说就是只能被短暂激活的布尔值,这个只能被短暂激活的布尔值为真只能短暂持续一段时间,过了这个时间的话就会为假
2.3.2 转换条件的添加
设置好了动画参数,那么我们可以添加转换条件了
点击需要设置转换条件的动画转换(箭头),Inspector 窗口下会出现下图的内容
点击下图标记的“+”号键,可以选择需要添加的参数类型,” - “是移除条件
点击+键就可以选择添加动画参数,来约束转换条件
!如果动画参数是int、float类型,需要选择是大于 / 小于 某个数值
!如果动画参数是bool值,需要选择转换条件是bool值为真 / 假
!如果动画参数是Trigger,就不需要额外设置
如果没有添加任何转换条件,那么unity只会考虑Exit Time,并达到退出时间时发生过渡。如果有多个转换条件,必须全部条件都满足才能实现动画状态转换
注意:如果为该过渡选择 Has Exit Time 并有一个或多个条件,请注意 Unity Editor 在 Exit Time 之后考虑条件是否为 true。这样可确保在动画的特定部分中进行过渡。
2.3.3 如何用代码读取和修改动画参数
!注意:下面代码读取或修改动画参数的变量名一定要于我们自己添加的动画参数变量名完全一样,也一定要记得添加动画参数啊啊啊啊,不然会出现报错
要用代码读取或者修改动画参数,需要获取挂载在播放动画的物体上面的animator组件,然后才能进行操作
animator = GetComponent<Animator>();
即使用以下 Animator 类中的函数,从脚本为参数赋值:SetFloat、SetInteger、SetBool、SetTrigger 和 ResetTrigger
那么从脚本获取参数的函数为:GetFloat,GetInterger,GetBool
读取和修改动画参数的部分有关函数如下(参阅官方文档后的截图):
示例(展示了部分代码,关注重点即可):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RobotController : MonoBehaviour
{
private float speed = 4.0f;
[SerializeField] private bool isVertival;//是否垂直方向移动
private Vector2 moveDirection;//移动方向
private float changeDirectionTime = 2f;//改变方向的时间
private float changeTimer;//改变方向的计时器
private bool isFixed = false;//是否被修好
private Rigidbody2D rbody;
private Animator animator; //animator组件 !!!!!示例重点!!!!!!
private void Start()
{
rbody = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>(); //!!!!!示例重点!!!!!
moveDirection = isVertival ? Vector2.up : Vector2.right;
changeTimer = changeDirectionTime;
}
private void Update()
{
if (isFixed)
{
//被修复好了,不执行以下所有语句
return;
}
changeTimer -= Time.deltaTime;
if (changeTimer < 0)
{
moveDirection *= -1;
changeTimer = changeDirectionTime;
}
rbody.velocity = new Vector2(moveDirection.x * speed, moveDirection.y * speed);
animator.SetFloat("moveX", moveDirection.x); //!!!!!示例重点!!!!
animator.SetFloat("moveY", moveDirection.y); //!!!!!示例重点!!!!
}
}
3、animator组件
这个是在给物体创建动画片段和动画控制器的时候就自动挂载到物体上的组件
- Controller:放需要的Animation Controller
- Avator:已经设置好的对应模型avator,如果游戏对象是具有Avatar定义的人形角色,还应在此组件中分配Avatar
- Apply Root Motion:根运动,选择从动画本身还是从脚本控制角色的位置和旋转
- Update Mode:动画更新模式允许您选择 Animator 何时更新以及应使用哪个时间标度
- Culling Mode:剔除模式
4、后记
在整理完这篇文章之后,我感觉到unity的动画系统是十分庞大且精细的。一篇文章无法将所有细节都涵盖,因此,我非常推荐大家去阅读官方文档动画 - Unity 手册,虽然新手一开始查阅是非常难以理解的,但是经过实践和细读,会发现里面真的有很多不曾察觉到的细节
反正在网上查阅别的文章也是非常凌乱和杂碎的,官方文档起码比较全面一些
如果觉得官方文档的某一个地方难以理解,再去网上搜索学习也可以,当然直接网上搜索学习也是可以的
5、参考文章
Unity 用户手册 2020.3 (LTS) - Unity 手册
Unity Animation动画系统概述 - 半只狗 - 博客园 (cnblogs.com)
Unity动画系统详解1:在Unity中如何制作动画? - 知乎 (zhihu.com)
Unity Animation、Animator 的使用(超详细)_unity animator-CSDN博客
Unity--Animation Transitions(动画过渡)_animator transitions-CSDN博客
文章中部分图片来自unity官方文档