动作是战斗系统中的重中之重了,不然为啥总说动作打击感呢?

先来看几段视频,本文所讲述的就是下面几款游戏背后的动作机制:

龙姬:

(26秒开始)

(1分43秒开始)

(1分24秒开始)

动作打点

平日里常说的动作打点,其实就是Unity中Animation的Events,我给它取了个名字叫逻辑关键帧,意为在Animation播放到这些帧时,会触发一些关键逻辑。

逻辑关键帧需要策划、美术、程序三方约定好种类和对应的规则,之后由策划根据需求决定每个动作每个点的位置。

以inception技能动作的主要逻辑关键帧为例:

  • start 动作开始点:可用于触发技能特效的播放,以及结合end点计算动作时长等。
  • hj 动作前摇点:在此之前的动作都算作前摇,可以被控制技能打断。
  • hit 打击点:可以有多个,用于展示战斗结果,比如受击特效、伤害跳字等。
  • sk 特效点:可以有多个,用于播放指定的特效或音效。
  • cs 连招分支点:在cs点之前和之后点击技能按钮释放的下一个技能是不一样的,即根据不同的节奏可以打出不同的招式。
  • bs 动作后摇点:在此之后可控制玩家行走,实现 hit-and-run。免疫受击结束,可以被打出受击。
  • end 动作结束点:可用于触发技能状态的结束。

hit点的重要性

在以上逻辑关键帧中,hit点扮演了相当重要的角色。

要提升动作打击感,首先得要保证打击效果(伤害、受击、眩晕等)跟动作在时间上的吻合度,这是最基本的。对于单机游戏来说这并不是什么困难,但对于服务器结算的网络游戏来说,由于网络延迟的不可控,就得花点心思了。

Inception所采用的解决方案是,服务器提前结算战斗结果,立刻通知到客户端。这里就不展开讨论,在本系列另外一篇中在详述。

动作位移

站桩打总觉得无聊,动作位移可以给打击感增色不少,有两种方式来实现动作位移,各有其优缺点。

程序位移

美术做原地动作,由策划配置位移参数(移动距离、移动速度等),程序编写代码根据策划的配置计算并控制动作的实际位移。

优点:

  • 移动速度和距离等方便策划控制,可快速调整并预览效果。
  • 服务器和客户端之间的位置同步简单,只同步位移终点即可,移动过程通过统一的公式计算。

缺点:

  • 表现力有限,难以拟合不规则的位移,只适合比较简单的位移,比如匀速直线位移。

美术位移

美术将位移做到动作中,程序负责播放动作,但要根据根骨骼的位移,结合场景中的碰撞信息,计算实际位移,防止角色穿墙。

优点:

  • 想怎么动就怎么动,如果动作美术功底到位,这将是提升打击感表现的大杀器

缺点:

  • 策划无法通过参数控制位移效果,依赖美术,调整周期长。
  • 客户端和服务器之间的位置同步需要额外开销

这种位移方式在Unity中需依赖Root Motion来实现,有些动作选项的勾选比较讲究,可以参考这篇文章:{% post_link Unity-Root-Motion %}

在实际开发过程中,美术位移多用于技能动作,毕竟程序位移的效果太受限了,但技能动作却是表现打击感的重中之重。好在技能动作的动作位移大都是定死的,不会经常调整,因此比较适合使用美术位移。

举个例子,原始技能动作(注意背景中的参考线,可以看到动作是有位移的):

游戏中的实际效果:

而击退、击飞等受击动作的位移一般用程序位移来实现。这种动作位移一般比较简单,更重要的是,位移的距离、速度等参数是经常需要调整的,如果使用美术位移的话调整起来不方便,需要策划和美术互相协调,开发效率上可能会受点影响。

比如海龟的击退动作就是个原地摇头而已:

在游戏中加上程序位移后的表现:

动作分段

有些动作的时长不好确定,比如策划想配置旋风斩技能的持续时间,跳斩技能在平地释放和从高处往低处跳跃的时长也是不一样的,等等。

这时就需要将动作分段了,动作分段主要用来应对动作时长不固定的情况。

此类动作有个特点,动作中有一段是可循环的,比如旋风斩的旋转阶段,跳斩在空中保持固定姿态的阶段。因此可以将一个完整的动作拆成三段,循环动作开始之前作为一段(一般为起手动作),循环动作作为一段(持续动作),循环动作结束之后作为一段(一般为收招动作),共三个动作。

可选方案:单个动作 + 关键帧

对于跳斩和旋风斩的情况,也可以不拆分动作,而采用单个动作 + 关键帧的方案来实现。

策划同学可以在动作中指定两个关键帧,标注循环部分的开始和结束,程序在代码中对动作的播放进行控制即可。

这种方案的一个特例是,循环部分只需要一帧,因此,只需要标注一个关键帧用来将Animator的速度设为0即可。

上下半身分离

(TODO:待整理)

综合示例

看下跳斩的具体做法。

首先是原始动作文件,动作中有水平和垂直方向的位移。:

原始动作中垂直方向的位移是按照在平地上跳跃来制作的,那碰到高低不平的地表该怎么办呢?

纯粹的美术位移自然是无法应对这种情况了,因此跳斩采取了美术位移+程序位移的方案:

  • 添加一个逻辑关键帧,用来标记角色在空中保持固定姿态的那一帧:
  • 起跳之后,播放跳斩动作,应用美术位移,直到固定姿态的关键帧为止。
  • 从固定姿态的关键帧开始,Animator速度设为0,停止播放动作,使角色保持固定姿态,按照策划配置的速度和加速度施加程序位移(继续前进并下落),同时不断检测距离地表高度
  • 当角色距离地表的高度小于指定值(可由策划配置,也可由程序根据动作打点信息计算)时,将Animator速度设为1,继续播放动作取消程序位移,同时应用美术位移,直到动作结束。

最终效果如下:

平地跳斩(0.5倍速播放):

从高处跳斩(0.5倍速播放):

gif不太清楚,放一小段视频: