今天实现的内容:

翻滚和跳跃的重新设计

按照黑魂游戏的设计,跳跃其实只有在跑起来时才能起跳,并且伴随翻滚动作,也就是说我们之前设计的主动向前跳跃的功能在黑魂游戏里是没有的,我们的设计要改。

现在的设计是将跳跃键替换为翻滚键,让翻滚取代跳跃,并且只有跑起来时按下翻滚键才能跳起来,并且在落地时会进行翻滚。

翻滚动画及触发逻辑

这是一个前滚翻的动画,需要将动画的Y轴位移也bake into pose。

黑魂复刻游戏的玩家控制器(翻滚及跳跃的重新设计)——Unity随手记_unity3d

将动画直接加入到动画机。翻滚会发生在玩家主动按下翻滚键时进行,并且直接转换回ground。

黑魂复刻游戏的玩家控制器(翻滚及跳跃的重新设计)——Unity随手记_unity3d_02

转换条件是当玩家按下翻滚键时(原来是跳跃键),触发动画机参数roll。roll的触发告诉动画机进行转换。

黑魂复刻游戏的玩家控制器(翻滚及跳跃的重新设计)——Unity随手记_unity3d_03

由于ground可以转换到多个其它动画状态,所以优先级就显得很重要了。配合roll和jump的相关代码,优先级如下。

黑魂复刻游戏的玩家控制器(翻滚及跳跃的重新设计)——Unity随手记_unity3d_04roll和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参数来触发。注意转换优先级。

黑魂复刻游戏的玩家控制器(翻滚及跳跃的重新设计)——Unity随手记_unity3d_05

触发代码如下。

	// 当跑起来时按下翻滚键 才能进入跳跃
	if(pi.run && pi.roll) m_anim.SetTrigger("jump");

图片来源:h5游戏