C# WinForm程序中使用Unity3D控件 (转)

Posted xihong2014

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# WinForm程序中使用Unity3D控件 (转)相关的知识,希望对你有一定的参考价值。

https://www.cnblogs.com/cnxkey/articles/5394378.html

最近在自学Unity3D,打算使用这个时髦、流行、强大的游戏引擎开发一个三维业务展示系统,不过发现游戏的UI和业务系统的UI还是有一定的差别,很多的用户还是比较习惯WinForm或者WPF中的UI形式,于是在网上搜了一下WinForm和Unity3D如何集成,结果不是非常令人满意,绝大多数的回答是“No Way”,也有人给出了使用WebBrowser控件的形式,说实话这种还算是比较靠谱的,以前也这么干过类似的事情;后来搜到一篇帖子说是可以使用U3D WebPlayer控件,抱着试试看的想法,新建了一个winform应用,在工具箱里面还真找到了UnityWebPlayer Control这么一个控件:

技术图片
  将它拖到form上以后,发现属性很少,大部分都是Control的属性,不过还是发现了一个很重要的属性:src,这里将发布的web包地址写进去,运行一下,奇迹出现了,竟然出现了三维场景界面。。。技术图片
技术图片
  请忽略三维场景内容,实在是拿不出手哇技术图片
  这里留一个问题:.unity3d 文件的路径只能在设计时的属性窗口直接赋值,在Form的构造函数或者Load事件中赋值都没有效果,具体原因还没找到。

   这样的话算是实现了之前的需求:将U3D和Winform结合,不过winform的控件如何和U3D进行交互呢?再看一下UnityWebPlayerClass类的定义,发现有一个SendMessage方法,和U3D自身脚本的SendMessage定义一样。

技术图片

  下面首先在U3D中创建一个C#脚本,添加一个非常简单的函数:

void Down()
 
    transform.Translate( Vector3.down * Time.deltaTime );
 

 

 

  将脚本拖到叫做Sphere的对象上面。然后在窗体上添加一个按钮,在按钮的click事件中调用上面定义的方法:

axUnityWebPlayer1.SendMessage( "Sphere", "Down", null );


  再次运行,不停地点击按钮,就可以看到小球缓慢往下移动的效果了。   
技术图片
 
  经过上面的尝试,总算是初步解决了U3D和Winform(WPF也类似)集成的问题,不过核心的对象控制代码还是得在U3D中写好、编译才行,winform只是提供了一个更为习惯的UI而已。不知道是否还有更好、更方便、更强大的方法,期待。。。
这文章对我很有用处,但是我使用控件后,设置src属性,运行提示错误说不是有效的u3d网页文件,src地址要是全部地址,直到.unity3d,例如:c:\\**\\**\\**.unity3d。
技术图片
AxUnityWebPlayer ax = new AxUnityWebPlayer();
ax.BeginInit();

ax.CreateControl();// 关键
ax.Location = new Point(0, 0);
ax.Size = new Size(200, 200);
ax.Dock = DockStyle.Fill;
ax.src = Application.StartupPath + "\\\\abc\\\\abc.unity3d";

splitContainer1.Panel1.Controls.Add(ax);
ax.EndInit();
技术图片
 

以上是关于C# WinForm程序中使用Unity3D控件 (转)的主要内容,如果未能解决你的问题,请参考以下文章

c# winform程序怎么寻找焦点在哪个控件上?

C#,winform程序中datagridview控件怎么使用多层表头?请教一下,谢谢!

C# winform编程 开发环境VS2010 listview控件问题

C# 做的winform窗体程序把一个Form给为自定义控件?

求教:C#中winform 并未使用任何图片,但报错”GDI+ 中发生一般性错误“

c# winform程序,我定义一个类,一个窗体,如何在类中访问一个窗体的控件。