添加 双端RPC
53
%E5%8F%8C%E7%AB%AFRPC.md
Normal file
53
%E5%8F%8C%E7%AB%AFRPC.md
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
## 服务端RPC
|
||||||
|
客户端调用归属于服务端的对象的方法时需要调用`ServerRPC`。
|
||||||
|
|
||||||
|
_参考实现逻辑:客户端向服务端发送RPC后服务端根据接收到的数据的协议(枚举)来执行服务端内对应的游戏逻辑方法。
|
||||||
|
|
||||||
|
_客户端_
|
||||||
|
```csharp
|
||||||
|
//客户端使用ServerRPC
|
||||||
|
ClientBase.Instance.Request((ushort)ProtoType.Login,PlayerData.PlayerName);
|
||||||
|
```
|
||||||
|
_服务端_
|
||||||
|
```csharp
|
||||||
|
protected override bool OnUnClientRequest(Player unClient, RPCModel model)
|
||||||
|
{
|
||||||
|
switch ((ProtoType)model.protocol)
|
||||||
|
{
|
||||||
|
case ProtoType.Login:
|
||||||
|
//接收到ProtoType.Login枚举后执行服务端的Login方法
|
||||||
|
Login(unClient, model.AsString);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## 客户端RPC
|
||||||
|
服务端需要调用所有的客户端的某个方法(即广播到所有客户端)时需要使用`ClientRPC`。
|
||||||
|
当服务端需要调用某一个客户端时发送需要操作的客户端的token供客户端过滤。
|
||||||
|
|
||||||
|
_参考代码如下_
|
||||||
|
|
||||||
|
_服务端_
|
||||||
|
```csharp
|
||||||
|
private void Login(Player client, string username)
|
||||||
|
{
|
||||||
|
var token = client.Token;
|
||||||
|
client.PlayerName = username;
|
||||||
|
Call(client, (ushort)ProtoType.Login, token, 0);
|
||||||
|
Debug.Log("玩家 "+username+" 加入了服务器");
|
||||||
|
LoginHandler(client);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
_客户端_
|
||||||
|
```csharp
|
||||||
|
//此处当服务器的Call方法(ClientRPC)执行完毕后客户端的Request会返回状态码。我们可以根据状态码执行接下来需要的方法。
|
||||||
|
ClientBase.Instance.Request((ushort)ProtoType.Login,PlayerData.PlayerName);
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user