现如今,网络同步的技术在各种游戏里被广泛应用和发展,那么,如何在Unity中搭建网络模块?如何使服务器和客户端之间通信?如何做到网络同步?本文作者烂笔头-27将从自身经验出发,为大家一一解答这些疑问。

系列回顾:手把手教你实现Unity网络同步

八、物理碰撞的网络同步

写完上一篇文章之后,在Q群有一位朋友提了一个问题,在这个网络框架下,无法正常处理物体与物体之间的碰撞,经过测试以后,发现确实会出现这样的情况,如图:

<ignore_js_op>

可以看到,在客户端物体(蓝色立方体)移动,然后碰撞到服务器物体(红色立方体)时,由于服务器端的物体在客户端是滞后的,而客户端物体是本地预测的,当发生碰撞时,不能及时地产生碰撞反馈,所以导致碰撞的结果两端不一致,然后客户端就预测失败,产生很强烈的抖动和拉扯。这显然不是我们想要的结果。

那么如何来解决这样的问题呢?

1.思路

原因已经找到了,因为在客户端,客户端的物体是本地预测的,而服务器的物体是根据收到的状态包进行插值,两者在当前时刻,物理状态有差异,所以导致的碰撞异常,既然是因为服务端和客户端的物体,模拟的步调不一致导致的,那么可不可以在客户端去预测服务端的物体,使两者能够保持相同的模拟步调呢?

在GDC2018演讲 《火箭联盟》的物理与网络细节(需要***)这个视频中,从37分22秒开始,演讲者演示了在《火箭联盟》中是如何做到在客户端对服务器的球的物理状态进行预测。

因此,在“巨人的肩膀上”,在之前的网络同步架构之下,做一点拓展,使在客户端预测服务端物体的物理状态。

2.模仿《火箭联盟》制作汽车(Car)和球(Ball)

新建一个预设Car,样子大概这样:

<ignore_js_op>

新建一个预设Ball,样子是这样:

<ignore_js_op>

为了让球(Ball)更像真实的球,给它添加带弹性的物理材质:

<ignore_js_op>

3.为汽车(Car)和球(Ball)添加控制逻辑,以及需要同步的网络状态。

汽车的控制代码:

<ignore_js_op>

球(Ball)不接收按键输入,只有需要同步的物理状态,物理状态跟汽车(Car)是相同的。

<ignore_js_op>

就这样,汽车(Car)和球(Ball)都创建好了,可以进行基本的碰撞同步检测了,效果如图:

<ignore_js_op>

可以看到,在汽车(Car)冲撞到球(Ball)之后,球发生了剧烈的抖动,接下来,就要解决这个问题了。

4.在客户端为服务器物体进行物理状态预测

在目前的同步框架下,服务器的物体在客户端是基于状态进行插值变化的。所以是滞后了,为了能在客户端预测它,我们可以创建一个假的球(DummyBall),然后把真正的球(ServerBall)隐藏(PS:仅仅是隐藏,同步逻辑还是一样的),这样,就可以做到

>汽车(ClientCar)不和ServerBall发生物理碰撞,只和DummyBall发生碰撞。

>可以在客户端对DummyBall进行物理预测,而不是影响ServerBall。

这可能有点绕,简而言之,就是为了在客户端预测服务器的物体,客户端创建了一个假的”欺骗”玩家,但不是真的欺骗,DummyBall在预测之前的物理状态必须是服务器下发的最新状态,DummyBall的代码如下:

<ignore_js_op>

然后客户端为自己(ClientCar)做预测的同时,也为DummyBall做预测,代码:

<ignore_js_op>

在汽车(Car)的执行操作指令的逻辑中,因为Physics.Simulate()是全局的,所以客户端预测执行一次,DummyBall也预测模拟了一次。

<ignore_js_op>

看看效果吧(蓝色车是客户端控制,紫色球是假球DummyBall,都是客户端做预测的):

<ignore_js_op>

可以看到,在客户端的预测下,汽车(Car)碰撞到球(Ball)时,产生了很及时的碰撞反馈,此方案可行。

再把真实的球(ServerBall)给显示出来对比一下(蓝色车是客户端控制,紫色球是假球DummyBall,都是客户端做预测的,红色球是ServerBall,是由服务器下发的状态包来做插值):

<ignore_js_op>

5.小结

通过创建DummyBall在客户端实现对服务器物体的物理预测,虽然感觉像是玩家在踢”假球”,但是可以换个说法,玩家是在踢”未来的球”,这样听起来就很Amazing了~

在不确定性的物理模拟和较高的网络波动环境下,这样的做法总会发生误差,为了减少误差带来的游戏体验,在带宽允许的条件下,可以尽可能的增加网络传输的频率,比如:20个包/秒,还有对数据流量进行压缩也很有必要。

来源:腾讯游戏学院
原地址:https://mp.weixin.qq.com/s/y7oa6eGkclI1NkcOOwplXA

转载于:https://www.cnblogs.com/cooka/p/10030512.html

手把手教你实现物理碰撞的网络同步相关推荐

  1. 手把手教你写一个生成对抗网络

    成对抗网络代码全解析, 详细代码解析(TensorFlow, numpy, matplotlib, scipy) 那么,什么是 GANs? 用 Ian Goodfellow 自己的话来说: " ...

  2. 手把手教你:基于深度残差网络(ResNet)的水果分类识别系统

    系列文章 手把手教你:图像识别的垃圾分类系统 手把手教你:人脸识别考勤系统 手把手教你:基于粒子群优化算法(PSO)优化卷积神经网络(CNN)的文本分类 目录 系列文章 一.项目简介 二.水果分类结果 ...

  3. 手把手教你搭建pytorch深度学习网络

    总有人在后台问我,如今 TensorFlow 和 PyTorch 两个深度学习框架,哪个更流行? 就这么说吧,今年面试的实习生,问到常用的深度学习框架时,他们清一色的选择了「PyTorch」. 这并不 ...

  4. W7共享打印显示服务器脱机,手把手教你解决win7系统连接网络共享打印机时出现脱机提示的恢复方案...

    许多win7系统用户在工作中经常会遇到win7系统连接网络共享打印机时出现脱机提示的情况,比如近日有用户到本站反映说win7系统连接网络共享打印机时出现脱机提示的问题,但是却不知道要怎么解决win7系 ...

  5. 手把手教你用Android Studio进行网络抓包

    本文首发于公众号"AntDream",欢迎微信搜索"AntDream"或扫描文章底部二维码关注,和我一起每天进步一点点 日常开发中难免需要抓包,抓包可以有很多种 ...

  6. 手把手教你用c语言编写网络病毒

    怎样用C语言编写病毒 一.什么是病毒 恶意软件可能是第一个对我们产生影响的计算机安全问题.所以病毒在信息安全中是很重要的. 我们要对付病毒,就要了解病毒. 写一些病毒是一个很好的办法. 如果要写一个病 ...

  7. 【爬虫实战】手把手教你使用python爬取网络小说

    文章目录 写作缘起 上代码 思路分析 效果展示 写在最后 写作缘起 南墙最近发现自己常用的看小说网站多了许多广告,果然商业化的现今网上几无净土啊,便决定自己写个小说下载器,这样看小说贼爽 上代码 im ...

  8. 手把手教你:基于LSTM的股票预测系统

    系列文章 第七章.手把手教你:基于深度残差网络(ResNet)的水果分类识别系统 第六章.手把手教你:人脸识别的视频打码 第五章.手把手教你:基于深度学习的滚动轴承故障诊断 目录 系列文章 一.项目简 ...

  9. 手把手教你用Python实现批量文件的压缩处理

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 近乡情更怯,不敢问来人. 一.前言 ...

最新文章

  1. android 相对布局(RelativeLayout)
  2. 如何利用azMan (Authorization Manager) 实现 role-based的安全验证机制
  3. [Codeforces] Round #320 (Div.2)
  4. juniper交换机 mac地址和端口绑定
  5. 微信路况会不会超越地图导航?
  6. Jack (Java Android Compiler Kit)
  7. 华为首款鸿蒙系统产品成行业,华为首款鸿蒙系统产品成行业公敌!只因开机无广告:遭十大品牌批评...
  8. 前端:前端安全编码规范
  9. 先进的ASP.NET开源工作流快速开发框架 - RoadFlow
  10. 剑指offer:39-42记录
  11. 说一说阿里云弹性公网IP那些事
  12. matlab音频信号的采样与重构,信号与系统实验(MATLAB 西电版)实验21 综合实验2-音频信号的采样与重构.ppt...
  13. 过程生产excel_生产型企业,自己开发管理系统,该如何选型?
  14. html右边距无法调整,**css+html为什么右侧菜单的字体大小和边距设置在失效?谁能看下*...
  15. 为什么每个人都有发旋?
  16. Warez 3D动画,超牛
  17. 冲刺大厂每日算法面试题,动态规划21天——第十四天
  18. 扫呗--扫码付支付问题
  19. 学习日记12(类和对象)
  20. SQL SERVER 2016安装部署

热门文章

  1. compare函数c语言,sort(compare)方法
  2. 华容道的求解算法重写
  3. 模拟肯德基快餐店收银系统
  4. 【周易AIPU 仿真】R329开发板(仿真)部署AIPU初体验
  5. python有限元传热求解_Python进行有限元编程-平面应力问题(三节点三角形单元)...
  6. 京东 京东健康二面 14分钟视频面试
  7. 基于JAVA高校体育场馆管理计算机毕业设计源码+数据库+lw文档+系统+部署
  8. 分享一个可以把模糊动漫图片变清晰的网站(基于超像素)
  9. 破解受保护的excel中的密码
  10. 7805芯片使用细节