玩家不可见时如何正确预测动作?


20

我有一个多人游戏,并且正在做客户端预测,但是有些玩家可以喝一剂药,然后变得看不见...

问题在于,当他们变得不可见时,我不会分享客户可以用来知道他在那里的任何东西,因此,当玩家尝试进入一个不可见的玩家所占据的区域时,他会预测自己成功了,然后得到了服务器发送的丑陋位置校正。

一种解决方案是共享某些内容,以便客户端知道,但是黑客可以使用它来找出隐形玩家所在的位置,并作弊。

顺便说一句,我已经解决了常规运动预测问题,它的工作原理非常完美。


4
只需发送有关所有玩家的信息即可。骗子会作弊。不要削弱诚实的玩家的经验,而应该考虑为作弊者创建标记系统。
user1306322 2014年

2
@ user1306322通过使作弊者更容易,您还将削弱诚实的玩家。标记系统是一个好主意,但如果隐身性是游戏的重要组成部分,则必须采取预防措施。
ThatOneGuy 2014年

@ user1895420通常足以将其发送为纯文本格式,这样,任何普通玩家都无法轻易获得该数据。如果只有精通技术的人可以做到这一点,那么它与任何其他措施一样都是很好的预防措施。
user1306322 2014年

1
或者,也许最好改变一下隐身机制,以使其不能在非常接近的范围内工作,因此,即使那些能够通过游戏数据作弊的人也无法真正获得任何好处。
user1306322 2014年

仅当可见玩家靠近时才发送不可见玩家的位置(带有标记以使其不可见)如何?那应该给您几帧以避免过度运动的问题,同时它也不能给作弊者足够的时间做出反应。对于两个看不见的玩家,我只是忽略了碰撞。如果您拥有一个具有所有球员位置的中央服务器,则还可以协调它何时广播该位置以及何时不广播该位置。
jdm 2014年

Answers:


30

这可以被认为是动画问题。如果由于尝试移入不可见对象而从服务器返回了位置校正,则不仅要发送该校正,还要发送一个指示为什么需要该校正的标志。他可能会执行“ woah”式的向后倒转动画,而不是让玩家向后弹出,这看起来更像是他刚遇到某件事。

在使用这种方法的游戏中,从遇到的任何事物中(至少是暂时地)消除隐身现象并不少见。除其他外,这激励了隐形玩家避免拥挤或与其他角色过于接近,从而减少了与隐形玩家发生碰撞的频率。因此,即使您发生这种碰撞的动画很弱(或根本不存在),不可见的角色也会在某种程度上隐藏起来,这些隐性角色会进入可见性并向所有人清楚地传达发生的一切。

可以通过不让隐身在近距离工作来消除动画需求。这为隐形玩家提供了更多的激励,以避免他们接近其他角色。这是基于隐身的游戏和AI(将“不可见”替换为“对目标不可见”)的常用方法,可以在《战车世界》等PvP游戏中看到。如果看不见的物体离您足够近,以至于无法与之碰撞(在延迟限制之内),则无需担心与隐含字符的碰撞响应。

Dracor的解决方案只是忽略与不可见对象的碰撞也是一种很好的解决方案。这再次需要一些动画(对于不可见的玩家的客户端),因此对象不只是剪辑玩家屏幕上的化身。如果没有其他原因,您可能会导致可见对象始终推动不可见对象,因此,如果有人与不可见播放器发生碰撞,则不可见播放器会自动从服务器上移开。

不可见-不可见的碰撞有点棘手。仅禁用它们之间的冲突可能是有利的,因为没有人可以看到两个不可见的对象是否剪辑在一起(假设“不可见”,这意味着两个对象对同一客户端不可见)。如果其中一个对象变为可见,它会自动恢复为可见-不可见的碰撞响应(推开不可见的对象)。

如果隐身性复杂,哪些人可以看到谁,那么这一切都会变得棘手。如果需要,上面的第一个或第二个解决方案可能是最好的选择。并非像这样的每个问题都需要技术解决方案。许多人只需要设计解决方案(例如,不允许设计人员使用此功能)。


5
游戏《要塞要塞2》使用的是第一种方法...如果看不见的间谍触摸了另一名玩家,则另一名玩家可以看到该间谍(或者从后面看,至少可以感觉到一些障碍)。
Xantix

4

如果您不想告诉客户隐形玩家在哪里,我真的只会在这里看到两个选项:1)您忽略隐形玩家的单位冲突-一种简单的解决方案,玩家将无法通过以下方式找到隐形玩家碰撞测试。2)确定预测路径后,向服务器发送预测路径并在服务器端更正路径本身,然后将新路径发送回去。


忽略隐形玩家的碰撞的问题是,当隐形玩家与其他人碰撞时,该隐形玩家会停止隐形。另外,感觉也不对。在我的游戏中,我实际上没有路径或寻路,玩家只能沿4个方向移动,一次只能移动一个步骤
affiszervmention 2014年

然后剩下的就是发送预测的运动(单个矢量或矢量数组)并进行服务器端检查。还是像下面这样说:
Daniel Rusznyak

1
如果您有一个基于网格的地图,并且仍在逐一检查每个正方形,则最好尝试使用单向编码(例如SHA-1或SHA-2)对服务器端不可见字符的位置进行编码。 ,然后通过使用相同算法对检查的坐标进行编码来检查自己的路径。不能说这是性能有效的,但是如果您真的想在客户端执行此操作,则此解决方案可能在有限的位置上也能正常工作,并且由于要编码的网格点数量巨大,因此黑客入侵确实很麻烦并与内存中的数据匹配。
Daniel Rusznyak

我可以看到它的工作。我最小的地图有1500个不同的位置。我是否应该每隔几秒钟使用HMAC更改一次密钥,以防止攻击者预先计算所有位置?
affiszervmention

5
不,您能想出的任何方案都不会对黑客“安全”。如果客户可以确定玩家是否会与给定位置发生冲突,那么有人可以破解您的游戏。使用旋转密钥的HMACing不会阻止客户端每秒执行1500个HMAC。不要尝试自己做密码。如果您想达到最初的目标,则仅将不可见的玩家位置发送给客户端(如果它们位于玩家的1或2格内)。然后,您只能破解以了解是否有人在您旁边(这没什么用,因为您可以直接检查一下)。

2

除非我误会了什么,否则解决方案很简单。不要向所有看不见的玩家发送客户信息,仅发送那些在预期间隔内他们可能会在运动范围内发生碰撞的范围内的玩家信息。换句话说,如果客户端仅需预测未来200毫秒,则仅发送有关max_player_velocity units/sec * 1/5 sec单位外隐身玩家的信息。


我想这可能有效,但是我的游戏是基于图块的(忘了说了)。
affiszervmention

因此,仅在相邻的砖块(或2步外)或其他范围内露出看不见的玩家。
R..

那么不确定他们是否会发生冲突,并且隐形玩家将必须远离任何黑客攻击而不会被发现
affiszervmention 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.