Unity新版动画系统(Mecanim)基础 个人笔记向

Lesson1_认识Animation动画窗口

知识点一:如何打开Animation动画窗口

点击Window—>Animation—>Animation就可以打开了。

知识点二:Animation动画窗口是用来干什么的

Animation窗口 直译就是动画窗口
它主要用于在Unity内部创建和修改动画
所有在场景中的对象都可以通过Animation窗口为其制作动画
原理:
制作动画时:记录在固定时间点对象挂载的脚本的变量变化
播放动画时:将制作动画时记录的数据在固定时间点进行改变,产生动画效果

知识点三:关键字说明

动画时间轴:
每一个动画文件都有自己的一个生命周期,从动画开始到结束
我们可以在动画时间轴上编辑每一个动画生命周期中变化

动画中的帧:
假设某个动画的帧率为60帧每秒,意味着该动画1秒钟最多会有60次改变机会
每一帧的间隔时间是 1s/60 ≈ 16.67毫秒
也就是说 我们最快可以每16.67毫秒改变一次对象状态

关键帧:
动画在时间轴上的某一个时间节点上处于的状态

知识点四:Animation动画窗口参数讲解

在这里插入图片描述

1:预览模式的开关,可以打开预览模式
2:录制开关,点击可以录制动画
3:转到第一帧
4:转到上一帧
5:开始播放动画
6:转到下一帧
7:转到最后一帧
8:里面的数字代表当前处在哪一帧
9:按选择筛选
10:添加关键帧
11:添加事件
12:时间轴编辑模式
13:曲线编辑模式(一般程序员不会使用,美术负责动画制作)
14:动画时间轴面板,当编辑动画时,会在该面板上编辑关键帧等信息
15:窗口设置(后面详细讲解)

Lesson2_在动画窗口创建编辑动画

知识点一:创建动画

第一步:在场景中选中想要创建动画的对象
第二步:选中对象后,Animation窗口会发生变化,在Animation窗口中点击Create
第三步:选择动画文件将要保存到的位置

完成动画创建Unity会帮助我们完成以下操作:
1.创建一个 Animator Controller(动画控制器或称之为动画状态机) 资源(新动画系统)
2.将新创建的动画文件添加到Animator Controller中
3.为动画对象添加Animator组件
4.为Animator组件关联创建的Animator Controller文件

知识点二:窗口上的变化

可以发现没有选中对象的时候,窗口显示的是No animatable object selected。但是我们选中一个对象就会发现多了一个Create按钮。按照上面的步骤,为物体创建了一个动画后,这时候我们发现Animation窗口可以编辑了。

在这里插入图片描述
如果现在又要为物体创建动画,点击下拉框就会出现创建按钮,并且也可以在下拉框切换需要编辑的动画文件。

知识点三:关键帧模式下编辑动画

点击录制按钮即可编辑动画。

知识点四:曲线模式下编辑动画

一般不会使用这个方式来编辑动画

知识点五:动画文件参数

在这里插入图片描述
刚刚创建了一个名为1的动画文件,我们来看它身上的参数
Loop Time:循环动画,如果勾选了,会循环播放动画
Loop Pose:无缝循环运动,勾选了Unity会自动计算运动轨迹,让开始和结尾衔接更平滑。
Cycle Offset:循环动画偏移周期,第一次播放动画的时候的偏移量,相当于从这个动画的哪一个位置开始播放。

点击右上角的三个点切换到Debug模式,有更多的参数。

在这里插入图片描述
我们只需要知道其中两个即可
Sample Rate:动画有多少帧数
Wrap Mode:循环的模式。

接下来讲解上面提到的窗口设置
在这里插入图片描述
Seconds:动画时间轴以秒为单位
Frames:动画时间轴以帧为单位
Ripple:不需要使用
Show Simple Rate:在左侧显示动画有多少帧,在这里更改帧数,和在debug模式中更改是一样的
Set Simaple Rate:快捷设置帧数
Show Read-only Properties:不需要使用

Lesson3_代码控制动画(老动画系统)

知识点一 什么是老动画系统

Unity中有两套动画系统
新:Mecanim动画系统——主要用Animator组件控制动画
老:Animation动画系统——主要用Animation组件控制动画(Unity4之前的版本可能会用到)

