腾讯游戏开发精粹Ⅲ
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3.2 移动预表现与技能衔接处理

然而实际的对局场景比理想情况要复杂得多,MOBA类游戏的一大核心乐趣就是复杂的技能连招释放机制,技能和移动的衔接是非常高频的操作。当移动和技能状态切换时,如何保证角色位置和动画的平滑过渡是移动预表现方案必须考虑的问题。图1.5所示的是常见的技能与移动衔接的场景,图中白色方框为角色当前时刻的逻辑层位置。下面将进一步阐述图中各场景的处理方案,需要注意本章中的技能本身都是没有预表现机制的,技能的表现完全由逻辑层驱动。

图1.5 预表现移动与技能衔接示意图

1.3.2.1 响应逻辑信号停止预表现移动

第一种场景是在移动过程中使用主动技能或者受到DeBuff技能的影响,角色移动被技能打断,转而执行对应技能的逻辑和表现,如图1.5所示。在这种情况下,需要响应技能在逻辑层产生的特定信号,比如“停止移动”。然而某些逻辑层的信号可能是非常通用的,游戏中的技能、蓝图、帧命令可能都会执行同一段代码产生相同的逻辑信号,因此需要在代码中筛选出产生特定逻辑信号的技能。一种常见的做法是为所有的技能逻辑更新提供统一的入口函数,在入口函数中记录当前技能。注意,某些主动技能在执行过程中可能嵌套产生新的带有控制效果的DeBuff技能,比如角色A使用主动技能命中角色B,对B产生了眩晕的DeBuff效果。因此在入口函数中需要使用一个栈来记录,每个技能逻辑更新开始时将技能压栈,逻辑更新结束时出栈,栈顶就表示当前正在执行逻辑功能的技能。

具体到移动预表现方案,我们主要需要监听两种逻辑信号:“停止移动”,表示停止当前正在进行的移动;“禁止移动状态”,表示逻辑层不再响应后续的移动帧命令。在移动预表现过程中,当收到技能在逻辑层产生的“停止移动”信号时,立即停止对移动的预表现,但此时不要主动播放“Idle”动画,因为逻辑层没有“Idle”动画的事件而是直接过渡到技能动画;当收到“禁止移动状态”信号后,用户的摇杆操作将不再被预表现功能响应,直到“禁止移动状态”被解除。基于这两种信号,就可以完成从预表现移动到技能的过渡。

1.3.2.2 位移技能的表现层插值调整

第二种场景是技能打断移动预表现之后,技能对客户端主控角色进行了位移操作,如图 1.5所示。通常而言,由于具有位移操作的技能,玩家对表现位置精确性的要求相较移动更高,因此本方案在位移结束时进行一次表现位置校正,将角色表现层位置同步到逻辑层。然而,当角色由预表现移动状态进入技能状态时,由于网络延迟的存在,角色的表现层位置和逻辑层位置通常是有较大差异的。之后,如果表现层和逻辑层保持同样的方向和速度进行插值位移,在位移结束同步表现位置时主控角色会发生瞬移,产生剧烈的画面抖动,这会影响玩家的技能体验。因此必须对技能位移过程中表现层的插值移动方向和速度进行微调,如图1.6所示。在位移开始时,根据逻辑层位移的终点和表现层的起点,可以计算出表现层插值位移的方向和距离。同时根据逻辑层位移的距离,可以计算出表现层位移相对逻辑层的速度比值。通过以上调整,在逻辑层位移结束时,表现层也几乎位移到了逻辑层终点,避免了角色远距离瞬移的发生,保证了位移技能的平滑表现。

图1.6 位移技能插值调整示意图

1.3.2.3 从技能后摇恢复预表现移动

第三种场景是从技能后摇阶段恢复移动预表现状态,如图 1.5所示。在MOBA类游戏中,技能通常需要执行多种逻辑功能,例如发射子弹、产生Buff、造成伤害等。当技能执行完所有的逻辑功能后就会进入后摇阶段,这个阶段的技能通常只执行一些动画和特效的表现,玩家可以用移动或者其他的技能去打断当前技能的后摇,从而更快地进行下一步操作,MOBA类游戏中常见的“走A”就是利用这个原理实现的。

当角色的“禁止移动状态”被解除,技能进入后摇阶段之后,即使玩家滑动了摇杆,也不能立即开始移动预表现。这是由于技能没有预表现机制,表现层要停止技能的动画和特效必须停止对应的逻辑层功能,这是不被允许的。因此,必须等到客户端收到服务器下行的移动帧命令后,由逻辑层的移动指令打断技能后摇。此时移动预表现组件监听到对应的逻辑事件后重新开始进入预表现状态。