Unity3D 速度黑客检测
Unity3D Speed Hack Detection
我想知道,有什么方法可以在我们的游戏中检测到像游戏守护者这样的速度黑客应用程序吗?
我在整个互联网上搜索,但没有得到满意的答案。
这取决于您的游戏,但您可以通过简单地检查每一帧玩家的位置来尝试检测速度黑客。
- 确定最大可能的移动距离每秒并将其设置为常量,这样玩家就无法在运行时更改它。
- 缓存当前位置。
- 在下次更新时,检查玩家移动的距离并将其乘以
Time.deltaTime
。
- 如果玩家的旅行次数超过允许的最大值,则玩家一定作弊了。
- Return 到步骤号。 2
这将是独立于帧速率的检查,因为您将使用最大允许距离 每秒。
解决方案是不在上面添加更多软件。该解决方案从一开始就不会受到此影响。
示例:
如果您允许您的用户向您的服务器发送他们在世界地图上的坐标 ("I am the blue player and since I moved my full allowance, I'm now at 156/467"),那么有人编写传送外挂就很容易了。只是发送不同的坐标,boom传送。孩子们玩。
如果您只允许您的用户向您的服务器发送意向消息 ("I am the blue player and I intend to move my full allowance in the direction of 156/467") 并让您的服务器弄清楚这意味着什么(玩家是否允许移动,他的限额是多少,多远蓝色玩家是否会在一个单位时间内获得)并将结果发回,你永远不会有那个问题。
不要相信客户端输入。视频游戏安全第一条规则:客户端落入敌人手中。
如果您继续信任您的客户,那么将越来越多的软件推到您的客户之上就毫无意义。只需停下来设计您的游戏,以便客户端可以发送意图并由服务器确定结果。
如果服务器一直都有所有玩家位置,而您的问题是速度破解,那么解决方案并不难(假设玩家位置不断发送到服务器)。
请执行以下操作,首先在更新玩家位置之前检查当前位置和旧位置之间的距离是否太大
var distance = Vector3.Distance(old.position, currentposition);
if(distance<=alloweddistance)
...
如果避免将 position\set 播放器更新为旧的 position\kick 播放器。一个更好的解决方案是不允许玩家将他们当前的位置发送到服务器,而是发送他们移动的方向和速度。服务器应该随着方向和移动速度改变他们的位置,而不是客户端。
我为自己的在线多人项目找到了解决方案,它适用于任何在线游戏。
为了解决这个问题,我们只需要计算服务器中的时间。例如,我们可以使用 stopwatch
并在客户端执行此操作...在特定情况下,我们可以通过网络比较它们,如果它们之间有任何差异,(比如超过 3 秒)则变为清除播放器使用速度黑客。
我在我的游戏中试过这个方法,效果很好。
我想知道,有什么方法可以在我们的游戏中检测到像游戏守护者这样的速度黑客应用程序吗?
我在整个互联网上搜索,但没有得到满意的答案。
这取决于您的游戏,但您可以通过简单地检查每一帧玩家的位置来尝试检测速度黑客。
- 确定最大可能的移动距离每秒并将其设置为常量,这样玩家就无法在运行时更改它。
- 缓存当前位置。
- 在下次更新时,检查玩家移动的距离并将其乘以
Time.deltaTime
。 - 如果玩家的旅行次数超过允许的最大值,则玩家一定作弊了。
- Return 到步骤号。 2
这将是独立于帧速率的检查,因为您将使用最大允许距离 每秒。
解决方案是不在上面添加更多软件。该解决方案从一开始就不会受到此影响。
示例:
如果您允许您的用户向您的服务器发送他们在世界地图上的坐标 ("I am the blue player and since I moved my full allowance, I'm now at 156/467"),那么有人编写传送外挂就很容易了。只是发送不同的坐标,boom传送。孩子们玩。
如果您只允许您的用户向您的服务器发送意向消息 ("I am the blue player and I intend to move my full allowance in the direction of 156/467") 并让您的服务器弄清楚这意味着什么(玩家是否允许移动,他的限额是多少,多远蓝色玩家是否会在一个单位时间内获得)并将结果发回,你永远不会有那个问题。
不要相信客户端输入。视频游戏安全第一条规则:客户端落入敌人手中。
如果您继续信任您的客户,那么将越来越多的软件推到您的客户之上就毫无意义。只需停下来设计您的游戏,以便客户端可以发送意图并由服务器确定结果。
如果服务器一直都有所有玩家位置,而您的问题是速度破解,那么解决方案并不难(假设玩家位置不断发送到服务器)。
请执行以下操作,首先在更新玩家位置之前检查当前位置和旧位置之间的距离是否太大
var distance = Vector3.Distance(old.position, currentposition);
if(distance<=alloweddistance)
...
如果避免将 position\set 播放器更新为旧的 position\kick 播放器。一个更好的解决方案是不允许玩家将他们当前的位置发送到服务器,而是发送他们移动的方向和速度。服务器应该随着方向和移动速度改变他们的位置,而不是客户端。
我为自己的在线多人项目找到了解决方案,它适用于任何在线游戏。
为了解决这个问题,我们只需要计算服务器中的时间。例如,我们可以使用 stopwatch
并在客户端执行此操作...在特定情况下,我们可以通过网络比较它们,如果它们之间有任何差异,(比如超过 3 秒)则变为清除播放器使用速度黑客。
我在我的游戏中试过这个方法,效果很好。