Unity游戏教程初步:Animator的使用

Posted AugustTheo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity游戏教程初步:Animator的使用相关的知识,希望对你有一定的参考价值。

1 前言

 本节中我们来介绍Unity的动画系统以及管理动画剪辑(Animation Clip)的组件Animator。

2 Unity中的动画系统

 Unity的动画系统又称为Mecanim,是一个基于动画剪辑(AnimationClip)的系统。在此系统中,我们可以通过对游戏对象的一系列属性进行操作从而制作关键帧,进而制作动画。

 同时,由于Unity的动画是基于游戏对象(GameObject)的,动画中

3 Animator与Animation

-本节相关内容请读者参考:

-Animator 窗口 - Unity 手册,《Animator窗口》

 Animator在Unity中分别可以指一个组件和一个查看、编辑Animator Controller的面板(在Scene面板旁边)。当Animator作为一个组件时,它可以向对应的GameObject添加一个Animator Controller用来管理GameObject的动画行为。

 Animation则分别指Animator Controller管理的对象之一Animation Clip,Animation组件,或Animation面板(在Game面板旁边)。

4 Animation Clip的创建与编辑

 为一个GameObject对象添加Animator组件或Animation组件(不添加二者之一没法创建Animation Clip),然后转到Animation选项卡,为其新建一个Animation Clip。然后点击Add Property,选择要在Clip中编辑的对象属性,例如Transform、Sprite,或是搭载脚本中的参数,然后以类似关键帧的形式编辑。例如,我编辑了一段角色向右走的简易关键帧动画,如下图所示:

 除了这些直观的属性,还可以为其添加事件,或手动添加关键帧。

5 Animator的简单使用

5.1 向Animator中添加Animation Clip

 为一个GameObject对象添加Animator组件并创建一个空的Animator Controller,然后在Animator面板中查看,如下图所示:

 可以看到,面板左侧为Layer层(可以理解为类似图层的东西)和Parameters参数列表,右边为Layer层的内容。初始的空Layer层有Any State、Entry和Exit三个状态,其中Any State连接到的状态只需满足过渡条件即可播放。而Parameters选项卡允许我们添加四种类型的变量,并在GameObject搭载的Script中调用,调用方式如下所示,例如我调用一个名为Right的Bool类型变量:

this.GetComponent<Animator>().GetBool("Right");

 为GameObject创建一个Animation Clip,然后回到Animator选项卡中,你将会发现新的Animation Clip已经出现在Layer中,并且与Entry状态有一条黄色的连接线,且Clip的颜色是黄色,这说明了这个Clip已经作为默认播放的动画存在了。由于Layer必须要有一个默认Clip(在有Clip的状态下),你可以通过创建新的Clip然后点击Entry状态选择“Set StateMachine Default State”然后连接新Clip来修改默认Clip。

5.2 Transition的使用

-本节相关内容请读者参考:

-状态机过渡 - Unity 手册,《状态机过渡》

 在Layer中,不光能够连接State与Animation Clip,两个Animation Clip之间也可以互相连接。事实上,Animation Clip也是一个State,而Layer也可以被称为“State Machine”,顾名思义是控制GameObject动画状态的机器。右击一个State选择“Make Transition”,然后选择要连接到的State,即可完成一条State与State之间的连线。选择连线,查看Inspector面板,可以看到这条连线的相关信息,如过渡条件,过渡时间等。

 结合Animator中的Parameters,我们可以将其作为过渡条件:

 

6 范例:制作一个简易的四方向行走脚本

 首先,创建一个空GameObject并搭载Animator与Sprite Renderer(Sprite Renderer负责显示精灵图)。

 然后分别制作角色向四方向走动的Clip与四方向静止的Clip,以下二图为例:

 

 在Animator的Parameters选项卡中创建“Up”、“Down”、“Left”、“Right”四个Bool类型的变量。然后为GameObject挂载脚本,监听键盘WASD的按下,根据键盘的动作修改Animator变量的取值,如:

