C# WinForm程序中使用Unity3D控件


最近在自學Unity3D,打算使用這個時髦、流行、強大的游戲引擎開發一個三維業務展示系統,不過發現游戲的UI和業務系統的UI還是有一定的差別,很多的用戶還是比較習慣WinForm或者WPF中的UI形式,於是在網上搜了一下WinForm和Unity3D如何集成,結果不是非常令人滿意,絕大多數的回答是“No Way”,也有人給出了使用WebBrowser控件的形式,說實話這種還算是比較靠譜的,以前也這么干過類似的事情;后來搜到一篇帖子說是可以使用U3D WebPlayer控件,抱着試試看的想法,新建了一個winform應用,在工具箱里面還真找到了UnityWebPlayer Control這么一個控件:

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定義一樣。

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

  下面首先在U3D中創建一個C#腳本,添加一個非常簡單的函數:

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();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM