最近在自學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();