RPC 详细信息

远程过程调用 (RPC) 让您可以调用远程计算机上的函数。调用 RPC 与调用常规函数相似而且一样简单,但需要理解一些重要差异。

  1. RPC 调用有非常多的参数,但涉及的网络带宽会随着参数的数量和大小而增大。为获得最佳性能,您应该将参数保持在最小值。
  2. 不同于常规函数调用,RPC 需要一个额外的参数表示 RPC 请求的接收方。提供 了几种可能的 RPC 调用模式,可涵盖所有常见的使用情况。例如,您可以轻松地调用所有相连计算机、单个服务器或除发送 RPC 调用的其他所有客户端或特定客户端上的 RPC 函数。

通常用 RPC 调用执行游戏内所有客户端上的事件或在特定双方之间传递事件信息,但您可以发挥创造性,按照您想的进行使用。例如,只有在四个客户端连接后才启动的游戏服务器,在第四个客户端刚连接时,向所有客户端发送 RPC 调用,从而开始游戏。客户端能向每个人发送 RPC 调用,用信号通知他已挑选物品。服务器可向特定客户端发送 RPC 以便在连接后立即初始化,例如,赋予客户端玩家数量、复活位置、团队颜色等等。客户端反过来可能只向服务器发送一次 RPC 来指定启动选项,如偏爱的颜色或已经购买的物品。

使用 RPC

远程调用函数前必须将该函数标记为 RPC。通过使用 RPC 属性为脚本中的函数添加前缀来完成操作:-

// 所有 RPC 调用需要 @RPC 属性!
@RPC
function PrintText (text : String)
{
    Debug.Log(text);
}

所有的网络通信都是通过“网络视图”(NetworkView) 组件处理的,因此您必须将其附加到对象上,该对象的脚本在调用 RPC 函数前先申明此函数。

参数

您可以使用以下变量类型作为 RPC 的参数:-

例如,以下代码调用使用单个 string 型参数的 RPC 函数:-

networkView.RPC ("PrintText", RPCMode.All, "Hello world");

RPC() 的第一个参数是待调用函数的名称而第二个参数决定调用目标。在这种情况下,我们对连接到服务器的每个客户端执行 RPC 调用(但调用不会缓冲以等待客户稍后连接 - 有关缓冲的详细信息,请查阅下文)。

从第三个开始算起的所有参数都传递到 RPC 函数而且通过网络发送。在这种情况下,“Hello World”会作为一个参数发送并作为 PrintText 函数中的文本参数传递。

您还可以访问其他内部参数,NetworkMessageInfo 结构保留附加信息,例如 RPC 调用来自哪里。此信息自动传递,因此上文显示的 PrintText 函数可声明为:-

@RPC
function PrintText (text : String, info : NetworkMessageInfo)
{
    Debug.Log(text + " from " + info.sender);
}

...而调用方式则与之前相同。

如上文所述,“网络视图”(Network View) 必须附加到任何一个具有含 RPC 函数的脚本的“游戏对象” (GameObject) 上。如果您独占 RPC (即,无状态同步),那么“网络视图”(Network View) 的状态同步 (State Synchronization) 可以设置为关闭 (Off)

RPC 缓冲

RPC 调用也可以进行缓冲。存储缓冲的 RPC 调用并按照向每个连接的新客户端发布调用的顺序执行缓冲的 RPC 调用。这种实用的方法可确保后来的玩家获得开始游戏所必需的所有信息。通常情况是参加游戏的每个玩家首先应该加载特定等级。您可以将此等级的详细信息发送到所有连接的玩家,但考虑到将来加入的玩家则应该缓冲此信息。此方式可确保新玩家收到等级信息,就像一开始他就在游戏。

若有必要,您还可以从 RPC 缓冲移除调用。继续以上示例,游戏可能从新玩家加入前就在提升起始等级,所以您可以移除原始缓冲的 RPC 并发送新的 RPC 请求新等级。

Page last updated: 2013-07-01