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

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

最近在自學Unity3D,打算使用這個時髦、流行、強大的遊戲引擎開發一個三維業務展現系統,不過發現遊戲的UI和業務系統的UI仍是有必定的差異,不少的用戶仍是比較習慣WinForm或者WPF中的UI形式,因而在網上搜了一下WinForm和Unity3D如何集成,結果不是很是使人滿意,絕大多數的回答是「No Way」,也有人給出了使用WebBrowser控件的形式,說實話這種還算是比較靠譜的,之前也這麼幹過相似的事情;後來搜到一篇帖子說是可使用U3D WebPlayer控件,抱着試試看的想法,新建了一個winform應用,在工具箱裏面還真找到了UnityWebPlayer Control這麼一個控件:html

C WinForm程序中使用Unity3D控件 - neil.wyh - 誰主沉浮
  將它拖到form上之後,發現屬性不多,大部分都是Control的屬性,不過仍是發現了一個很重要的屬性:src,這裏將發佈的web包地址寫進去,運行一下,奇蹟出現了,居然出現了三維場景界面。。。 C WinForm程序中使用Unity3D控件 - neil.wyh - 誰主沉浮
C WinForm程序中使用Unity3D控件 - neil.wyh - 誰主沉浮
  請忽略三維場景內容,實在是拿不出手哇 C WinForm程序中使用Unity3D控件 - neil.wyh - 誰主沉浮
  這裏留一個問題:.unity3d 文件的路徑只能在設計時的屬性窗口直接賦值,在Form的構造函數或者Load事件中賦值都沒有效果,具體緣由還沒找到。

   這樣的話算是實現了以前的需求:將U3D和Winform結合,不過winform的控件如何和U3D進行交互呢?再看一下UnityWebPlayerClass類的定義,發現有一個SendMessage方法,和U3D自身腳本的SendMessage定義同樣。java

C WinForm程序中使用Unity3D控件 - neil.wyh - 誰主沉浮

  下面首先在U3D中建立一個C#腳本,添加一個很是簡單的函數:web

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

 

 

  將腳本拖到叫作Sphere的對象上面。而後在窗體上添加一個按鈕,在按鈕的click事件中調用上面定義的方法:

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

 
  再次運行,不停地點擊按鈕,就能夠看到小球緩慢往下移動的效果了。   
C WinForm程序中使用Unity3D控件 - neil.wyh - 誰主沉浮
 
  通過上面的嘗試,總算是初步解決了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();
複製代碼
相關文章
相關標籤/搜索