2

好久没写博文,今天打算和大家分享点小知识,当当当当!那就是Animator!

Animator是Unity中动画控制器的组件,这东西相当于一个动画片段管理器。我们知道Unity中素材可以拖拽到游戏对象上,制作成称为Clip的动画片段,如果该对象没有Animator组件,那么也会同时创建Animator用来管理Clip的切换和触发等。

Animator中我比较常用的是Trigger,这个很多新人也都使用过了,用来从一个动画状态切换到另一个动画中。今天主要介绍的东西有两个,一个是BlendTree,另一个是State Machine Behaviour。如果大家遇到了我遇到过的问题,那么这两个在关键时刻可谓是大杀器般的存在了。

问题一:如何制作2D角色的多向动画

当时我遇到的问题是:一个2D角色,需要四个方向的移动动画,还需要四个方向的攻击动画。当时技术水平所限,我直觉上想到的就是制作8个State,分别处理8段动画,8个trigger,然后在代码中来回切换。后来看到密密麻麻的State和Transition,发觉不对劲,于是数天的谷歌之后,开始学一个叫做BlendTree的东西。

在一个State上右键创建一个新的BlendTree,然后双击进入。在Animator的参数面板中,添加两个float变量xdir和ydir。在Inspector面板中选择BlendType为2D simple directional,参考变量选好。这时下面会出现一个Motion数组,在里面分别设置图中四个点的坐标和四个动画片段,如图所示:

图片描述

这两个变量xdir和ydir,用来表示角色的朝向,我们会在代码中进行设置。然后BlendTree的神奇之处就在于,能够根据你所设定的不同的值的组合,去寻找对应的motion。比如我现在用

animator.SetFloat("xdir", 1);
animator.SetFloat("ydir", 0);

来设置这两个坐标,那么BlendTree就会自动匹配到第四个动画,我们将其设置为向右的Clip就可以了,其他方向同理。

问题二:如何检测动画播放状态

制作一个死亡动画不是问题,但是死亡之后如何判定动画播放完毕,我们好进行处理呢?比如现在要求死亡动画播完以后,角色保持在死亡的那一帧,禁止播放其他动画。这里我介绍几种方法,不过感觉State Machine Behaviour是最简单的方案。

首先是Add Animation Event。进入Animation面板,选择你需要监听的动画片段,选中触发的关键帧,右键添加动画事件,然后选择你所需要触发的函数就可以了。这样动画播放到这一帧的时候,就会触发你所选择的函数了。

其次是在代码中使用Invoke或者Coroutine,自己估摸一下动画的播放时间,然后调用对应的函数,也可以达到相同的目的,详细方式大家都可以自行百度谷歌。

最后出场的就是State Machine Behavior了!选中一个State之后,在Inspector面板中,点击Add Behavior面板,就添加了一个状态机脚本,双击脚本进入代码编辑器。这里面最常用的三个函数,分别是Enter、Update、Exit函数。分别是进入状态、更新状态、退出状态的时候会调用的函数。我们在死亡状态后面新建一个状态,设置死亡动画播完以后Exit time形式进入这个状态。如图:

图片描述

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

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

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


敲键盘的猫
772 声望131 粉丝

一只热爱科技的猫