Unity-Animator可视化动画状态机是把双刃剑|问题总结|填坑笔记
前言
Animator成也可视化,败也可视化。Animator可视化的方式处理动画过渡效率是极高,效果也是极好的。在小项目里我炒鸡喜欢用它。但我一直认为Animator可视化的设计是把双刃剑的存在,使用不当就是灾难!为何这么会说呢?看张图先体会一下:
双刃剑
Animator通过Argument condition以及Trigger来切换State,这些参数的背后又藏着多条逻辑。为了尽可能好的维护Animator的可读性,我们会对参数进行规范的命名,至少要能看出参数所代表的实际目的。而总是存在近似的实际目的,那我们如何处理呢?是仍然用原先的参数呢?还是希望新增一个参数来细化实际目的呢?
如果使用原先的参数,那意味着这个参数会有多个实际目的,这在后期是糟糕的,因为我们不能知道它的发生代表哪个实际目的。同样如果我们希望细化实际目的,那么新增参数也需要维护。在项目开发到一定阶段时候参数就会越来越多,我们就需要额外的关注去维护这个参数表。每次打开可视化界面看着那么多参数堆在一块就闹心,不过如果参数数量控制在合理的数值内这相比前者那种做法会好一点,至少在错误发生时,我们能够轻松的溯源。
这种问题在设计时候往往是被我们忽略的,看似无关紧要,但它已经埋下了隐患,这是设计隐患。不只是参数,随着项目体量的增大,逻辑、状态、转换的路径、参数都会越变得复杂。尤其是转换路径!转换路径不仅密密麻麻也迷迷糊糊!难道不觉得它是最令人头晕的东西吗?转换路径中的转换条件永远都是隐藏在转换路径背后的,而且在界面上显示的每一条转换路径也可能存在多条转换路径,其中的每一条路径的转换条件必定是不一样的,但他们却实实在在的被我们隐藏了。用状态机是为了方便,但转换路径的存在让明日的我忘记今日的成果。哦?找来找去,可算找到你了。
这些问题还勉强能够忍受,但是!但是下面这些问题让我开始思考Animator该不该用的主要原因!因为是参数驱动转换,有时你会迫不得已需要让动画驱动逻辑。我不喜欢这样子,因为我觉得将逻辑绑定在资源文件上,是好似强制人做一种见不得人的事情。我们知道可以在动画上添加事件帧来执行某些操作,不过要注意在动画状态机种存在融合过渡,也就是说动画可能会提前结束。我们绑定事件的前提是:你所做的操作仅是依赖这一帧,这一帧不出现不会影响到程序。所以一般我也就绑定跟显示相关的。如果你希望在进入动画数帧之后一定去执行某些操作,那么就要思考是否有问题了。想到一个很好的例子,fps切枪的过程中玩家受到攻击,那么切枪动作通常会被打断进入受击动作,如果我们按照前面将切枪动画两个动画的切换逻辑绑定在动画上,那么必然就出现了问题。有时候希望某个状态在进入、更新、退出状态的时候去执行一些逻辑,这时候会用到StateBehaviour。这个东西怎么说呢?它只提供了几个动画生命周期钩子,类似与MonoBehaviour的脚本,生命周期是位于Update之后的,因为开放的就只有可怜的那么几个钩子,所以实际上有点鸡肋。我使用它SendMessage来执行一些逻辑。好了,又将逻辑绑定在了状态机的动画状态上了。太棒了,一不小心这又隐藏了一层信息,而且这层信息是只有一方知道的,代码中检索不到任何信息。一旦出错,可想而知。而且Statemachine的生命周期默认是位于update之后的,OnAnimatorIK之前的。所以每当我用到Statemachine的时候都是步步小心时时在意的,会反复思考有必要吗?有可替代的吗?会有问题吗?在有可替代的方案时候我是绝对不会用StateBehaviour的。
2023/8/14未完...今天就先说道这吧,还有很多没说。对于Animator的吐槽实际主要是想说Animator并不适合所有项目,至于是否该使用没有绝对的说法,状态多、行为复杂的项目,在使用前还是先思考一下这个问题吧。
填坑日记
Layer-AvatarOverride的问题
2023/8/24
这几天在做BipedIk,发现一个问题:“Animator动画分层Override后Ik的旋转与位置效果都出现了偏差,姿势极其怪异。跟Override之前的正常效果是完全不一致。”。就总感觉动画层的Avatar覆写是迟于IK处理的,如果说Override操作在Ik之前的话,ik得到的骨骼信息是覆写后的,最后ik的效果应该与不做重写的Ik效果没差才对。但是仔细想了一下,要是如我猜想所说Override迟于IK,那么Ik就更不可能去正确处理重写后的动画了,可是在静态的举枪瞄准姿势下还是正常处理了,而在姿势差别不大的射击动画下却出现了问题。这其中到底是怎么回事,我也实在是想不明白了。还是需要看源码到底是怎么个处理流程了,如果有朋友知道的话希望可以给我留言交流一下。
补充:一开始怀疑是AnimationRigging的问题,发现这个问题后去用了final ik以及Unity自带的AvatarIK(OnAnimatorIk),同样都有这个问题。现在打算对每个需要IK的动画都去调整一下了,没办法工作量有点大。
跟得了小儿麻痹一样。
补更:
无语了,换了一个射击动作又正常了。解决了!是因为骨架不一样Avatar重定向出现了偏差导致的,大概率是这样。以后骨架只要有些许不一样的模型都要注意这个问题了,最好要能够CopyAvatar,这样的重定向大概率是不会出现问题的。CreateAvatar生成额外的一份骨架虽然也能用,但也别太高看unity的重定向,模型的骨架不一样容易出现问题,要是在动画预览就能够直接观察到骨骼扭曲问题那还好,怕就怕在像这次发生的这种问题,要等到某一阶段的时候才能观察到隐性的问题显然是致命的。差点就掉进深坑了!
来源:麦瑞克博客
链接:https://www.playcreator.cn/archives/unity/3266/
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!