ULinkRPC 设计思路与底层实现拆解:为什么它能把 Unity 和 .NET 双向 RPC 做得既强类型又不笨重
前两篇文章更偏“怎么用”:
但如果你准备把 ULinkRPC 真正放进项目里,通常会继续问这几个问题:
- 它为什么要强依赖“共享契约 + 代码生成”?
- 它和“手写消息号 + switch 分发”相比,本质差别是什么?
- 双向通信到底是怎么落到一条连接上的?
- Transport、Serializer、Runtime、CodeGen 之间是怎么解耦的?
- 服务端 callback、客户端 push、请求响应、保活、压缩、加密,这些东西分别在哪一层?
这篇文章不再讲环境搭建,只讲设计本身:它为什么这样分层,为什么一定要 codegen,双向通信到底是怎么落到一条连接上的。
先给一句总纲:ULinkRPC 其实是“契约驱动 + 代码生成 + 帧级运行时”的组合
先记住一句话就够了:你写的是契约,生成器把契约翻译成胶水代码,运行时再把胶水代码变成真实网络收发。
如果拆开看,它大致是三层:
1. 契约层:只描述“谁可以调用谁”
这一层只关心共享接口和 DTO:
[RpcService]标记服务接口[RpcMethod]标记客户端可调用的方法[RpcCallback]标记服务对应的回调接口[RpcPush]标记服务端主动推送的方法
这一层只定义“能调什么、能推什么”,不处理网络细节。
2. 生成层:把契约翻译成“可运行的胶水代码”
这一层由 ULinkRPC.CodeGen 负责。它会读取 contracts 源码,然后分别生成:
- 客户端 service proxy
- 客户端 callback binder
- 客户端统一入口
RpcApi - 服务端 binder
- 服务端 callback proxy
- 服务端
AllServicesBinder
生成层的职责,就是把“接口定义”翻译成“可发包、可收包、可分发”的代码。