diff --git a/%E5%8F%8C%E7%AB%AFRPC.md b/%E5%8F%8C%E7%AB%AFRPC.md new file mode 100644 index 0000000..f31a3eb --- /dev/null +++ b/%E5%8F%8C%E7%AB%AFRPC.md @@ -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); +``` \ No newline at end of file