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 UNET 的对象的子对象?

[Unet]Unity Unet Spwan回调函数

Unity Networking-UNet 中的附加场景加载

Unity5.1 新的网络引擎UNET(十五) Networking 引用--上

Unity5网络模块UNet介绍