所以我理解[命令]不适用于非玩家对象,但是......为什么?我应该如何同步非玩家对象的数据,例如NPC位置。在非玩家对象上调用Command的能力将在每个客户端上节省大量的重复计算时间。
有没有人想出这个设计决定的解决方法?
此外,如果不是播放器对象,似乎SyncVars也没有被同步。
现在我最好的策略是在玩家对象上存储大量数据,并且必须继续从外部类中引用它
编辑: OOps我的错误,正如指出SyncVars正在处理非玩家对象,只是在服务器上更新时
答案 0 :(得分:4)
是的, [Command] 用于将玩家RPC发送到服务器。
但是, SyncVars 将使用 NetworkBehaviour (不仅仅是播放器对象)将任何对象上的服务器状态同步到客户端。
权威服务器方法是让服务器使用NetworkServer.Spawn()
生成您的NPC位置,然后更新NPC Syncvars ,它们将自动在所有客户端上更新。
如果您确实需要从客户端发送 [Command] ,使用新版本的Unity,您可以使用AssignClientAuthority()
授予场景对象本地播放器权限:
如果您拥有PRO许可证并且可以访问Unity 5.2 beta版本,那么他们会在5.2b1
中添加它网络:添加了对非玩家的客户端权限的支持 对象。新功能
NetworkServer.SpawnWithClientAuthority(GameObject obj, NetworkConnection conn)
允许将权限分配给客户端 创建对象时的连接。通常会使用这种方法 在客户端要求生成对象的命令处理程序中,然后是 客户端的连接将被传入。例如:[Command] void CmdSpawn() { var go = (GameObject)Instantiate(otherPrefab, transform.position + new Vector3(0,1,0), Quaternion.identity); NetworkServer.SpawnWithClientAuthority(go, base.connectionToClient); }
为了在创建对象后设置对象的权限,有 新功能
AssignClientAuthority(NetworkConnection conn)
和 NetworkIdentity 上的RemoveClientAuthority(NetworkConnection conn)
类。请注意,只有一个客户端可以是对象的权限 一时间在具有权限的客户端上,该功能 调用OnStartAuthority()
,属性 hasAuthority 真正。客户端拥有的对象集可在 新属性 NetworkConnection.clientOwnedObjects 这是一组 的 NetworkInstanceIds 即可。可以在消息时在服务器上使用此集 收到以确保实际发送邮件的客户端 拥有该对象。当客户端断开连接时,该功能DestroyPlayersForConnection
现在破坏了它拥有的所有对象 连接,而不仅仅是玩家对象。拥有它们的物体 设置为客户端的权限必须在其中设置 LocalPlayerAuthority 的 NetworkIdentity 即可。以前只有玩家对象才能拥有本地对象 权威,这意味着 NetworkTransform (和其他 组件)只能用于控制单人游戏 客户端上的连接对象。通过这些改变,这是可能的 在客户端上有多个本地控制的对象。