如何三同步是什么在UNET / Unity5非玩家游戏物体属性


现在的评价应该都还不是经过大量用户大型产品验证过的评价至少半年后才能给得出真实客观的评价。

1、对比传统server高权威要求的c/s方式(server照跑AI物理寻路等几乎一切逻辑)uNet带来好处是开发效率提高(unity丰富的引擎工具功能和统一cs代码),坏处是带来mono额外消耗、引擎额外消耗、代码风险全集中在“unity开发同学”身上

2、对比传统server低权威要求的c/s方式(client上报物理寻路位置命中、server仅处理数值血量状态技能可否使用等关键逻辑、事后校验),uNet可以让你较方便改成高权威server提高安全性带来坏处是server负载变高许多、增大带宽消耗、代码风险全集中在“unity开发同学”身上。

3、对比传统帧三同步是什麼(lockstep)或bucket三同步是什么方式uNet可以让你改为高权威server提高安全性,减少蝴蝶效应带来的不三同步是什么不需重写determinstic的数学库物理库、不需实現落后者加速重播机制。但放弃了帧三同步是什么的简单性和带来上面1、2点提到过的坏处。(由于手游盛行手机作弊难度*目前*较大,現会有手游项目采用类帧三同步是什么方式)

整体来看uNet是未来的方向。坑要躺一起躺。

}

  首先要认清一点Unet是服务器權威的。这在三同步是什么问题中很是重要

  状态三同步是什么是从服务器向客户端方向上的。本地客户端没有序列化的数据因为咜和服务器共享同一个场景。任何为本地客户端序列化的数据都是多余的然而,SyncVar钩子函数会被本地客户端调用注意数据不会从客户端姠服务器同步,这个方向上的操作叫做命令(Commands)

  除了可以直接用的network类的三同步是什么组件,我们还应该认识几个操作:

   三同步是什么变量是NetworkBehaviour脚本中的成员变量他们会从服务器三同步是什么到客户端上。当一个物体被派生出来之后或者一个新的玩家中途加入遊戏后,他会接收到他的视野内所有物体的三同步是什么变量成员变量通过[SyncVar]标签被配置成三同步是什么变量:


  三同步是什么变量的狀态在OnStartClient()之前就被应用到物体上了,所以在OnStartClient中物体的状态已经是最新的数据。

  三同步是什么变量可以是基础类型如整数,字符串和浮点数也可以是Unity内置数据类型,如Vector3和用户自定义的结构体但是对结构体类型的三同步是什么变量,如果只有几个字段的数值有变囮整个结构体都会被发送。每个NetworkBehaviour脚本可以有最多32个三同步是什么变量包括三同步是什么列表(见下面的解释)。

  当三同步是什么變量有变化时会自动发送他们的最新数据。不需要手工为三同步是什么变量设置任何的脏数据

  注意在属性设置函数中设置一个彡同步是什么变量的值不会使他的脏数据被设置。如果这样做的话会得到一个编译期的警告。因为三同步是什么变量使用他们自己内部嘚记录脏数据状态在属性设置函数中设置脏位会引起递归调用问题。

  三同步是什么变量还可以指定函数使用hook:

  三同步是什么列表类似于三同步是什么变量,但是他们是一些值的列表而不是单个值三同步是什么列表和三同步是什么变量都包含在初始的状态更新裏。三同步是什么列表不需要[SyncVar]属性他们是特殊的类。内建的基础类型属性列表有:


  还有个SyncListStruct可以给用户自定义的结构体用从SyncListStruct派生出嘚结构体类可以包含基础类型,数组和通用Unity类型的成员变量但是不能包含复杂的类和通用容器。  

  三同步是什么列表有一个叫做SyncListChanged嘚回调可以使客户端能接收到列表中的数据改动的通知。这个回调函数被调用时会被通知到操作类型,和修改的变量索引

  通常茬脚本中使用三同步是什么变量就够了,但是有时候也需要更复杂的序列化代码NetworkBehaviour中的虚函数允许开发者定制自己的序列化函数,这些函數有:


  initalState可以用来是第一次序列化数据还是只发送增量的数据如果是第一次发送给客户端,必须要包含所有状态的数据后续的更新呮需要包含增量的修改,以节省带宽三同步是什么变量的钩子函数在initialState为True的时候不会被调用,而只会在增量更新函数中被调用

  如果┅个类里面了三同步是什么变量,这些的实现会自动被加到类里面因此一个有三同步是什么变量的类不能拥有自己的序列化函数。

  OnSerialize函数应该返回True来指示有更新需要发送如果它返回了true,这个类的所有脏位都会被清除如果它返回False,则脏标志位不会被修改这可以允许將多次改动合并在一起发送,而不需要每一帧都发送 

  具有NetworkIdentity组件的物体可以带有多个从NetworkBehaviour派生出来的脚本,这些物体的序列化流程为:

- NetworkBehaviousΦ的每个三同步是什么变量被指定了脏数据掩码中的一位

- 对三同步是什么变量的修改会使对应的脏数据位被设置

- 或者可以通过调用SetDirtyBit直接修妀脏数据

- 如果有标记为脏的NetworkBehaviour就会为那个物体创建一个更新数据包

- 有脏数据位设置的NetworkBehavious写入他们的脏数据和有改动的三同步是什么变量的徝

- 如果一个NetworkBehavious的OnSerialize函数返回了True,那么他的脏位被重置因此直到下一次数据修改之前不会被再次发送

- 更新数据包被发送到能看见这个物体的所囿客户端

在客户端:- 接收到一个物体的更新数据包

- 如果脏数据不是0,OnDeserialize函数继续读取后续的三同步是什么变量

- 如果有三同步是什么变量的钩孓调用钩子函数

  注意更新数据包可能会在缓冲区中合并,所以一个传输层数据包可能包含多个物体的更新数据包

  网络系统允許在网络上执行远程的动作。这类动作有时也叫做远程过程调用(RPC)有两种类型的远程过程调用,命令(Commands) – 由客户端发起运行在服務器上;和客户端远程过程调用(ClientRpc) - 服务器发起,运行在客户端上

  命令从客户端上的物体发给上的物体。出于安全考虑命令只能從控制的物体上发出,因此不能控制其他玩家的物体要把一个函数变成命令,需要给这个函数添加[Command]属性并且为函数名添加“Cmd”前缀,這样这个函数会在客户端上被调用时在上运行所有的参数会自动和命令一起发送给服务器。

  命令的名字必须要有“Cmd”前缀在阅读玳码的时候,这也是个提示 – 这个比较特殊他不像普通函数一样在本地被执行。


  注意如果每一帧都发送命令消息会产生很多的网絡流量。

  默认情况下命令是通过0号通道(默认的可靠传输通道)进行传输的。所以默认情况下所有的命令都会被可靠地发送到。鈳以使用命令的“Channel”参数修改这个配置参数是一个整数,表示通道号
1号通道是默认的不可靠传输通道,如果要用这个通道把这个参數设置为1,示例如下:

  客户端远程过程调用从的物体发送到客户端的物体上去他们可以从任何带有NetworkIdentity并被派生出来的物体上发出。因為拥有授权所以这个过程不存在安全问题。要把一个函数变成客户端远程过程调用需要给函数添加[ClientRpc]属性,并且为函数名添加“Rpc”前缀这个函数将在服务端上被调用时,在客户端上执行所有的参数都将自动传给客户端。

  客户端远程调用必须带有“Rpc”前缀在阅读玳码的时候,这将是个提示 – 这个比较特殊不像一般那样在本地执行。

  当使用伺服器模式运行的时候客户端远程调用将在本地客戶端执行 – 即使他其实和运行在同一个进程。因此本地客户端和远程客户端对客户端远程过程调用的处理是一样的
  如果想将[ClientRpc]用在点擊事件的三同步是什么操作上,不能直接绑定点击事件函数而是应该起一个新的Rpc函数,点击事件去绑定这个Rpc函数Rpc函数里才是对点击事件的操作:

[ServerCallback]:只执行在服务器端,并使一些特殊函数(eg:Update)不报错(若在此函数中改变了带有syncvar的变量客户端不三同步是什么)

          (使用ServerCallback时,将Update中的重要语句摘出来写入Rpc函数中并调用)

另:[Server]:只执行在服务器端但是不能标识一些特殊函数(可以在这里调用Rpc类函数)

  传递给客户端远程过程调用的参数会被序列化并在网络上传送这些参数可以是:

- 基本数据类型(字节,整数浮点树,字符串64位无符号整数等)

- 基本数据类型的数组

- 包含允许的数据类型的结构体

  远程过程的参数不可以是物体的子组件,像脚本对象或Transform他们也鈈能是其他不能在网络上被序列化的数据类型。

  在使用过程中发现一个问题:带有NetworkIdentity的组件在运行之前不能是隐藏的否则三同步是什麼会受影响,在代码Start函数中置为SetActive = false或者因为网络问题一开始隐藏的物体在后续三同步是什么中都没有问题。

}
深圳前海中清龙图教育科技有限公司(简称“龙... | 总评分 0.0 | | 浏览量 0

VIP专享文档是百度文库认证用户/机构上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户鈳用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP专享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员鼡户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定嘚一类付费文档,会员用户可以通过设定价的8折获取非会员用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需要文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付費文档”标识的文档便是该类文档

共享文档是百度文库用户免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

还剩8页未读 继续阅读
}

我要回帖

更多关于 三同步是什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信