void PlayerAnimController() //动画控制器

    //同时按下的情况,先结算下左方向的移动

    //不能同时往相反方向移动

        if(this.cantMove)return;

        this.Down=Input.GetKey(KeyCode.S)&this.Up!=true;

        this.Up=Input.GetKey(KeyCode.W)&this.Down!=true;

        this.Left=Input.GetKey(KeyCode.A)&this.Right!=true;

        this.Right=Input.GetKey(KeyCode.D)&this.Left!=true;

    

 现在,让我们思考,如何才能让角色的行走动作更为自然?有人可能认为:将Any State与四方向行走的Clip连接在一起,将过渡条件分别设置为四个变量为真,然后在Clip后分别连接四方向的静止Clip,过渡条件为四个变量为假即可,如下图所示:

 但如果如此,一旦按下对应的行走键,就将反复进入对应的行走Clip,而放下行走键就会直接静止,Clip根本不能够播完,这就会使得角色的行走方式十分生硬。

 正确的State Machine则如下所示:

 这样看确实眼花缭乱,那就让笔者用语言描述一下。由于四种行走方式是相互等价的,只需要描述其中一种行走方式即可,所以让我们拿左方向行走和站立举例:

 

 可以看到,从左方向站立可以过渡到所有的行走状态(这是可以理解的,无论你以什么方向站立,都可以向任意方向走),其过渡条件则分别为对应的变量为真。而左方向行走状态则会过渡到左方向站立状态,过渡条件为对应的变量为假。

 而对左方向行走来说,它可以由所有站立状态过渡而来,过渡条件为变量“Left”为真,而当“Left”为假时,它会过渡到左方向站立状态。

 至于行走带来的角色位置变化,可以像笔者一样监听键盘,根据键盘状态每帧更新位置,也可以使用Clip改变Transmit或使用Clip事件。

 到这里四方向行走的设置就基本完毕了,还有两个需要注意的点:为了让角色的转向更干净利落,需要关掉过渡的Exit Time与Transition Duration(下方方框中的值,一个去掉打勾,一个移动过渡条到消失),当然也可以使用记事本打开Animator文件,查找m_ExitTime与m_TransitionDuration,然后将其全部替换为0。

 

Unity - Animator组件

Animator组件

Animator 是 Unity 中动画控制器的组件,相当于一个动画片段管理器。

我们知道在 Unity 中素材可以拖拽到游戏对象上,制作成称为 Clip 的动画片段,

如果该对象上没有 Animator 组件,那么也会同时创建 Animator 用来管理 Clip 的切换和触发等操作。

角色的多向动画

当控制一个2D角色(或3D角色)时,需要四个方向的移动动画,还需要四个方向的攻击动画。

之前想的可能是:制作8个 State,分别处理8段动画,然后在脚本代码中来回切换,就会出现密密麻麻的 State Transition

而 Blend Tree 可以很好的解决这个问题。

Blend Tree(混合树) 用于允许通过按不同程度组合所有动画的各个部分来平滑混合多个动画。

在一个 State 上创建一个新的 Blend Tree,然后双击进入。在 Animator 的参数面板中添加两个 float 变量x和z。

在 Inspector 面板中选择 Blend Type 2D simple directional,选择参考变量。

这时下面会出现一个 Motion 数组,在里面分别设置图中四个点的坐标和四个动画片段。

技术图片

 变量x和z用来表示角色的朝向,我们会在代码中进行设置。

Blend Tree 的神奇之处就在于,它能够根据你所设定的不同值的组合,去寻找相对应的 Motion

技术图片

 检测动画的播放状态

制作一个死亡动画不是问题,但是死亡之后如何判定动画是否播放完毕,然后进行处理?

比如现在要求死亡动画播放完之后,角色保持在死亡的那一帧,禁止播放其他动画。

首先是 Add Animation Event(添加动画事件):

在 Animation 面板,选择需要监听的动画片段,选中触发的关键帧,

右键添加动画事件,然后选择所需要触发的函数就可以了。

技术图片

这样动画播放到这一帧的时候,就会触发所选择的函数了。

然后就是 State Machine Behavior

选中一个 State 之后,在 Inspector 面板中点击 Add Behavior 添加一个状态机脚本。

技术图片

进入脚本,这里面最常用的三个函数分别是 EnterUpdateExit 函数。

分别是进入状态、更新状态和退出状态的时候会调用的函数。

在死亡状态后面新建一个状态,设置死亡动画播放完以后 Exit time 形式进入这个状态。

在刚添加的脚本中添加代码:

1     override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
2     {
3         animator.enabled = false;
4     }

这样角色死亡动画播放完以后,会自动切换到一个空状态,切入之前会调用这个Exit函数,将动画控制器禁用。

以上是关于Unity游戏教程初步:Animator的使用的主要内容,如果未能解决你的问题,请参考以下文章

在 Unity Animator 中使用“任何状态”的问题

Unity黑巧克力 滚球游戏 入门级教程

Unity 动画系列十一 Animator Record 录制与回放

Unity - Animator组件

Unity - Animator组件

100个 Unity实用技能☀️ | Unity 复用动画控制器 Animator Override Controller 的简单使用