文章目录
问题再现
- 问题再现
- 当前实现方法
- 问题分析
- 解决办法
- 修正后的效果
如下图,我使用摇杆操作游戏,角色在爬过墙角的一瞬间四肢会大概率出现抖动
- 墙面爬行部分使用了一个BlendSpace2D(见下图),混合了8个方向的墙面爬行动画,并使用我定义的两个Axis值(SpeedHorizontal和SpeedVertical)来确定混合空间的位置。
- 转角部分使用了一个转角的蒙太奇动画,并且该蒙太奇动画是一个RootMotion动画。
- 为了防止在角色转角(即播放蒙太奇)的时候,玩家对摇杆误操作,使角色出现错误的移动,使用了
Disable Input
屏蔽了玩家输入,等蒙太奇播放完毕,再使用Enable Input
恢复玩家输入。
- 蒙太奇结束播放,回到状态机,此时由于玩家输入被屏蔽了,所以SpeedHorizontal和SpeedVertical都是0,于是此时动画被定位在BlendSpace2D正中间也就是Idle的位置。
- 在玩家输入通过
Enable Input
被恢复之前,即输入被屏蔽的时候,玩家的摇杆可能已经被拨动,并且在Enable Input
时很大概率还没有恢复到原位,因此Enable Input
后的一瞬间SpeedHorizontal和SpeedVertical的值大概率都不是0,于是就产生了动画没有任何过渡的瞬间抖动。
在播放蒙太奇时既要防止用户的输入使角色产生位移,又不能屏蔽摇杆对动画状态机的输入,那么之前那样简单粗暴第使用Disable Input
是不可取得了,解决办法也很简单:
定义一个CanMove
的布尔变量,把所有AddMovementInput
节点前面都加上,把之前Disable Input
的地方都替换成CanMove = false
,把Enable Input
都替换成CanMove = true