unity 自带的network能满足一般的传输要求了,分两类,远程调用(RPC)和状态同步(networkView),其中状态同步适合做位置、方向之类的同步,RPC适合调用方法或提交数据。(比如实现血量值的同步)
要使用RPC 首先服务器端代码和客户端代码中所有的方法都必须一样,没有研究是否可以是方法名相同内容不同的情况。即使不用也要有!
把用于RPC的方法上面写上[RPC]
例如
[RPC]
void ReceiveMessage(string msg,NetworkMessageInfo info)
{
}
在挂脚本的物体上添加networkview组件,第一个选off,即关掉状态同步,第二个选none
分别发布就可以了
networkView.RPC("ReceiveMessage",RPCMode.All,Message);
RPC原理:RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
具体地, 要让网络通信细节对使用者透明,我们需要对通信细节进行封装,我们先看下一个RPC调用的流程涉及到哪些通信细节:
- 服务消费方(client)调用以本地调用方式调用服务;
- client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
- client stub找到服务地址,并将消息发送到服务端;
- server stub收到消息后进行解码;
- server stub根据解码结果调用本地的服务;
- 本地服务执行并将结果返回给server stub;
- server stub将返回结果打包成消息并发送至消费方;
- client stub接收到消息,并进行解码;
- 服务消费方得到最终结果。
RPC的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。