网络的碰撞检测问题,服务端没正确检测结果

在Dedicated Server模式下,我是服务端和客户端一起做射线检测,结果检测的结果服务端和客户端偏差很大。。感觉就像角色位置没同步,但是我输出了客户端和服务端的角色位置发现是一样的。

假如不用Dedicated Server,Server注视着Client或者在Client附近,可以获得准确结果,但是假如远离并且不注视Client,那么Server检测还是没法拿到结果。

102097-3.gif

请问这是什么原因造成的?剑是Attach到Mesh的Socket上的,射线检测是剑来触发的。

又测试了下,感觉上来说是Server远离了一定程度后在Server一定范围之外的动画就不播放了,请问有什么选项可以强制动画播放?
102256-

你的问题里面包含有很多因素

  • 首先,服务端和客户端对于 同一个 Actor 的位置(Location)和角度(Rotation)并不是 实时精确 匹配的。
  • 对于你说的挥剑后的碰撞检测,又涉及到碰撞检测计算是在服务器完成还是在客户端完成,由谁来作为结果的仲裁,由于上面一条,导致服务端和客户端的结果确实存在碰撞位置的差异,因此仲裁权才更重要
  • 除了碰撞检测,你也提到了动画也会有影响,这里也涉及到哪些动画应该被服务端同时模拟,哪些动画只需要客户端完成显示即可,这里和你 Actor 的设置也是息息相关的

我这里无法针对那么多因素帮你分析你的原因,建议您先通篇的看一遍 这个网络相关的文档 我们看看是否能在文档的基础上进一步讨论交流。

谢谢你TIANMIN 回答我的问题。
我看了文档,并且核对了自己的代码,动画我是用AnimMontage通过服务端多播发送请求让Client播放的。我现在做了如下测试,将服务端剑的位置广播到客户端,然后发现了如下问题。

102566-1.gif

  • 这个Gif是我使用Dedicated Server,在客户端录制的,结果可以发现服务端的Montage应该没有被播放(红线没动)。

102568-gif.gif

  • 这个Gif是我未使用Dedicated Server,在客户端录制的,可以看到动画被播放了。
    请问这是什么原因导致的,是虚幻对动画有某种优化吗?谢谢。

你能更详细的描述一下你是如何做 “动画我是用AnimMontage通过服务端多播发送请求让Client播放的。” 这件事情的吗?

  • 动画是如何触发播放的?
  • 武器是一个附属于角色的单独 Actor,还是角色自身的一部分?
  • 武器的挥动是一个武器的独立动画,还是由角色动画的手部位置驱动武器的位置和角度的更新?
  • 红色的粗线是怎么画得?

从你这个 GIF 看

102566-1.gif

我猜你的红色的粗线想表达的是服务端的剑的位置?因此看起来像是服务端并未播放挥剑动画?所以这里和上面我列的一些因素都有关系,还需要你把细节更多的描述一下~

Montage是使用多播进行播放的,剑是单独的Actor,红线代表的是Server端剑的位置,假如Server能看到Client的话那Client剑的位置和红线是一致的,而假如Server远离Client并且看不到Client的动画的话就会出现上面的情况。
而且我测试了下,单机的情况下放置两个AI在远处Player看不到的地方,同样会出现动画没播放的情况,给我的感觉就是虚幻将玩家看不到的动画给优化掉了。
谢谢。

这个问题主要是因为“Server注视着Client或者在Client附近”的情况下,引擎的replication优先级比较高,离得远和背向面只类的对象,为了降低网络带宽和cpu,引擎会降低同步频率。要提高特定的对象的同步频率的做法有很多种。

  1. 对于特定类型的对象类,重载AActor::GetNetPriority,基本上只要简单的return NetPriority * Time * 4;
  2. 也可以把对应的对象设置成你的Instigator;

其实引擎在这里做的中近远距离,背向面,视野扇形等各种细节的权重调整计算,你可以直接看AActor::GetNetPriority函数来理解。

谢谢Mi.Wang回答我的问题,我被这个问题困扰好久了,我尝试着按你说的将GetNetPriority重写并返回了4.f,然而并没有解决问题。
我感觉是虚幻对场景中的动画做了优化,这个问题我已经不能上传gif图了,我新开了个问题,请移步到https://answers.unrealengine.com/questions/479854/%E5%85%B3%E4%BA%8E%E8%99%9A%E5%B9%BB%E5%8A%A8%E7%94%BB%E5%9C%A8%E6%B8%B8%E6%88%8F%E4%B8%AD%E4%B8%8D%E6%92%AD%E6%94%BE%E7%9A%84%E9%97%AE%E9%A2%98.html看看。
谢谢~