射击游戏手感与表现构建综述(下)

鹤舞九霄

2021-11-155597次浏览

2评论

10收藏

2点赞

分享

>>> 射击游戏手感与表现构建综述(上)

三、枪械系统

3.1 枪械骨架规格

Root位置即枪械Entity的位置。

HP_Camera_Iron和HP_Camera_Optical用于相机挂接。

HP_Root是驱动枪身运动的根骨骼,其子级的每一根骨骼有着各自的挂接效果。因此,ADS视角下做出枪械在镜头空间的运动,即保持相机挂接点不动,驱使HP_Root及其子级运动即可。

HP_Root下的各个Function骨骼,用于挂接枪械的各个配件,或者作为特效的挂接点,根据项目的需求自定义。

枪械骨架规格是铺量生产和功能扩展的基础。

3.2 待机时的一些表现

3.2.1 TPS开镜

TPS开镜的本质是镜头类型的转换。2.2.3中已提到,引擎通过Blender实现TpsPlacer过渡到FpsPlacer。完整的开镜逻辑如下:

1、通过一种自定义Blender(为了实现自定义的非线性过渡规律,根据项目需要由策划定义)将TpsPlacer切换为FpsPlacer。并根据装备瞄准镜倍率,对应缩小FOV。

2、FPS Placer的位置,是相对于角色Entity Pos的一个固定偏移量,该偏移量根据状态(站蹲趴)有所不同。

3、对玩家自己,隐藏世界空间中的主角模型。世界空间的主角使用举枪瞄准动作,为的是给其他玩家看。

4、将精度较高的枪械模型,挂接至镜头位置(挂接时计算偏移量OXn,保证镜头中心对准瞄具中心),挂点已和程序、美术约定好(参照3.1的枪械骨架结构)。并播放枪械开镜动作。

3.2.2 枪身随镜头左右摆动而摆动

FPS或ADS视角下,当镜头左右摆动时,枪身需要随着镜头做左右摆动的动作,如下动图所示。

实现方式如下。

参数层:以Yaw方向(左右方向)为例。镜头的Yaw值记为CameraYaw。然后构建一个略微滞后于镜头的Yaw值(具体滞后多少直接影响摆动手感,滞后得越多则摆动手感越慢),记为CameraYawDelay。二者相减得到△Yaw,表示镜头在过去一小段时间内的一个运动趋势。下图即表示了镜头向右快速摆动时的情况。

动作层以及参数与动作的映射:有两种实现方式,使用动画资源叠加计算和使用引擎旋转枪身骨骼。

使用动画资源就需要动画师输出一个序列帧,第一帧为向左摆动最大,中间帧与待机一致(作为基准帧),最后一帧为向右摆动最大。这种制作方式需要动画师为每把枪的骨架都输出一个这样的动画资源,并且迭代时也要遍历一遍已有的所有枪,维护和扩展成本大。

使用引擎旋转枪身骨骼无需动画资源。需要计算HP_Root的骨骼旋转,旋转量由△Yaw的值映射而来。这种制作方式只要策划调整一次参数就可以应用于所有的枪,无需关心资源变动,维护和扩展成本小。

3.2.3 侧身Peek

ADS视角下的左右Peek,可以拆分为镜头和动画两部分。

镜头根据是左peek或是右peek叠加一个△offset(策划配置数值)到当前镜头offset上,并使用Mover过渡。

动画表现依然有两种实现方式。由于使用动画资源叠加计算的维护和扩展成本大,因此本段主要介绍使用引擎旋转枪身骨骼的实现方式。

为保证手感,准星应保持在屏幕中心不动。所以镜头与准星构成的连线(下图中红色圆圈指向屏幕内侧方向)即为旋转轴。

然后需要保证待机、左peek、右peek互相切换时,动画上表现得平滑。

以左peek为例,假如左peek时的旋转角为5°。下面三个过程分别表现了瞬切、线性、先快后慢三种过渡方式。只要定义时间与旋转角度的函数关系,就可以实现不同的过渡方式。

