今天实现的内容:
翻滚和跳跃的重新设计
按照黑魂游戏的设计,跳跃其实只有在跑起来时才能起跳,并且伴随翻滚动作,也就是说我们之前设计的主动向前跳跃的功能在黑魂游戏里是没有的,我们的设计要改。
现在的设计是将跳跃键替换为翻滚键,让翻滚取代跳跃,并且只有跑起来时按下翻滚键才能跳起来,并且在落地时会进行翻滚。
翻滚动画及触发逻辑
这是一个前滚翻的动画,需要将动画的Y轴位移也bake into pose。
将动画直接加入到动画机。翻滚会发生在玩家主动按下翻滚键时进行,并且直接转换回ground。
转换条件是当玩家按下翻滚键时(原来是跳跃键),触发动画机参数roll。roll的触发告诉动画机进行转换。
由于ground可以转换到多个其它动画状态,所以优先级就显得很重要了。配合roll和jump的相关代码,优先级如下。
roll和jump的相关代码如下,首先是roll的时候需要和之前的jump一样将输入关闭,平面移动锁死。
// 进入动画节点roll时执行的方法 通过PlayerController动画机中的roll节点上挂载的FSMOnEnter调用
public void OnRollEnter()
{
// 关闭输入并且锁定平面移动
DisableInput_LockPlanar();
}
最后是roll的触发代码。
// 翻滚动画
if(pi.roll) m_anim.SetTrigger("roll");
翻滚的向前冲量
既然翻滚时锁死了平面移动,我们就需要一个翻滚的冲量来让动画显得不那么奇怪(位移和动画不匹配)。目前我们的方案是锁定后调整平面移动量为归一化后的平面移动向量乘上翻滚冲量,这样会使得走和跑时的翻滚位移完全一样。其实更好的办法是根据不同速度制作不同的翻滚动画(走路时和跑时),这样能使得我们可以针对走和跑的翻滚设置不同的速度。
// 翻滚冲量 用于使翻滚时的位移显得更合理
public float rollThrust= 2.0f;
// 进入动画节点roll时执行的方法 通过PlayerController动画机中的roll节点上挂载的FSMOnEnter调用
public void OnRollEnter()
{
// 关闭输入并且锁定平面移动
DisableInput_LockPlanar();
// 翻滚冲量
m_planarVec = m_planarVec.normalized * rollThrust;
}
跳跃并向前翻滚
之前说过,现在只有在奔跑时按下翻滚键才能跳跃。跳跃依旧采用jump参数来触发。注意转换优先级。
触发代码如下。
// 当跑起来时按下翻滚键 才能进入跳跃
if(pi.run && pi.roll) m_anim.SetTrigger("jump");
BUG以及缺陷:
其实在黑魂游戏中,翻滚键和奔跑键是一个键,区别在于翻滚是按一下而奔跑是按住。为了简化开发,这里我们就先不做成那样,而是将奔跑键与翻滚键分开。
在重新设计的动画机中,fall不会连接roll,毕竟在黑魂游戏中从高空落地后还要向前滚一圈在很多时候会将玩家送下悬崖,但是为了更好的观感,建议再加一个半蹲的动作接到下落动作之后。
值得注意的:
当我们实现跳跃时,我们写了一个信号清除器FSMClearSignals,用来清除多余的跳跃触发。同样的,对于翻滚,我们也要清除多余的触发。