目前我们为对象在Animation窗口创建的动画都会被新动画系统支配
有特殊需求或者针对一些简易动画,才会使用老动画系统

知识点二 老动画系统创建动画

第一步:在场景中选中想要创建动画的对象
第二步:为对象添加Animation组件
第三步:在Animation窗口中点击Create
第四步:选择动画文件将要保存到的位置

注意:
我们使用新动画系统创建动画 是直接选中这个对象 然后直接在Animation窗口点击Create
但是使用老动画系统创建动画 需要选中这个对象 在它身上添加Animation组件 然后在Animation窗口点击Create
这时Unity就会知道我们需要使用老动画系统 它就不会为我们创建Animator Controller动画状态机
老动画系统的编辑和新动画系统是一模一样的 但是老动画系统制作出的动画和之前的动画格式是有区别的

知识点三 Animation相关参数

在这里插入图片描述

Animation:默认播放的动画
Animations:该动画组件可以控制的所有动画
Play AutoMatically:是否一开始就自动播放默认动画
Animate Physics:动画是否与物理交互
Culling Type:决定什么时候不播放动画,Always Animate:始终播放,Based On Renderers:基于默认动画姿势剔除

知识点四 代码控制动画播放

Animation a = GetComponent<Animation>();

//1.播放动画
if (Input.GetKeyDown(KeyCode.Alpha1))
{
    
    
    a.Play("1");
}
if (Input.GetKeyDown(KeyCode.Alpha2))
{
    
    
    a.Play("2");
}

//2.淡入播放,自动产生过渡效果
//举例子:动画1让Cube旋转到90度 动画2让Cube旋转到45度
//我们触发动画1 当角度转到30度时 触发动画2 那么Cube就会慢慢的回到0度 然后再转到30度
//这就是过渡效果 如果不使用过度效果 在播放动画2时 Cube会瞬间变为0度
if (Input.GetKeyDown(KeyCode.Alpha3))
{
    
    
    a.CrossFade("3");
}

//3.前一个播完再播放下一个
if (Input.GetKeyDown(KeyCode.Alpha4))
{
    
    
    a.PlayQueued("2");
    //注意这个方法也有触发过渡效果的方法
    //a.CrossFadeQueued("2");
}

//4.停止播放所有动画
a.Stop();

//5.是否在播放某个动画
if (a.IsPlaying("1"))
{
    
    

}

//6.播放模式设置
a.wrapMode = WrapMode.Loop;

//7.其它(了解即可,新动画系统中会详细讲解)
//层级和权重以及混合(老动画系统需要通过代码来达到动画的遮罩、融合等效果)
//设置层级
a["1"].layer = 1;
//设置权重
a["1"].weight = 1;
//混合模式
//叠加还是混合
a["1"].blendMode = AnimationBlendMode.Additive;
//设置混组相关骨骼信息
a[""].AddMixingTransform();

知识点五 动画事件

动画事件的意思是,当动画播放到某个时刻的时候,去执行某些逻辑。前面我们已经讲过如何为动画添加事件。
这个蓝色的竖条就是事件,我们可以拖动它改变它的位置。将一个脚本挂载在这个物体上,那么点击它可以在Inspector窗口为它关联脚本中的函数。
在这里插入图片描述
在这里插入图片描述

Lesson4_有限状态机概念

知识点一 什么是有限状态机

有限状态机(Finite - state machine, FSM)
又称有限状态自动机,简称状态机
是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型

有限:表示是有限度的不是无限的
状态:指所拥有的所有状态

举例说明:
假设我们人会做很多个动作,也就是有很多种状态
这些状态包括 站立、走路、跑步、攻击、防守、睡觉等等
我们每天都会在这些状态中切换,而且这些状态虽然多但是是有限的
当达到某种条件时,我们就会在这些状态中进行切换
而且这种切换时随时可能发生的

知识点二 有限状态机对于我们的意义

游戏开发中有很多功能系统都是有限状态机
最典型的状态机系统
动作系统 —— 当满足某个条件切换一个动作,且动作是有限的
AI(人工智能)系统 —— 当满足某个条件切换一个状态,且状态时有限的
所以状态机是游戏开发中一个必不可少的概念

