http://blog.csdn.net/u014635337/article/details/46918953

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系统,可控性更强