如果使用动画资源叠加计算的方式实现Peek效果,那么Peek的动画过渡过程原理也类似。例如Peek动画的起始帧为左Peek、中间帧(基准帧)为待机、结束帧为右Peek。待机时Peek动画的播放进度始终位于中间帧0.5的位置,当左Peek时,驱动0.5以某个规律变为0.0,这个数值变化规律就会映射到动画的变化上。

3.2.4 呼吸抖动

ADS视角下呼吸抖动的体验,本质上是准星位置在晃动。而准星位置晃动有两种方式,一种是枪械在镜头空间不动,镜头本身在动;另一种是枪械准星位置在镜头空间内动(也可以二者都动,根据项目需要决定)。

运动的规律由策划定义x(t)和y(t)组成的参数方程决定。

以下参数方程可作为参考。

x(t) = -cos(t)

y(t)= -sin(2*t)

图像如下图所示。

并开放给策划以下配置参数:X方向的幅度、Y方向的幅度、周期、呼吸前准备时间。

3.3 UI准星

UI准星用于表示非ADS视角下的子弹散布范围,随主角动作状态而变化。

3.3.1 UI准星像素值变化

策划定义每种状态,以及每种状态对应的UI准星像素值。再定义准星状态转换时的过渡时间和过渡规律函数。

脚本按照策划配置数据,计算并刷新每帧的UI准星像素值。同时考虑过渡到一半时进入到新状态的衔接(如下图红线进行到一半又跳转)

3.3.2 子弹散布范围

期望体验为,子弹出射点为准星UI范围内的随机一点。随机算法要做到均匀。下面左边两图都是反例(左图是两边密中间稀疏,中图是中间密两边稀疏),最右侧图正确。

以上算法转自链接:
https://www.cnblogs.com/yunlambert/p/10161339.html

3.4 开火动作和状态机跳转

3.4.1 半自动/全自动开火枪械

开火动作可以分为开火状态和开火后摇状态两段。开火状态下不接受新的开火指令,开火后摇状态会被新进入的开火指令打断。

这类枪的期望体验是,随着连射的子弹数增加,枪模型会保持在一个比较靠后的位置前后震动(不影响准度)。

“随着连射的子弹数增加”实现思路:可以理解为随着时间积累。可以给枪的根骨骼累加一个随时间不短后移,达到一定时间后不再后移的偏移量。这样可以实现“连射时越大越靠后”的体验。

“枪模型保持在一个比较靠后的位置前后震动”实现思路:

纵轴表示枪械动画在前后方向的幅度,幅度越大越靠后。红色和粉红色表示只开一枪的完整过程。连射过程是大红色(第一枪)→蓝色循环播放(后续枪)→浅蓝色(最后一枪的后摇)。

枪械的连发射击间隔通过缩放△t得到(图中示例射击间隔为0.1s)。

3.4.2 栓动式枪械

开火动作分为开火状态和拉栓状态两段。这类枪械只有单发,所以无需考虑连射。开火状态动画设置为叠加,拉栓状态动画设置为融合(为了展现原有的动画)。

“卡镜”操作:开火状态之后,如果不松开开火键,将不会进入拉栓状态。特定情况下玩家需要观察狙击枪的子弹落点时会用到。

3.5 后坐感

3.5.1 后坐模式

从“子弹出射点”、“镜头(屏幕空间)晃动”和“枪模型抖动”三个维度思考。可以将后坐模式分为两大类。

第一类是仅直射。代表游戏CS、CF、Varolant。它们的子弹出射点前几发与瞄准点重合,后续开始与瞄准点有偏差;镜头晃动整体较小;枪模型抖动不影响子弹出射点,只作为美术表现。

CSGO连射:

第二类是直射+ADS视角。代表游戏PUBG、COD、APEX、R6。它们的子弹出射点,在直射视角下随机散布在准星UI范围内,在ADS视角下为瞄具准星点(即使它不在屏幕中心)。

COD16直射连射:

镜头晃动:ADS视角下,考虑不进行人工压枪的情况,从着弹点分布上看,分为压枪类(PUBG和R6)和图案抵消类(APEX、COD);

压枪类的PUBG连射:

图案抵消类的COD连射:

枪模型晃动:ADS视角下,枪模型晃动导致瞄具准星点晃动,进而影响出射点(偏离屏幕中心)。

