动作是战斗系统中的重中之重了,不然为啥总说动作打击感呢?
先来看几段视频,本文所讲述的就是下面几款游戏背后的动作机制:
龙姬:
(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不太清楚,放一小段视频:
cool