如何避免Unity动画状态机的蛛网地狱

时间:2024-04-08 17:13:22

如何避免Unity动画状态机的蛛网地狱


如何避免Unity动画状态机的蛛网地狱
Unity的动画状态机虽然功能强大,但是状态多了以后不好管理,很容易变成“蜘蛛网”一样乱成一团。
将动画状态机进行分层虽然无法从根本上解决问题,但可以得到一定程度上的改善。比如将人物的基本运动设为一个层,将攻击设为一个层,每个状态分为一个层(翻滚,防御等等)。

如何避免Unity动画状态机的蛛网地狱
人物的基本移动作为最底层,其余的特殊状态都单独分层,并且默认为空状态,检测到判断条件才切换状态。
这样做的好处就是不用减少了很多状态判断以及连线,如果不分层,向底层的运动层添加一个临时状态(比如翻滚,翻滚后状态应该恢复到翻滚前,不发生改变):
如何避免Unity动画状态机的蛛网地狱
可以看到仅仅添加一个状态连线和条件判断的数量呈几何倍上升,因为执行完动画后需要根据条件切换回原来的状态,如果状态再多一点后果不堪设想。
但如果将翻滚动画设置为独立一层,并设置为Override:
如何避免Unity动画状态机的蛛网地狱
因为这一层默认为空状态,所以即使覆盖了BaseLayer的动画也不会有任何变化。一旦检测到翻滚条件,执行翻滚动画时BaseLayer的动画就会被翻滚动画所覆盖掉。但需要注意的是BaseLayer虽然被覆盖,但依旧在对参数作出反应进行动画播放,所以当翻滚动画切换回空状态后,角色还是会播放翻滚前的动画。

因为将翻滚层设置为Override,所以会覆盖BaseLayer动画:
如何避免Unity动画状态机的蛛网地狱
翻滚动画播放时虽然覆盖了BaseLayer的动画,但BaseLayer动画状态没有发生改变,依旧在播放:
如何避免Unity动画状态机的蛛网地狱