RPC框架,就是远程调用一个方法就像是本地调用一样。
用于网络消息的话,那么你的收发消息通过异步方法可以写在一起,很方便
核心代码
using System; using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; using DragonBones; using UnityEngine; /// <summary> /// Test实现RPC框架 /// </summary> public class TestTask : MonoBehaviour { private readonly Dictionary<string, Action<object>> requestCallback = new Dictionary<string, Action<object>>(); // Start is called before the first frame update void Start() { TestAsync(); } //异步方法 async void TestAsync() { object data = await MyTestTask();//await回调返回的方法 Debug.Log("执行完毕,收到的数据为" + data); } //这个地方我用了object,会有装箱操作,当然ET填的的是一个接口interface,你也可以选择填一个接口 //返回的数据包必须是一个类结构,继承这个接口,然后在里面进行一次隐式转换,就能拿到原有类的对象了 //如果传回来的类不是个接口,比如字典嵌套类(当然很少有人这样做),需要针对字典,List这种 做个优化也是可以 //object虽然万能,但是有个装箱操作,或者用其他方法优化他 //以前写的一个优化object的方法:https://www.cnblogs.com/sanyejun/p/9564320.html Task<object> MyTestTask() { C_SendMsg();//发送方法 TaskCompletionSource<object> tcs; tcs = new TaskCompletionSource<object>(); Debug.Log("消息发送完毕"); //给对应的加入回调 requestCallback["C_response"] = (data) => { print("异步结束"); tcs.SetResult(data);//给返回值赋值,这里面的data类型取决于前面 Task<类型> }; return tcs.Task; } /*******************模拟客户端******************/ void C_SendMsg() { print("客户端发送消息"); S_ServerMethod(); } //RPC void C_response(object data) { Debug.Log("收到了来自服务器的消息"); requestCallback["C_response"](data); } /****************模拟服务器***************/ void S_ServerMethod() { print("服务端接收到了消息"); //模拟网络发送慢的等待时间3秒 Invoke("S_SendMSG", 3); } void S_SendMSG() { C_response(998); } }
结果