学习做动画4.回转运动
1。打开ABP_CharacterBase
新建一个状态别名,状态别名的简单作用就是,可以代表某一个状态过渡到另一个状态。在下图中我们勾选了Idle与Cycle,则可以表示在符合条件的Idle或Cycle状态时,由状态别名过渡到EG状态。
新建一个状态别名,命名为PivotSource,新建一个状态,命名为Pivot
如何触发这个回转的条件呢,简单来说,是当前角色的速度(角色当前朝向某方向的速度)与角色当前的加速度(玩家输入的移动方向)相反时。
我们在Pivot Source->Pivot的判断条件内
Pivot->Stop则直接使用共享条件即可
2。这一步我们要设置从Pivot->Cycle的条件了
这里可以考虑使用动画通知状态来进行。当动画通知状态被激活时,我们可以从Pivot进入到Cycle。
我们在这里新建一个动画通知状态,命名为ANS_ToLocomotion
创建好后暂时不用理会。
回到ABP_CharacterBase内,进入Pivot->Cycle的条件
新建节点
然后选择我们刚才新建的状态通知
这样子就设置好Pivot->Cycle的条件了。
3。这一步我们需要设置Pivot内的动画。可以参考前面的做法,在接口内新建一个动画层
打开ALI_AnimLayerBase,新建一个动画层
然后回到ABP_CharacterBase,将动画层的部分连接
然后打开ABP_LayerBase,进入Pivot的动画层,为Pivot新建一个状态机
进入状态机,新建一个状态
进入状态内,在细节面板将序列与显式时间设置为动态值
并且在“变为相关时”绑定函数
这里需要用到加速度,而加速度我们需要进入ABP_CharacterBase内获取,所以我们现在打开ABP_CharacterBase
先新建一个工具函数GetOppisiteDirection,获取加速度的反方向
新建一个函数UpdateCardinalDirectionFromAccleration
勾选线程安全,放入到线程安全函数里
再回到ABP_LayerBase的SetupPivotAnim
接下来,为"更新时"绑定一个函数UpdatePivotAnim
这一部分是判断速度与加速度的方向是否为相反的,通过判断来进行距离预测
若为真,则表示当前速度与加速度的方向相反
若为假,则表示当前速度与加速度方向相同
接着,进入Cycle的动画层,将朝向扭曲与跨步扭曲复制
进入到PivotA
4。我们将PivotA复制一份,命名为PivotB
所以接下来我们需要对上一帧的加速度获取与判断
打开PivotA,在SetUp内
此时,在PivotA->PivotB的条件内
然后我们需要对PivotA与PivotB设置同步组,就像Cycle的那样
5。在此时进行测试时,仍有小问题:当角色向右行走时,突然向前,则会有一小段卡顿。为了解决这个,我们需要判断角色的加速度夹角出现“垂直”的情况。
进入ABP_CharacterBase,创建函数UpdateIsMovingPerpendicularToInitialPivot(输入的运动方向是否垂直于回转运动的运动方向)(需要勾选线程安全)
然后进入Pivot状态
为其绑定一个函数SetUpPivotState
在SetUpPivotState内,我们需要将当前玩家速度的方向设置为变量
然后在函数UpdateIsMovingPerpendicularToInitialPivot内,我们需要对当前速度的方向与当前加速度的方向进行判断,得出的bool就是当前角色是否有与回转运动垂直的加速度
然后将这个函数放于线程安全函数
现在我们有了这个bool值,我们可以通过这个bool值判断角色是否需要再次进入回转状态。
进入ABP_LayersBase,PivotA->PivotB的条件内,加入这个bool
这样子,在出现与玩家回转运动相垂直的加速度的情况时,会过渡到Cycle而不会进入回转。
但是此时还不够,我们仍然需要添加过度条件。
在ABP_CharacterBase内,再添加一个过渡条件
同时,这里也要新加新的过渡条件,优先值设为2
在Start状态内,绑定一个新函数
然后进入刚刚新建的过渡条件内
这样子使得Start->Cycle与Pivot->Cycle可以提前过渡,免得动画前段无用的部分。