1. ALS旋转基础
我们了解,人物的旋转首先包含三个方向:
(1)人物的输入方向,即前后左右的输入,我们称为运动方向,在ALS使用人物的Velocity
这个二维向量进行实体化
(2)人物的本身朝向,我们称为朝向方向,在ALS中通过SetActorRotation
和AddtActorWorldRotation
函数进行控制
(3)人物的控制器方向,我们称为观察方向,在ALS中通过GetControlRotation
进行获取
在人物中控制朝向方向,我们可以看到在`ALS_Base_CharacterBP``中的Even Tick中不断更新人物的旋转,在Tick中的原因也很简单,主要是进行一个平滑的过度。
在ALS中,旋转方向的设置分为移动旋转和静止旋转。
2. 移动旋转
2.1 自由模式下的移动旋转
移动中的旋转,我们主要考虑目标方向为目标方向,并为了进行旋转的平滑,使用旋转插值的处理,将朝向方向平滑的旋转到运动方向。
注意:
(1)这里进行了两次插值,主要是为了更平滑的过度,将目标量和上一次的方向进行第一次过渡,再进行旋转插值
(2)因为我们获取运动方向,是人物的Velocity转化为旋转的,因此需要在速度大于0的时候再获取,否则为0
2.2 观察模式下的移动旋转
对于移动中的瞄准,我们的目标方向变更为观察者方向,因为这个时候鼠标朝向哪里,我们人物就应该朝向哪里。
而移动观察时,需要叠加一个方向,是对于运动方向和观察方向差量的一个身体偏移的方向。
这里加了一个YawOffset
的曲线值,是因为要加上左右移动时候的差异,比如向做左跑动的朝向方向应该偏左一些,这个曲线的设置是存在于八向移动之中。
此处的LYaw
是运动方向与观察方向的插值算出的欧拉角,传入一个定值曲线去得出的向左向右的一个值。
2.3 移动旋转的总体流程
移动旋转的流程可能比较绕,其基本流程如下:
3. 静止旋转
3.1 自定义角度的计算
静止的时候,我们角色的旋转是由动画曲线的值来控制旋转的角度的。
这个动画曲线是在播放动画的地方动态算出来的,播放动画的地方是在动画蓝图的Update中。
在内部首先进行播放动画资产的判断,根据旋转插值的大小和钝锐角进行动画资产的选择。
同时动画资产强制根锁定,通过动画修改器,将每一帧的动画差量算出来,进行曲线保存。
然后我们通过等式运算,(旋转的角度/总共的角度)*播放的速率=每个差量的角度应该缩放的比例,在将此值以Scale的形式应用回动画曲线RotationAmount
,最终以AddtActorWorldRotation
的增加量的形式加到Actor的旋转上,最终实现了通过强制根锁定的方式来计算出自定义角度的改变。
注意:这里使用Add而不使用Set主要是因为不用获取初始与结束的角度,而添加每一帧的增量,很好的增加了封装性。
3.2 静止旋转的瞄准
因为静止旋转的瞄准实时都在动,所以直接使用状态机进行实现,具体参考在Locomotion States内部。
3.3 静止旋转的总体流程
静止旋转的主体在于怎么计算每一帧的旋转增量,其流程如下: