当前位置: 首页 > news >正文

Unity3D客户端实时同步技术

   在玩网络游戏的时候,多人在线,多人组队,多对多PK等等,这些我们经常可以互相看到对方在移动,我们通常称这个为实时同步,有时,我们会看到对方忽然有被拉回的感觉,这个称谓延时操作,就是说客户端和服务器端时间不一致或者是网络不顺畅造成的,接下来我给大家介绍一下在客户端如何实现实时同步。

  首先我们要知道玩家周围的其他玩家或者怪物,NPC是如何刷出来的,在这里涉及到服务器的实现,服务器会模拟客户端的场景,也在服务器的GameServer里面生成一个跟客户端同样大小的地图,它里面有个九屏的概念,什么是九屏,九屏是服务器已玩家为中心生成的九个格子,每个格子都有一定的大小,凡是位于玩家的九屏之内的对象都会被服务器刷出来,如图所示:

服务其中的九屏如上图所示,每个玩家都有自己的九屏,这个九屏是随着玩家移动的,在九屏之外就不会被刷出,玩家是看不到的,这也是为什么有时在客户端把可视距离设大了还是看不到,就是这个道理。还是以服务器的为准。所以我们在客户端实现的时候就分如下几步:

第一步是刷玩家自己

第二步是刷玩家九屏的对象

第三步是要随时刷走进玩家九屏或者远离玩家九屏的对象

实现代码如下:

玩家九屏之内的对象刷出来之后,我们接下来就要实现实时同步,实时同步有好多方式,我给大家介绍的方式是目前比较流行的,就是根据玩家的状态进行同步,那状态是什么意思?举个例子,就是玩家从站状态到走状态,状态发生改变要告诉服务器,而服务器会把这个状态改变告诉在玩家九屏之内的对象,玩家开始走了,如果玩家一直走,客户端与服务器是不同信的,而客户端是在一定的时间间隔内存到堆栈里,同时可以发送给服务器,但是服务器是不转发的,他只是在服务器里模拟。一旦状态发生改变立刻取出发给服务器,服务器再群发九屏消息,为了使玩家出现的不突兀,客户端会采用差值的方式,差值是根据时间进行的,这个时间的计算就包括客户端发送给服务器的,以及服务器返回的时间,以及在客户端行走的时间都需要计算的。代码如下:

以上是状态改变的时候发送消息,状态不改变的处理方式如下:

在这里还有一个问题,不知道大家注意了没?就是说如果遇到碰撞体该如何解决?

在这里我们也要做特殊处理,就是说如果碰到阻挡物的话,我们也认为其状态发生了改变,需要发送消息,代码如下:

 

最后注意一下,客户端为了跟服务器时间上能同步,需要客户端不定时的Ping一下服务器,根据Ping的时间差决定差值。代码如下:

以上整个客户端实时同步就完成了。

--------------------- 本文来自 海洋_ 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/jxw167/article/details/68923373?utm_source=copy 

相关文章:

  • 第十六章:数据绑定(八)
  • 目标检测框架网络模型分析(二 双塔奇兵)
  • sqlserver查看死锁进程工具脚本p_lockinfo
  • 每日一题--1
  • 开挂了!这5个Word技巧真的是超级实用,值得收藏!
  • 如何打印consul的错误信息
  • ifconfig 失效
  • 安装Cloudera manager agent步骤详解
  • 第四章:重新来认识你的老朋友Spring框架
  • Python知识点总结篇(三)
  • OSChina 周五乱弹 —— 三口气印度史(3)
  • linux文件的3个时间和7种文件类型
  • 域名被墙怎么办?域名被墙案例-解决办法
  • Grid Layout
  • 首屏时间从12.67s到1.06s,我是如何做到的?
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • angular学习第一篇-----环境搭建
  • CentOS 7 防火墙操作
  • egg(89)--egg之redis的发布和订阅
  • exif信息对照
  • mysql innodb 索引使用指南
  • Vue官网教程学习过程中值得记录的一些事情
  • Web Storage相关
  • 程序员最讨厌的9句话,你可有补充?
  • 代理模式
  • 关于Flux,Vuex,Redux的思考
  • 观察者模式实现非直接耦合
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 系统认识JavaScript正则表达式
  • 用Canvas画一棵二叉树
  • 优化 Vue 项目编译文件大小
  • kubernetes资源对象--ingress
  • 带你开发类似Pokemon Go的AR游戏
  • # 透过事物看本质的能力怎么培养?
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (day 12)JavaScript学习笔记(数组3)
  • (差分)胡桃爱原石
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (排序详解之 堆排序)
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)linux文件内容查看
  • (一) springboot详细介绍
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转) Face-Resources
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Reactor简单使用教程