Unity3D RPC(远程过程调用)细节__让你调用一个远程计算机的函数
2015-05-31 19:19
781 查看
RPC Details
远程过程调用(RPC)让你调用一个远程计算机的函数。就好像调用一个普通函数一样容易,但也需要理解
一些重要的不同。
只要你喜欢,RPC调用可以有很多参数。所有的参数将通过网络发送。这些参数会使你的网络占用增加。因
此,你应该尽量减少你的参数。
你需要确定谁会接收你发出的RPC。有几个RPC调用模式,其范围包括了所有的常见类型。你可以轻松调用
RPC函数在每台机器,或只在在服务器上,或除你之外的每个人或者是一个特定的客户端/玩家。
RPC调用通常用于执行一些事件,根据所有游戏客户端或者特定的范围内双方的事件信息。但是,如果你愿
意你可以创造性的使用它。比如:一个游戏开始后,只有4个客户端连接后才能开始游戏。一个客户端可以
发出PRC调用到每个有标记的小组成员。一个服务器可以发送RPC到一个特定客户端,使它连接后初始化。例
如,给他用户编号,本地产生器,小队颜色,等等。一个客户端可以反过来发送到服务器,指定其开始的选
择,像他喜欢的颜色或者携带的物品。
使用RPC
调用RPC需要两步:定义和调用。声明一个函数时你需要一个前缀。
如下:
// 所有的函数声明都需要@RPC
@RPC
function PrintText (text : String)
{
Debug.Log(text);
}
一旦声明了RPC你就可以调用他。所有网络都可以通过网络视图查看附着在同一对象上的脚本。换句话说,
你需要将包含RPC函数的脚本附加到游戏对象上,必须包含网络视图组件。
你可以使用的参数类型:
int; float; string; NetworkPlayer; NetworkViewID; Vector3; Quatemion;
调用RPC函数如下:
networkView.RPC ("PrintText", RPCMode.All, "Hello world");
此代码将使用附属的NetworkView去调用所有"PrintText()"函数,只要脚本是附属在相同的游戏对象上的。
第一个参数是函数的名字,第二个参数是谁调用这个函数,这里我们调用连接在服务器上所有PRC。但没有
告诉他缓冲客户端连接后的调用。
以下所有参数将被通过网络传递到RPC函数,这种情况下,"Hello World"将作为参数被传递。
你还可以加持额外的内部函数,如一个NetworkMessageInfo结构体,包含谁发出的RPC这样的细节。你不需
要特意略过这样的消息,所以PrintText函数可以写成:
@RPC
function PrintText (text : String, info : NetworkMessageInfo)
{
Debug.Log(text + " from " + info.sender);
}
正如已经提到的,要使RPC函数在一个游戏对象的脚本里工作,必须有一个Network View存在。Network
View的状态同步可以设置为关闭,除非你使用的是相同Network View下的状态同步。
RPC 缓冲
RPC调用也可以被缓冲,缓冲的RPC调用为每一个新连接的客户端存储和执行。他们使一个玩家加入一个现有
游戏更加容易。一种常见的情况是,每个加入的玩家首先加载一个特殊的关卡。于是你将发送一个RPC函数
给每一个人并且将它设置为缓冲。通过缓冲,每当有新玩家加入游戏,他将自动发送到玩家。这样你就不需
要特意去跟踪玩家加入和动发送关卡加载。
同样也有一些功能,以消除RPC缓冲区。在载人关卡的例子中,如果游戏处理多个关卡,你真正关心的是有
一个新玩家加入到当前关卡。在这种情况下,你将删除任何以前加入的RPC调用。
PS:Cartoonboy 译
远程过程调用(RPC)让你调用一个远程计算机的函数。就好像调用一个普通函数一样容易,但也需要理解
一些重要的不同。
只要你喜欢,RPC调用可以有很多参数。所有的参数将通过网络发送。这些参数会使你的网络占用增加。因
此,你应该尽量减少你的参数。
你需要确定谁会接收你发出的RPC。有几个RPC调用模式,其范围包括了所有的常见类型。你可以轻松调用
RPC函数在每台机器,或只在在服务器上,或除你之外的每个人或者是一个特定的客户端/玩家。
RPC调用通常用于执行一些事件,根据所有游戏客户端或者特定的范围内双方的事件信息。但是,如果你愿
意你可以创造性的使用它。比如:一个游戏开始后,只有4个客户端连接后才能开始游戏。一个客户端可以
发出PRC调用到每个有标记的小组成员。一个服务器可以发送RPC到一个特定客户端,使它连接后初始化。例
如,给他用户编号,本地产生器,小队颜色,等等。一个客户端可以反过来发送到服务器,指定其开始的选
择,像他喜欢的颜色或者携带的物品。
使用RPC
调用RPC需要两步:定义和调用。声明一个函数时你需要一个前缀。
如下:
// 所有的函数声明都需要@RPC
@RPC
function PrintText (text : String)
{
Debug.Log(text);
}
一旦声明了RPC你就可以调用他。所有网络都可以通过网络视图查看附着在同一对象上的脚本。换句话说,
你需要将包含RPC函数的脚本附加到游戏对象上,必须包含网络视图组件。
你可以使用的参数类型:
int; float; string; NetworkPlayer; NetworkViewID; Vector3; Quatemion;
调用RPC函数如下:
networkView.RPC ("PrintText", RPCMode.All, "Hello world");
此代码将使用附属的NetworkView去调用所有"PrintText()"函数,只要脚本是附属在相同的游戏对象上的。
第一个参数是函数的名字,第二个参数是谁调用这个函数,这里我们调用连接在服务器上所有PRC。但没有
告诉他缓冲客户端连接后的调用。
以下所有参数将被通过网络传递到RPC函数,这种情况下,"Hello World"将作为参数被传递。
你还可以加持额外的内部函数,如一个NetworkMessageInfo结构体,包含谁发出的RPC这样的细节。你不需
要特意略过这样的消息,所以PrintText函数可以写成:
@RPC
function PrintText (text : String, info : NetworkMessageInfo)
{
Debug.Log(text + " from " + info.sender);
}
正如已经提到的,要使RPC函数在一个游戏对象的脚本里工作,必须有一个Network View存在。Network
View的状态同步可以设置为关闭,除非你使用的是相同Network View下的状态同步。
RPC 缓冲
RPC调用也可以被缓冲,缓冲的RPC调用为每一个新连接的客户端存储和执行。他们使一个玩家加入一个现有
游戏更加容易。一种常见的情况是,每个加入的玩家首先加载一个特殊的关卡。于是你将发送一个RPC函数
给每一个人并且将它设置为缓冲。通过缓冲,每当有新玩家加入游戏,他将自动发送到玩家。这样你就不需
要特意去跟踪玩家加入和动发送关卡加载。
同样也有一些功能,以消除RPC缓冲区。在载人关卡的例子中,如果游戏处理多个关卡,你真正关心的是有
一个新玩家加入到当前关卡。在这种情况下,你将删除任何以前加入的RPC调用。
PS:Cartoonboy 译
相关文章推荐
- 禅之道——http://www.pythontip.com/coding/run(python online)
- 解读uglifyJS(转载:http://rapheal.sinaapp.com/2014/05/15/uglifyjs-ast-parse/)
- D-link 带USB口无线路由器 配置网络共享打印机
- VMware中网络设置之NAT
- 面试笔试--第一弹--||--美图-计算机视觉工程师实习生
- android HTTPURLConnection解决不能访问HTTPs请求
- 几种常见的【排序】与【数据结构】
- 网络数据请求实践二:多文件上传的实现方法
- No module named http_client
- 网络数据请求实践一:android-async-http实现下载和上传
- 独立成分分析http://blog.sina.com.cn/s/blog_73402e3c0101gqy0.html
- 设计包含min函数的栈。
- C++ 数据结构 双链表(模板类)
- 学习笔记一:TCP与UDP通信协议
- TCP/IP 笔记 1.3 IP:网际协议
- 因子分析(Factor Analysis) http://www.cnblogs.com/jerrylead/archive/2011/05/11/2043317.html
- 混合高斯模型 http://www.cnblogs.com/CBDoctor/archive/2011/11/06/2236286.html
- 数据结构面试题总结8——数组:数组循环移位
- 数据结构之---C/C++实现稀疏矩阵的十字链表
- 【算法笔记】数据结构(一)