知识点三 最简单的状态机实现

最简单的状态机实现代码就是基于switch的实现
假设我们只有一个值来控制当前玩家的状态

string animName = "idle";
switch (animName)
{
    
    
    case "idle":
        //待机动作逻辑
        break;
    case "move":
        //移动动作逻辑
        break;
    case "run":
        //跑步动作逻辑
        break;
    case "atk":
        //攻击动作逻辑
        break;
}

Lesson5_动画状态机AnimatorController

知识点一 创建动画状态机

第一种方式就是上面讲过的,为场景中物体创建动画时,Unity会帮助我们自动创建。
第二种方式就是手动创建动画状态机文件,直接在Project窗口右键就行了。

知识点二 基础使用——初识动画状态机窗口

在这里插入图片描述

Layers:动画层级页签,为动画添加更多的层级,根据齿轮中的权重设置,权重高的动画播放会覆盖权重低的
Parameters:参数页签,为动画状态机添加控制状态切换的参数
眼睛图标:显隐左侧面板

网格化布局区域:
主要用于编辑状态之前的切换关系
1.窗口中的每一个矩形表示一个状态
2.窗口中的每一个箭头表示一个切换条件

矩形说明:
默认三大矩形:
绿色Entry矩形:进入状态机流程
红色Exit矩形:退出状态机流程
Any State:任意状态,代表状态机中的任意状态

人为添加矩形:
橙色矩形:一开始的默认状态动画,和Entry相连
表示一开始播放的动画
灰色矩形:自己添加的某一种动作状态

知识点三 基础使用——添加动画

1.自动添加——为对象创建动画后会自动将动画添加到状态机中
2.手动添加1——将动画文件拖入到状态机中(注意:老动画拖入会有警告)
3.手动添加2——右键创建状态,再关联动画

知识点四 基础使用——添加切换连线

我们根据上面的方法,在动画状态机中添加两个动画,直接在动画状态上面右键即可创建连线,连接线上面有许多的参数,在之后讲解。
在这里插入图片描述

知识点五 基础使用——添加切换条件

在左侧面板点击参数页签
可以在这里添加4中类型的切换条件
在这里插入图片描述

知识点六 基础使用——设置动画间切换条件

点击连线,可以在右侧Inspector窗口看见许多参数。
在这里插入图片描述
我们现在之讲解Conditions,这个就是切换参数的意思。我们设置了动画的切换条件,就可以在这里选择使用哪一个条件。当满足条件后就可以从一个动画切换到另外一个动画,下面我们会讲解如何在代码中控制这些条件,达到切换动画的功能。

Lesson6_代码控制动画状态机切换

知识点一 关键组件Animator

为物体创建动画后,Unity会自动的在物体上添加一个Animator组件。
在这里插入图片描述

Controller:对应的动画控制器(状态机)
Avatar:对应的替身配置信息(之后讲解3D模型时详细讲解)
Apply Root Motion:是否启用动画位移更新

UpdateMode:更新模式(一般不修改它)
Normal:正常更新
Animate Physics:物理更新
Unscaled Time:不受时间缩放影响

Culling Mode:裁剪剔除模式
Always Animate:始终播放动画,即使在屏幕外也不剔除
Cull Update Transforms:摄像机没有渲染该物体时,停止位置、IK的写入
Cull Completely:摄像机没有渲染物体时,整个动画被完全禁用

知识点二 Animator中的API

//我们用代码控制状态机切换主要使用的就是Animator提供给我们的API
//我们知道一共有四种切换条件 int float bool trigger 所以对应的API也是和这四种类型有关系的
Animator animator = this.GetComponent<Animator>();
//1.通过状态机条件切换动画
animator.SetFloat("条件名", 1.2f);
animator.SetInteger("条件名", 5);
animator.SetBool("条件名", true);
animator.SetTrigger("条件名");
//也可以得到这个条件当前的状态
animator.GetFloat("条件名");
animator.GetInteger("条件名");
animator.GetBool("条件名");

//2.直接切换动画 除非特殊情况 不然一般不使用
animator.Play("状态名");