3.5.2 后坐力定义及作用

直射的开火出射点已在3.3.2中提到。本段主要介绍ADS视角下的开火。

从APEX的着弹点图案由果推因。可以看出,图案抵消类的着弹点,每次的分布趋势相同,但是有细微差别。

镜头(屏幕空间)晃动规律保证“每次的分布趋势相同”,这里将其定义为“后坐力”。PS:下文提到的所有“后坐力”,均指“镜头(屏幕空间)晃动”规律。

构建类似APEX和COD这种图案抵消类的后坐力,期望的体验是:1、连射时能感受到恰当的“弹簧感”;2、着弹点分布为图案抵消类的着弹点集合。

1、“弹簧感”的实现思路:开一枪之后,屏幕晃动分为上抬、维持、下降3个阶段。上抬和下降的规律使用类半衰期规律(也可以使用线性过渡规律,由项目决定),如下图所示。

关键参数说明:

A0:本枪晃动幅度(分为垂直和水平两个方向)

t0, t1, t2:上抬、维持、下降时间。

t3:连射间隔。

红色交点表示下一枪出射。A1为本枪在连发时着弹点上抬幅度。

还有一个参数%k可以调节t2结束时的终点落在A轴的哪个位置。

2、“着弹点分布的趋势相同,但是每次有细微差别”的实现思路:给定每一枪的A0,这样可以保证着弹点分布是固定的。连射着弹点分布的细微差别,通过“非后坐力表现的镜头震动”和“枪模型随机抖动”实现。

综上,后坐力只负责“弹簧感”和“固定的着弹点分布”。

3.5.3 开火镜头震动

开火时的镜头震动模拟的是阻尼震动,并且几乎不影响子弹出射方向。因此,镜头的震动主要维度是Roll方向。

可以根据项目需要由策划定义震动形式,由graph或脚本实现。

graph实现的思路:

最终合震动为Pitch方向n选1,Yaw方向n选1,Roll方向n选1。每个单个的震动都是模拟阻尼震动,

只是振幅和相位有区别。

根据枪的种类,可以分为不同的合震动类型。

需要注意的是,镜头震动曲线也要像镜头过渡一样,保证曲线是连续的,不能出现跳变。用graph实现时,可能会在一个震动结束和一个新震动的开始时出现镜头跳变问题,需要处理好。如果处理不好则需要交由脚本模拟。

3.5.4 开火时枪模型随机晃动

连射过程中,枪模型除了前后方向运动以外,在垂直于前后方向的屏幕空间内,也会做屏幕空间内部的随机晃动,即开火过程中枪模型在屏幕空间中的位置会有微幅的变化。

可以观察到,枪模型在屏幕空间内有晃动。

实现思路有三个。

(1)使用一个叠加动画。叠加一个动画师输出的序列帧,这样展现出的“随机晃动”其实是动画师制作好的一个序列。这个序列可以很长,每次连射都从中随机取一段叠加。开始叠加时要控制叠加权重从0到1过渡,否则刚计算叠加的第一帧枪模型可能会跳变一下(第一帧与基准帧差距越大,跳变就越大)。

(2)使用两个叠加动画。动画师输出一个水平方向的序列帧,第一帧枪模型摆幅朝上最大,中间帧为基准帧,最后一帧枪模型摆幅朝下最大;和一个同规格的垂直方向序列帧。连射时同时叠加这两个序列帧中的各自一帧(水平方向选一帧,垂直方向选一帧),选择依据为策划给出的水平方向序列产生规则和垂直方向序列产生规则f(x, y, t)。

(3)不使用动画。直接对枪械的根骨骼做平移和旋转计算,以驱动枪模型在屏幕空间内产生偏移,实现与2相同的效果。同样需要策划给出水平方向序列产生规则和垂直方向序列产生规则f(x, y, t)。

从着弹点分布来看,后坐力决定了下图中每一个红点的基准位置,而镜头震动和枪模型的随机晃动两部分共同决定了蓝圈的范围。最终每一枪都会落在蓝圈的范围内。实现上文提到“着弹点每次的分布趋势相同,但是有细微差别”的体验。

3.6 子弹飞行轨迹

3.6.1 TPS视角

