unity 的动画系统 Animator的使用

Animator是unity新的动画系统,除了基本的播放动画功能之外,还提供了更强大的其它功能

基本篇

1新建AnimatorController,将动作拖到AnimatorController,将动作做连线,新建状态值,设置连线通过条件的状态值

2代码使用SetInteger(“变量名”,值) SetFloat  SetBool等设置状态值,实现动作的切换,动作切换时有动作融合效果

3两个动作之间没有连线时,即使改变状态值,也无法切换动作

4当anystate与目标动作连线时,无视当前动作是否与目标动作连线,只要anystate与目标动作的条件成立,立击切换到目标动作

5两两动作互相连线与anystate与所有动作连线,播放的区别是,anystate切换到目标动作时,没有动作融合,动作之间连线切换有动作融合

6设置动作的帧事件,前提是要把有AnimatorController的预制拖到面板上,选中对像,ctrl+6打开动作面板,编辑好帧事件后选择回调函数,帧事件回调函数只能选择以AnimationEvent 为参数的函数,并且函数不能是公有且是重载的函函数

如果是循环动作,帧事件会每播一遍就会调用一次,如果不是循环动作,只会调用一次

除此之外基础部分不多说,网上很多教程

下面是Animator的是一些其它使用方法,可能在新的动画系统中并不起眼,也不常用,但其实非常有用

Play(“动作名”)

Play(动作名hash值)

直接播放动作,不会做动作融合,即使有状态机的连线,完全忽略状态机,有重载方法,可以指定层,也可以指定目标动作在原动作进行到何时开始

CrossFade(“动作名”,融合时间)

CrossFade(动作名hash值,融合时间)

动作融合,融合时间持续多久完全过渡到目标动作,跟状态机无关,有重载方法,可以指定层,也可以指定目标动作在原动作进行到何时开始

指定层时-1与0层都是baselayer,但使用GetCurrentAnimatorStateInfo不能使用-1

方法不会将normalizedTime清零,所有调用此方法不能重新播放动作

speed

动作播放速度1为正常,0时动作停止在当前帧,可以用作暂停或加速减速动作

normalizedTime

动作的归一化时间的值,整数部分为播放的遍数,无论是否是循环动作这个值都会一直累加

进阶篇

layer层,

1高层可以覆盖低层的动作播放,

2blending属性设置是高层是覆盖还是叠加低层

3通过weight设置混合比例

4此层使用的avatarmask

avatarmask

1可以新建avatarmask,选中要编辑模型的avatar,选择部分骨骼节点

2可以将上下半身的骨骼节点做成两个avatarmask,设置两个层使用不同的avatarmask,每层播放不同的动作,使上下半身播放不同的动作.实现上下半身混合动作的效果

3注意当多个动作同时播放时,每个动作都会触发各自的动作帧事

坑点

1只能取得当前的动作状态数据及下一个动作状态数据,代码可控性不强

2动作事件回调时无法判断是哪一层回调回来的,但其实不应该存在多个层在播同一个动作,出现这种情况一定是偷懒或出错了

3AnimatorStateInfo中的loop与动作文件的loop并不相同,只有在将动作文件拖到控制器和在控制器中SetAsDefault时,会将动作文件的loop值应用到AnimatorStateInfo中,很扯蛋的一件事,或是动作本身就在fbx中,在fbx中修改了loop值后应用也会生效

总结

1普通时可以直接使用play或CrossFade,简单不容易出错,使用状态机的好处是可以实现多段动画,通过状态机事先设置连接好,只改变一个值来触好一套多个动作

2甚至可以将SetInteger设置状态机值与play结合使用

比如当前是站立动作,状态值为1,攻击动作连线到站立动作,条件是动作播完并且状态值为1回到站立动作

这时代码调用CrossFade攻击动作,这时的播放效果就是站立动作过渡到攻击的动作,攻击动作播完后重新变成站立动作

当然这个效果可以直接使用状态机完成,但前提站立动作必须或攻击动作连线,不然跑无法切换到攻击动作,但当直接使用Play或CrossFade可以忽略站立是否与攻击动作连线

写在最后

如果是做动作类游戏或需要动作混合,使用Animator会更新方便,但如果只是简单的播放动画,建议还是使用animation系统,可控性更强

      首先,我们要先研究下 他的动作关系这个角色的动作有idle attack1 attack2  attack3 jump  run   

      

         

 

       那么我们要使用  新动画系统的 Animator Controller 来进行 动画的连接创建一个  Animator Controller 把咱用到的动画 都拖进去  吧 idle 设为默认动画

       然后  咱就开始连连看吧 三连击击肯定是  idle—>attack1—>attack2—>attack3

       这个套路然后  这3个攻击到哪攻击一定时间不操作了  肯定 就会反回idle 状态

      所以需要这么连接

      

 

      连好后 我需要 拿脚本 来控制他们的切换  需要 一个变量  我们来建立一个attack int 变量 给那些线 添加这个变量   

      Idle 到 attack1   Int 值为 1

      attack1到 attack2   Int 值为 2

      Attack2到 attack3   Int 值为 3

      attack1  attack2  attack3  返回 idle    int 都为 0

      好了 这样 就可以拿这个变量控制啦

      下面开始 写脚本

      调用 动画  什么的就不说啦

      直接说重点  三连击 核心就是 拿时间判断 你在这段时间内让没让我做出下一个动作

      那么 怎么获取动画 时间之类的呢   

      我们可以用 animSta=anim.GetCurrentAnimatorStateInfo (0);  来获取动画信息,这样 就可以 用 它里面 的is name  判断 现在 哪个动画名下面, 用 normalizedTime

 

      来判断 动画 时间 剩下的 就是条件判断咯  

      代码如下:  

 

        

 

       


 

       

 

 

发表评论