近段时间使用Laya制作移植一款Unity的动作相关游戏,发现Laya对Unity的Animator的支持更好,但是游戏原作中,全使用的都是Animation,对技术难度和工作量进行评估后,我义无反顾的进入了漫漫填坑路:
文章中,我将不再对编辑器进行详细的讲述,直接谈API的转换,和相应的问题,比较优劣
1、IsPlaying 当前是否在播放某动画
1 2 3 4 5 6 |
animation.IsPlaying(clipname); //-新动画 var animatorInfo = newAnim.GetCurrentAnimatorStateInfo(0); curNorTime = animatorInfo.normalizedTime; if (curNorTime >= 1 && animatorInfo.IsName(clipname)) |
注意事件:新动画的IsName函数一定得加,不然会判断成其它的,新动画在CrossFade一动画之后,这个判断会失效,而老动画是没有问题的,打个比方玩家在Run动画CrossFade到Walk动画时,Animation的IsPlaying(“Run”)和IsPlaying(“Walk”)返回的都是true。
而新动画无法做到,所以建议单独给新动画再封装一个播放类。
新动画 < 老动画
2、AnimationClip的动态添加与改变
添加Clip在新动画上是不被支持的,只支持改变动画;而改变在老动画上不支持
所以在Animator的编辑器中添加好些动画
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
static public void SetClip(Animator animator, AnimationClip clip, string cName) { if (clip != null) { if (cName == "") { cName = clip.name; } AnimatorOverrideController aoc = animator.runtimeAnimatorController as AnimatorOverrideController; if(aoc == null) aoc = new AnimatorOverrideController(animator.runtimeAnimatorController); aoc[cName] = clip; animator.runtimeAnimatorController = aoc; } } //你的代码 SetClip(animator, clip, "1t"); SetClip(animator, clip, "2t"); SetClip(animator, clip, "3t"); SetClip(animator, clip, "4t"); //老动画的添加 animation.AddClip(clip, "1t"); |
新动画 <= 老动画
3、动态的改变AnimationClip的速度
两步,1,加入左边加入速度参数,2,在动画文件的右边文件挂接参数
代码就简单了:
1 2 3 |
animation[name].speed = speed; animator.SetFloat(name, speed); |
这里不得不说如果不用动态改变速度的话,新动画无疑是比老动画强大的
新动画 < 老动画
4、Loop与ClampForever
这个是动画的模式,新动画在编辑器里面进行设置,老动画一样,代码上我没有深入研究,估计没有提供。
新动画 < 老动画
总结:
以上的使用,在代码的支持上,无疑是老动画更胜一筹。
Unity在对动画系统的升级上,更多的是将此系统专业化,也就是偏向了动画师的调整,这里说一些老动画没有的:
- 动画融合在编辑器中精确调整
- 动画的串连在编辑器中可以进行编辑
- 分层播放动画,例如人类角色上下半身播放不同的动画
前2条在老动画上只能通过代码实现,而第3条则全不支持。
新老动画的适合范围从上也可以方便比较出,如果你想代码量少而优雅,新动画系统完全可以满足你。此篇文章也是在API上做比较,不讨论新老动画在实际使用的好坏之比。
End~