真的无法反透视吗?我已经实现了。基于UE4的反透视程序调试成功
网络游戏吧
全部回复
仅看楼主
level 12
cloodshop 楼主
2L上图,
绝地求生
这类游戏的透视作弊,其实是完全可以防住的。
2021年03月16日 03点03分 1
level 12
cloodshop 楼主
首先看最终效果,上是服务器视角,左下和右下是两个客户端视角。一共存在3个人,一个是服务器的角色A,一个是左下的角色B,一个是右下的角色C。
但是左下客户端只能看到两个人,一个是自己B,一个是服务器的角色A。不能看到右下客户端的角色C。
因为A挡住了B和C之间的视线。
以下是调试信息。
这个调试信息的意思是,服务器把C的信息发送给B之前,会判断B和C之间有没有障碍物,结果发现了障碍物A,于是不发C的信息给B。于是B就看不到C。
这种看不到,是服务器做出的判断,因为服务器不把C的数据发给B,因此B上的外挂无论如何都读取不到C的信息。
2021年03月16日 03点03分 2
level 12
cloodshop 楼主
而当B往旁边移动一点,不让A挡住C的时候,B就可以看到C了。
但是C依然看不到A和B,因为我的系统还有距离和视锥检测,这一部分消耗系统资源非常少,因此是无论服务器承载多少玩家都可以常开——但是障碍物检测不行,因为消耗资源过大,我测试的时候,是在这种3角色系统下的,因此是否能流畅运行需要进行服务器压力测试。
好的,放调试信息。
上图是B的调试信息
上图是A的调试信息
以上信息说明,服务器认为B能看到C,因此把C的信息发送给B,因此B就能显示出C,同时外挂也能获取到C的信息——但是这时候能获取到C的信息又怎么样?因为玩家都能看到了,外挂并不比玩家了解的更多。
但是服务器发现C的视锥内没有B,视锥指的是人眼能看到的一个角度,这是一个可编辑参数,我这里设置成120度,如果有开8倍镜瞄准,可以把视锥角度设置的更小。因此C依然看不到B。
注意,这里的看不到,不是指玩家是星际玩家,而是指服务器认为你看不到,就不发送信息给你。
2021年03月16日 03点03分 3
level 12
cloodshop 楼主
最后来看一下我制作的系统的结构,第一个判定层次是红色部分,第一个勾是是否开启本系统。
下面有两个参数,可观察面积(单位:平方米),视力(观察1平方米大小的对象的最远距离,单位米),他们存在这么一个关系,玩家间距离÷视力≤可观察面积时,系统认为距离足够近,玩家可以看到。
它有什么用呢?主要是应对RPG游戏中的隐身挂,假设我是一个刺客玩家,当我开启隐身时,我可以将我的可观察面积由1平方米设置成0.1平方米。假设你的视力为10米,你看到我的最远距离就变成1米。如果我隐身时的可观察面积设置成0.01平方米,你看到我的最远距离就变成0.1米,小于你的碰撞体积。那么在我解除隐身之前你、你的客户端和你的外挂永远不可能知道我在哪里。
但是,碰撞和伤害在服务器上运行,因此假设你打出的伤害范围碰到我,服务器依然可以判定给我造成伤害并解除我的隐身,因此我依然可以被打出来,只是你没法使用外挂定位,只能盲打。
2021年03月16日 03点03分 4
level 12
cloodshop 楼主
第二个判定是是视锥检测,简单的说,就是系统连接观察者头部和被观察者的头部,形成一个向量。然后和头的朝向做比较,如果两个向量的夹角小于视野的一半,就认为被观察者在视锥里。
我做的稍微复杂一点,一个是,横向夹角和纵向夹角单独比较,因为人眼的纵向视野比横向视野窄。因此在纵向上,向量夹角要小于视野的四分之一,才被认为在视锥里。
还有就是,人有体积,因此我的判断有双重,一个是判断被观察者头部是否在视锥里,一个是判断被观察者脚部是否在视锥里。
只有在视锥里的被观察者,观察者才能看到。
2021年03月16日 04点03分 5
level 12
cloodshop 楼主
前两个判定都是简单的数学运算,因此对服务器负担都不重,这也是我认为这两个判定可以常开。
接下来就是第三个判定。也是打勾开启,不打勾跳过。
里面有三个参数,其中观察者头部旋转是第二项视锥判定所需要的参数(要知道头部朝向才能知道视锥朝向)。
和障碍物判定的就是观察者头部位置和隐蔽者边缘位置。
隐蔽者边缘位置可以是多个,但是至少包含“观察者头部位置”这样一个位置。一个玩家可以同时是观察者和隐蔽者。因此参数是共用的。
我测试的时候,没有添加任何其他边缘位置,因此这个判断每一次相关性计算只判断一次,就是比较双方的头部之间有没有夹着别的东西。我使用的是LineTraceSingleByChannel(),并且自定义了一个线性检测通道,这个通道可以将不透明的打勾,透明的不打勾,因此透明物体就不会遮挡视线,而不透明的就会遮挡视线。
使用LineTraceSingleByChannel()函数进行线性检测消耗的资源很大,都由服务器承担会压力很大。所以这步检测我还在研究,看看能不能降低触发频率,比如相关性检测十次,然后触发一次,剩下的都是使用上次触发的结果。还在持续研究中。
但是反透视绝对可以做到,只是厂商自己故意不做而已。
2021年03月16日 04点03分 6
level 12
cloodshop 楼主
以上是对效果和参数的说明,下午有时间再讲原理和实现。
2021年03月16日 04点03分 7
level 9
看不懂就是大佬[小乖]
2021年03月16日 08点03分 8
level 12
cloodshop 楼主
[狂汗]简单的说就是:玩家看不看得到敌人,不由玩家自己眼神决定,而由服务器决定,服务器认为你看得到,会将敌人的位置这些东西告诉你,你就看得到。服务器认为你看不到,就不告诉你敌人在哪,那么无论如何你都看不到,除非你黑进服务器获取数据。
服务器决定的时候,会进行三步运算:
第一步就是根据敌人的可视面积和玩家的视力,判断是不是足够近,太远了直接就看不到。
第二步就是判断敌人是不是在你前面眼睛看得到的方向,如果在你背后,你也直接就看不到。
第三步就是判断你和敌人之间是不是夹了什么不透明的东西挡住了,如果挡住了,你也是看不到的。
经过这三步,如果服务器还是觉得你看得到,你才真的看得到。
这时候服务器就告诉你的电脑:“嘿小伙子,在这个位置有个敌人!”
你的电脑就:“收到,在这个位置创建一个敌人并显示出来!”
你:“怎么突然冒出来个人,吓死宝宝了!”
外挂一般安装在你的电脑上,你的电脑知道这个位置有敌人,外挂就知道,你的电脑不知道,外挂也就不知道。所以这个方法就是,如果服务器不告诉你的电脑这里有敌人,外挂就不可能知道这里有敌人,也就没法把这个敌人显示到你的屏幕上。
@東方月初
2021年03月16日 09点03分 9
level 13
fps要求即时性很高,所以很多计算被放到客户端,导致了外挂横行。并不是说开发者不知道放到服务端计算可以防挂,而是这种方式带来的游戏延时不适合fps游戏,加带宽加机器都会提高成本。
2021年03月16日 11点03分 10
不知道你是跳着看的还是怎么的,我写明了这些计算哪些是可以大量玩家即时运算哪些要进行服务器压力测试的。这些计算只要服务器不卡,就一定是即时的,不存在什么放服务器运算就不即时的问题。
2021年03月17日 02点03分
level 9
问题是改了这个出了那个。。所以不敢放
2021年03月16日 12点03分 11
1