Unity UNET - 在播放器对象之外调用 [Command]
Posted
技术标签:
【中文标题】Unity UNET - 在播放器对象之外调用 [Command]【英文标题】:Unity UNET - calling [Command] outside of player object 【发布时间】:2015-07-28 01:36:02 【问题描述】:所以我知道 [command] 不适用于非玩家对象,但是......为什么?我应该如何同步非玩家对象的数据,例如 NPC 位置。对非玩家对象调用 Command 的能力将在每个客户端上节省大量重复计算时间。
有没有人想出解决这个设计决策的方法?
此外,如果 SyncVars 不在播放器对象上,似乎也不会同步。
现在我最好的策略是在玩家对象上存储大量数据,并且必须不断地从外部类中引用它
编辑: OOps 我的错误,正如所指出的 SyncVars 仅在服务器上更新时才在非玩家对象上工作
【问题讨论】:
仅供参考,截至本月发布的 5.2。您现在可以在播放器对象之外调用 Command。耶!!!! 代码在哪里?我正在使用 5.4 但非播放器命令功能未在服务器上执行。 【参考方案1】:是的,[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 网络身份。以前只有玩家对象可以有本地 权限,这意味着 NetworkTransform(和其他 components) 只能用于控制单人游戏 客户端上的连接对象。有了这些变化,就有可能 在客户端上拥有多个本地控制的对象。
【讨论】:
以上是关于Unity UNET - 在播放器对象之外调用 [Command]的主要内容,如果未能解决你的问题,请参考以下文章
Unity 5 - UNET - 将拖动的游戏对象同步为客户端(HL2 重力枪风格)
Unity Networking-UNet 中的附加场景加载