Unity UNET - 在玩家对象之外调用[Command]

时间:2015-07-28 01:36:02

标签: unity3d network-programming unity-networking

所以我理解[命令]不适用于非玩家对象,但是......为什么?我应该如何同步非玩家对象的数据,例如NPC位置。在非玩家对象上调用Command的能力将在每个客户端上节省大量的重复计算时间。

有没有人想出这个设计决定的解决方法?

此外,如果不是播放器对象,似乎SyncVars也没有被同步。

现在我最好的策略是在玩家对象上存储大量数据,并且必须继续从外部类中引用它

编辑: OOps我的错误,正如指出SyncVars正在处理非玩家对象,只是在服务器上更新时

1 个答案:

答案 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 (和其他   组件)只能用于控制单人游戏   客户端上的连接对象。通过这些改变,这是可能的   在客户端上有多个本地控制的对象。