winform内嵌unity

    公司3D仿真产品的开发全部基于Unity3Dunity作为游戏引擎在3D端的开发优势不言而喻,unity开发3D虚拟产品的市场占有率几乎80%。但是作为物流教学仿真产品或者其他行业仿真产品的展现层面我们发现游戏UI和业务系统的UI还是有一定的差别,很多的用户还是比较习惯WinForm或者WPF中的UI形式,游戏化的UI适合单独功能展现,而业务系统的UI更侧重数据间的逻辑与分析的展现,,我们需要的就是这种业务化的UI交互。

于是在网上搜了一下WinFormUnity3D如何集成,有人给出了使用WebBrowser控件的形式,这种形式之前在做公司3D产品WEB版转换时使用过不管是嵌入winform的方式以及嵌入后unitywinform的通信都遵循webplayeru.getUnity().SendMessageApplication.ExternalCall那一套,用起来还算相当方便的。但是unity5.0以后抛弃webpalyer了。

webplayer方式肯定走不通了,除非你继续用unity4.6。有了另外一种思路,winform的窗体打包成动态链接库,然后在unity中调用自己打包的dll。界面用winform做好,打包动态链接库,导入unity,调用,确实行的通。通信有两种方式,一种是通过委托,另外一种是winform中引用unityEngine.dll后直接使用sendmessage。很便捷的一种方案。

继续百度,发现了更好的一种方式,winform嵌入unity打包的exe,这种形式从展现层面使得3D场景和业务系统界面不再孤立,并且winform的开发与unity相互独立,只需要提前约定好通信协议。通信方式有好几种,win32窗口句柄、内存共享,socket通信,我们选择socket去搞了。

嵌入只是形式,通信才是核心,不说废话了,直接上通信方案。

2、Unity结合winform的实践

winform内嵌unity_第1张图片

这就是我们想看到的样子,嵌入,并且功能独立,更重要的是可以相互通信!!!

a) 方式1winform嵌入webpalyer

i. 新建winform项目

ii. 在工具箱里引入UnityWebPlayer Control控件winform内嵌unity_第2张图片winform内嵌unity_第3张图片winform内嵌unity_第4张图片

通信:

1Unity->winform

unity发送


Winform接收

winform内嵌unity_第5张图片

2、winform->unity

Winform发送:


Unity接收:

b) 方式2unity调用winform动态链接库

i. 新建winform项目,做好界面部分

ii. 修改项目属性中的输出类型为类库,并生成

iii. 将生成的dll导入unity并引用

完成以上三步,其实功能只完成了一半,最重要的解决通信问题。

1、unity->winform

winform打包为动态链接库之前,写好接收函数,引入库第一个用来支持winform下的方法,第二个是我打包的dll文件。


Unity引用并发送:

winform内嵌unity_第6张图片

Winform接收:


2、Winform->Unity

   Winformunity通信有两种比较快捷的方式,第一种winform引用unityEngine库,调用sendmessage方法。说到这,突然想到,其实sendmessage这个方法也是unity模仿winform的消息机制搞的一个接口,确实很方便,与unity的组件机制相结合,想往哪个物体上的某一个脚本发消息都很快捷。

Winform发送:

Unity接收:首先挂在脚本到li物体上,脚本里定义SetName方法。


c) 方式3winform打包的exe嵌入unity打包的exe。(推荐方法)

i. 新建winform程序。

ii. winform里使用ProcessStartInfo启动外部应用程序,并通过win32提供的窗口控制方法,将此exe嵌入到指定的组件中。详见opexe.cs

通信问题:

使用socket方案,winform创建服务器,unity作为客户机去连接。

服务端:TcpServer.cs

winform内嵌unity_第7张图片winform内嵌unity_第8张图片



winform内嵌unity_第9张图片

客户端:MyTcpClient.cs


winform内嵌unity_第10张图片 winform内嵌unity_第11张图片 winform内嵌unity_第12张图片


你可能感兴趣的:(Unity,C#)