大家好,我是《Valorant》游戏系统团队的软体工程师Kevin Lee。我们团队负责开发《Valorant》游戏体验的移动、战斗、输入等多项核心系统。在这篇文章中,我将为大家介绍FPS游戏体验中不可或缺的系统:命中判定。
在《Valorant》这类游戏裡,命中判定可说是最重要的系统,因为游戏的输赢可能只在一记爆头之间。身为开发人员,我们的目标是要确保玩家的射击结果清楚明瞭、符合预期,而且最重要的是要正确无误。
我们有时会在玩家的发文或传来的讯息中,看到命中判定表现异常的影片。我们非常重视每一则回报,也都会逐帧检查影片,确认系统运行是否符合预期。
话虽如此,我们认为《无畏契约》命中判定系统目前已经达到颇为理想的状态。确实,系统中可能还是有一些很罕见的错误,我们仍会严正地看待及处理。我们也会继续寻找机会,改善所有系统的品质与清晰度。
正确度VS清晰度
在封测时的0.50版本中,命中判定的问题回报量大幅增加。看过玩家的回报、影片并经过长时间的内部测试后,我们成功发现了几个命中判定的极端错误案例,但这些错误都不严重,不足以解释回报数量大增的现象。经过进一步的调查,我们发现大部分影片呈现的都是清晰度的问题,而非正确度。影片中系统对于射击的判断皆属正确,但射击的视觉回馈却使玩家对结果产生误解。这也点出了正确度和清晰度之间的重要差异。
虽然两者都是射击「手感」的重要构成元素,但是……
正确度指的是射击结果判断错误(例如:子弹击头部,却被判定为击中身体,或是敌方玩家在用户端的显示和伺服器不同)
清晰度指的是射击结果在视觉上不易判断(例如:子弹击中肩膀,但视觉回馈却看起来像击中头部)
正确度错误的严重程度远高于清晰度错误
我们希望这篇文章能帮助大家了解这个系统,让各位回头检视游戏过程时,能正确解读画面中的射击表现。我会概括讲解系统的运作方式,并解释从按下射击键开始,到爆头画面出现为止的整个过程。
我也会分析几个常见的所谓「命中判定错误」回报案例,试著解释案例的实际情况,以及我们针对清晰度採取的改善措施。
从击发到爆头
开始说明武器击发当下的机制之前,我们必须先了解游戏如何模拟战斗场景。《Valorant》的游戏体验经过两层的模拟:首先是透过伺服器(模拟呈现结果以此为准),接著再由玩家的用户端二度模拟(为了让游戏体验更流畅,用户端会预测伺服器结果)。
游戏模拟包括组成游戏世界的所有元素,像是玩家的位置、交战使用的技能,以及战场上的烟尘。每个画面的生成,都是游戏撷取模拟内容后,渲染呈现在萤幕上的结果。伺服器也会以相同的机制生成每个画面(但会省略渲染的步骤,因为玩家不会看到伺服器画面)。
好啦。所以当敌人从转角探出头,你用十字准星精确瞄准,锁定对方头部,然后按下滑鼠左键射击……这时会发生什麽事?
玩家按下按键时,输入讯号会送入输入系统(可能会有小幅的硬体/作业系统延迟)。在每个游戏画面,输入系统都会处理上个画面之后收到的所有输入讯号。击发武器时,「发射」的输入讯号会与时间戳记一同传送至伺服器,以便判断射击发生在模拟的哪一个画面。
重点是,这个时间戳记是以《Valorant》收到输入讯号时,当下显示的画面为主。现在,我们必须分别在用户端模拟和伺服器模拟上追踪这个射击动作。
首先来看用户端,也就是你的本机电脑。射击动作一旦发送至伺服器,用户端就会开始运作,在画面上显示枪口爆破和弹道。由于游戏必须在你的萤幕上更新一帧画面,因此送出输入讯号后,最快要经过一帧,你才会看到枪口爆破和弹道。这一点很重要,因为显示弹道的画面,至少与收到发射讯号的画面相差一帧,这两者并不在同一帧画面上。
有时射击清晰度会因此产生问题。延迟子弹是解决画面不同步的常见方法。我们不採取这种作法,因为延迟子弹会使输入更加延迟,而《Valorant》想避免这样的状况。至于命中确认,用户端会等待伺服器回覆结果,再显示命中确认。为了确保所有使用者的体验一致,并避免作弊玩家骇入用户端伪造击中结果,击中结果一律由伺服器判定。
另一方面,伺服器最终会从用户端收到武器击发的讯息。由于网路延迟的缘故,距离真正击发武器已经过了一段时间。为了确认武器是在同一个模拟上击发,伺服器会先将模拟倒转至用户端发送的时间戳记,再评估命中判定。这个步骤包括倒转玩家的位置和动画姿势。接下来,伺服器会将结果传送回用户端。我们就假设在这个举例裡,这次武器击发的结果是爆头!
用户端会从伺服器接收到击中结果,并根据结果播放视觉特效和音效。这个例子裡,游戏会播放爆头的视觉特效和音效。用户端必须等待伺服器传送击中结果,所以弹道和命中特效之间会有时差,时差就等于你的连线来回时间(比如发送至伺服器需要40毫秒,则弹道和命中特效会相差80毫秒),再加上少量的处理时间。延迟越严重,时差就会越明显。
我们目前正从清晰度著手,积极改善这个问题。
案例一:命中移动目标
许多命中判断的回报裡,目标都是奔跑状态。我们来仔细看看武器成功命中奔跑目标的视觉画面。我们可以看到,玩家成功对奔跑目标爆头。为了让各位更容易理解这个案例,用户端的设定为60 FPS。从画面可见,弹道出现前,十字准星对准了敌人的头部。
但是在弹道出现的那一帧画面就不是如此了。
第二支短片也是同样状况,只不过这一发射击差点就失误。当我们一帧一帧播放影片,就能发现事实上,弹道出现的前一帧画面裡,十字准星并没有对准头部,但是弹道出现的那帧画面裡,准星就有对准。一开始,你可能会想把影片拉到弹道出现的画面,大叫:「你看,这发完全就是爆头啊!」但是检视影片或画面回放时,我们其实必须检查弹道出现之前的那格画面,因为那才是武器击发的准确时间点。
让我们再次回到武器命中的案例,看看命中视觉特效播放的那格画面。由于网路延迟的缘故,玩家当下的位置以及命中视觉特效的位置有很明显的差异。当你回过头来检视画面,想必会觉得很奇怪,因为你很有可能只注意敌人当下的位置,忽略了武器击发当下的位置。蹲伏姿势和扫射的情况下,网路延迟肯定会造成更多问题(详见案例二)。
案例二说明了目前命中判定系统的清晰度仍有待加强。理想上,玩家就算不知道这些背景知识,也应该要能清楚判定状况。身为开发人员,我们很清楚问题所在,也已经著手研究这些案例,设法改善清晰度。
案例二:蹲伏姿势的命中视觉特效
假设你现在从远距离加入一场枪战,按住左键拿枪扫射,结果却让自己后悔莫及。你以为至少有一发子弹会命中敌人头部,对吧?可惜啊,你用暴徒射中敌人身体三枪,造成117点伤害,结果反过来被敌人爆头。
一怒之下,你在比赛结束后看了录影,确定都是因为那糟糕的命中判定在搞鬼。你看到对手玩家不断蹲伏想躲过你的子弹。但令人意外的是,你看到敌人採取蹲伏姿势时,子弹正中他头顶的命中视觉特效,对战报告却显示击中身体!怎麽会这样??
我们的团队调查不良命中判定的报告时发现,这种情况是最常见的凶手,造成了「看似」错误命中判定的状况。事实上,命中判定一切正常。当你按下攻击键,子弹确实打到你瞄准的地方(先不讲弹道偏移或移动错误),伺服器也正确记录了那一枪。
不过,有几项因素造成这个案例产生视觉上的误差。
命中视觉特效因网路延迟而发生延迟
命中视觉特效发生于原始中弹点
目标玩家移动了(大多是因为蹲伏)
再举一个例子,我们假设这为玩家PING值的是50。他在对手玩家肩部打中一枪。由于我们必须等待伺服器确认命中与否,当身体中枪的位置开始播放命中视觉特效,时间已经过了100毫秒。但在这100毫秒期间,对手玩家已开始蹲伏,把头移到新生成的命中视觉特效正后方。在远距离的激烈枪战下,命中身体的视觉特效可能被误认为爆头视觉特效。
这情况在封测时的0.50版本中尤其严重,当时所有玩家的血迹设定都因为错误而自行关闭,火花视觉特效也比较不清晰,造成难以区别是爆头还是命中身体的视觉特效。我们针对命中身体和爆头一直都使用不同的视觉特效,但也了解到在战斗中,这两种视觉特效有时难以区分。
我们正积极改善这种命中判定清晰度上的错误。我们正在实验的其中一个方法是,将命中视觉特效固定于角色中弹的身体部位,这样即使发生严重延迟,也能看清楚相对位置。
预定的清晰度改善
这两个案例点出了我们目前命中确认视觉特效的不足之处。我们正反覆测试的其中一项变更是,根据角色的中弹的身体部位产生血迹和火花效果,并随著他们移动。如此一来,对于案例二这种敌人採取蹲伏姿势的情况,将可大幅提升视觉上的清晰度,因为特效会随著他们的身体移动。
不过这个方法有个缺点,那就是如果中弹的角色躲到掩体后方,视觉特效可能也会跟著移动过去。假设PING值100毫秒的玩家朝著躲在角落不停探头窥视的玩家射击。如果他们击中敌人,结果对方在伺服器传回命中确认前,马上躲到角落后面,开枪者就无法在第一时间看到命中确认。
我们想过增添多重特效,部分特效随著角色移动,其他的则生成在中弹的位置(根据用户端模拟),藉此减轻这个问题的影响。但如果用户端和伺服器模拟对射击结果判定不一致,便会造成混淆:视觉效果必须清楚指出命中位置,才能让射击结果一目瞭然。
我们会继续反覆测试这个作法和其他改善清晰度的方法,希望很快能在日后的更新版本中推出一套清晰度更新。
希望这篇文章能让你更清楚《Valorant》命中判定的运作方式,以及我们做此判定的原因。