共享代码
首先要做的, 是需要编辑器和Unity共享一部部分代码, 至少协议定义和解析我不想写两遍. 虽然有protobuf这样的工具库, 但是如果不是跨语言的话, 我觉得没必要引入另一套流程. 所以我就想能不能让一个C# dll库可以同时被Winforms的编辑器和Unity脚本引用呢? 考查了一下还是可以的:
- Unity的.Net默认是Subset, 需要改成全的
- Unity的.Net默认是C#3.5版本兼容的, 一些新的语法(如async)不支持
- Unity中如果要引用Visual Studio编译出来的C# dll, 需要把Target framework改成”Unity 3.5 .net full Base Class Libraries”
- 把VS编译出来的dll, 拷到Unity的Asset目录, mono脚本里就可以直接引用了
同时, 编辑器这边也需要知道一些游戏的数据类型和接口的定义, 实验了一下, UnityEngine.dll, Assembly-CSharp.dll, Assembly-CSharp-firstpass.dll可以直接被VS这边的C#工程引用, 只要不执行Unity特有的方法(会报”ECall 方法必须打包到系统模块中”的异常), 就可以在Winforms工程中安全地复用游戏脚本中的代码了.
经过这样的设置, 编辑器和Unity游戏可以共享一个dll库, 从代码上做到了共享, 这就为我们的代码复用和通信协议定义提供了基础保障.
进程间通信
为了达成这一通信需求, 首先做了一些搜索:
总结下来, 要么是基于NamedPipe, 要么是基于Socket.
尝试使用Full Duplex Asynchronous Read/Write