您的位置:首页 > 移动开发 > Unity3D

【Unity】动画系统简单介绍

2017-02-05 10:14 337 查看
http://blog.csdn.net/u014635337/article/details/46918953Animator是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系统,可控性更强
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  animator