TPS视角下的射击的本质是“朝着屏幕中心的UI准星方向发射子弹”。

但是这个视角下枪口的指向的方向并不是屏幕中心,因此需要做方向的修正。

修正规则如下:

(1)开火时,从镜头位置延准星方向发射一条探测射线,判断与场景的交点,返回交点到镜头位置的距离DIntersection。

(2)同样,从镜头位置延准星方向发射一条探测射线,在距镜头位置DCorrectedPoint米处定义一个“修正点”。

(3)如果DIntersection > DCorrectedPoint,则子弹轨迹为枪口位置沿直线指向修正点,再由修正点起水平方向延原准星方向。

(4)如果Dintersection <= DCorrectedPoint,则子弹轨迹为枪口位置沿直线指向交点。

经过以上修正规则,就可以在TPS视角下做到“朝屏幕中心的UI准星方向发射子弹,并且当枪口距离障碍物过近时子弹会被障碍物挡住”的体验,一定程度上解决了TPS视角“看不见对面人但可以被对面打到”的问题。

由于当子弹飞行方向与视线方向不平行时,才可以看到拖尾特效,所以同时也可以做到“在修正点前看到子弹拖尾”的体验。

以上是TPS视角下子弹的出射逻辑。子弹出射后又会根据“射线型弹道”和“projectile型弹道”来决定是否有下坠。“射线型弹道”在修正点后继续延准星方向飞行;“projectile型弹道”在修正点后,会再经过一个“归零点”,“归零点”后按照一定规则下坠。(PS:这里是简化版的“归零点”,可以做到“归零点距离以内指哪打哪,归零点距离以外需要预留子弹下坠量”的体验。和现实中的“归零点以距离内准星往下压,归零点距离以外准星往上抬”的体验略有差别。)

3.6.2 ADS视角

ADS视角下射击的本质是,朝着瞄具准星点(可能是机械瞄具也可能是光学瞄具)的方向射击。因此在瞄准准星点处添加一个用于定位的骨骼HP_Sight,镜头点与HP_Sight组成的方向向量就是子弹的出射方向。这样,如果枪械做了一些动画,使得HP_Sight点偏离了屏幕正中心,子弹出射的方向也会做对应的偏移,最终达成所见即所得的效果。实际上,子弹就是从瞄具而非枪口射出的。

然而在ADS视角下,目标体验还是“子弹是从枪口而非瞄具中射出”,就需要做类似TPS的修正。

玩家感知到“子弹是从枪口而非瞄具中射出”,往往是从子弹飞行轨迹特效中感知的。因此只要做出“从枪口开始,到准星与目标交点位置的轨迹连线特效”,就能将这个体验传达给玩家。

3.6.3 子弹下坠

由策划给出开始衰减的位置,以及后续衰减的参数(包括阻尼的模拟,重力加速度的模拟等等)。

3.7 受击

3.7.1 Hitbox

根据角色的骨架制作与模型尺寸相匹配的Hitbox。各个部位的Hitbox在伤害结算时,会乘以不同的伤害倍率,以鼓励玩家击打要害部位。

也可以制作比实际模型尺寸大一圈的Hitbox,让玩家有一种以为自己的枪感很棒的错觉。

此外,不同子弹与相同Hitbox碰撞时,范围可能也会不一样(即子弹并不是一个点,而是有体积的;或者是以原始子弹为中心,环绕一周打了好几个只做判交而不承载特效的“虚拟子弹”,只要有一个命中就算这一枪命中)。

3.7.2 命中特效

命中特效除了要以命中点为加载位置以外,还要根据命中的远近调整命中特效的缩放比例(距离越远需要放大得越大,由策划给出放大的公式)。

此外,单发命中的特效要比连发命中特效更醒目。连发命中时,特效播放需要策划给出规则(大特效和小特效如何交替播放,间隔是多少,如何去掉重复感等等)。

5 结语

以上为笔者在项目开发过程中,关于射击手感与表现构建的经验总结。个人理解难免有错误之处,还望包涵和批评指出。

>>> 返回《游戏手感的解读》专题查看相关课程

评论 (2)

0/1000
网易游学APP
为热爱赋能
扫描二维码下载APP