Unity3D 将 Unity 嵌入WPF中的一些研究笔记

 一. 在 WPF 中使用 WebBrowser,直接打开 WebPlayer.html

 以这种方式有一个问题是. 无法在 WebBrowser 的上面 放置其它的控件, 在运行时,都不会显示 .

以 HTML为中介, 可以方便的换场景. (真接设置 WebBrowser.Source=new Uri(@"x:\\WebPlayr.unity3d");) 即可.  WPF->Unity 或 Unity->WPF 都要通过 HTML的Javascript脚本. 这种方式是目前最简单靠谱的方式 . ~

 

二 .嵌入UntiyWebPlayer 的 ActiveX 控件 

                     -----此种方式有两个未解决的问题 1. 未能屏蔽右键菜单 2.不能动态的改变 UnityWebPlayer的 src 属性

一. 嵌入的流程

1.创建一个 WPF 工程

2.创建一个 WindowForm 自定义控件库 (UserControl)

    1).引入 UntiyWebPlayer COM 组件

  2).将 这个组件拖到 UserControl 里, 并将 Dock属性设置为 Fill 让它充满整个控件

  3).在自定义的程序文件中,增加一个 UnityWebPlayer 的Public引用. 这样做的目的是,之后可以对其进行操作

    4).生成 , 在 bin 中会有三个 DLL 文件 , 只有两个有用 . 一个是 AxInterop.UnityWebPlayerAXLib 另一个是 你定义的那个组件的 DLL.

3. 将那两个有用的 DLL 引入到我们的 WPF 工程中. 并且 再引入 System.Windows.Forms 及 WindowsFormIntegration.

4. 在 WPF 的XAML的 Window 标签中 引入我们的 自定义控件的名称空间. 如: xmlns:unity="..."  在 <Grid> 中, 加入一个 <WindowsFormHost> 标签,用来承载我们的 WIndowsForm 的自定义组件. 并在其中 加入 如: <unity:UnityPlayer x:Name="UnityPlayer">. 这样, 就将UnityWebPlayer 嵌入了 WPF中.

 

二. 实现 Unity3D 与 WPF 间的双向通讯

WPF -> Unity : 要在 WPF 的 MainWindow 的 CS 文件中,引用 AxUnityWebPlayerAXLib 命名空间,这样才能使用这个 UWP COM组件的 SendMessage 方法.

        如: UnityPlayer.Player.SendMessage("Cube","ChangeToBig",null);   (UnityPlayer: 为自定义的组件, Player: 为UWP 的COM组件的引用)

        SendMessage 方法的参数 : 1.物体名(string) 2.方法名(string) 3.方法参数(object).

Unity -> WPF : 在创建 自定义组件的时候 (将 COM 组件封装成 WPF 可以使用的 控件) . 在处理 UWP 的 OnExternalCall 事件, 它的参数 e.value , 里面就是 字符数组,

        以 ',' 分开,第一个是 方法名. 之后都是参数也为字符串.  这种处理的事件一组就是. Unity里的变化, 需要 WPF的界面做出相应变化的时候, 最好是写一个,处理                          ExternalCall的类, 然后使用反射使用字符串得到相应的方法名进行处理.

 

 网上找到的,可以动态改变 src 的解决方法

 1 // Create a ocx state object with the correct path
 2 _Unity = new AxUnityWebPlayerAXLib.AxUnityWebPlayer();
 3 ((System.ComponentModel.ISupportInitialize)(_Unity)).BeginInit();
 4 _Unity.OcxState = (AxHost.State)(Resources.Unity3DOcx);
 5 _Unity.TabIndex = 0;
 6 Controls.Add(_Unity);
 7 ((System.ComponentModel.ISupportInitialize)(_Unity)).EndInit();
 8 _Unity.src = _File;
 9 AxHost.State state = _Unity.OcxState;
10 _Unity.Dispose();
11 
12 // Create the unity web player object
13 _Unity = new AxUnityWebPlayerAXLib.AxUnityWebPlayer();
14 ((System.ComponentModel.ISupportInitialize)(_Unity)).BeginInit();
15 this.SuspendLayout();
16 _Unity.Dock = DockStyle.Fill;
17 _Unity.Name = "Unity";
18 _Unity.OcxState = state;
19 _Unity.TabIndex = 0;
20 Controls.Add(_Unity);
21 ((System.ComponentModel.ISupportInitialize)(_Unity)).EndInit();
22 this.ResumeLayout(false);

转载于:https://www.cnblogs.com/easyfrog/p/3300165.html

### 回答1: Unity3D是一款强大的游戏开发引擎,而WPF(Windows Presentation Foundation)则是微软的一种用户界面框架。如何将Unity3D的画面嵌入WPF呢? 首先,我们需要在WPF项目添加一个WindowsFormsHost控件,该控件可以容纳其他非WPF的绘图框架,例如Unity3D。我们可以将WindowsFormsHost控件理解为WPF和WinForms之间的一个桥梁。 接下来,我们需要在WPF项目添加对WindowsFormsIntegration的引用。这样,我们就可以在WPF使用Windows Forms的类和控件。 然后,在WPF的XAML文件,我们可以在WindowsFormsHost控件添加一个WindowsFormsHost.Child属性,将Unity3D的绘图视图嵌入。可以通过创建一个Unity3D的WinForms控件,用来渲染Unity3D的画面。 最后,我们可以在WPF项目编写相关的代码,用来控制Unity3D的画面。例如,通过WPF的事件触发机制,可以监听鼠标或键盘事件,并与Unity3D的画面进行交互。 需要注意的是,Unity3D的画面嵌入WPF可能会面临一些兼容性问题。在WindowsFormsHost控件Unity3D的画面可能会与其他WPF控件重叠或无法正常显示。为了解决这些问题,我们可能需要对Unity3D的绘图视图进行一些调整和优化。 综上所述,通过以上步骤,可以将Unity3D的画面嵌入WPF,实现在WPF应用程序同时享受WPFUnity3D的优势,为用户提供更加丰富和多样化的交互体验。 ### 回答2: Unity3D 是一款强大的游戏开发引擎,而 WPF 是用于创建 Windows 客户端应用程序的开发框架。在将 Unity3D 画面嵌入WPF ,我们可以通过以下步骤来实现。 首先,我们需要在 WPF 创建一个 WindowsFormsHost 控件,并将其命名为 unityHost。这个控件可以允许我们将 Unity3D 的画面嵌入WPF 应用程序。 接下来,我们需要在代码引用 Unity3D 的命名空间,并创建一个 Unity3D 的窗体控制器。在 Unity3D ,我们需要创建一个与 WPF 画面共享的 GameObject,并将其命名为 unityObject。 然后,我们可以在 WPF 的代码,通过在 unityHost 控件嵌入 unityObject 对象来实现 Unity3D 画面的嵌入。具体方法是使用 unityHost.Child 属性,将 unityObject 对象赋值给 Child 属性。 最后,我们需要在 WPF 应用程序的启动事件,实例化 Unity3D 的窗体控制器对象,并将其显示出来。这样就可以在 WPF 嵌入 Unity3D 的画面了。 需要注意的是,在嵌入 Unity3D 画面到 WPF 时,我们需要确保 Unity3DWPF 应用程序使用相同的版本和编译选项,以确保两者能够良好地协同工作。此外,还需要确保 Unity3D 的画面和 WPF 应用程序的其他控件适应同一个窗口的大小和布局,以保证整体的用户体验。 综上所述,以上就是将 Unity3D 的画面嵌入WPF 的简要步骤和注意事项。希望对你有所帮助! ### 回答3: Unity3D是一款强大的游戏引擎,而WPF(Windows Presentation Foundation)是一种用于开发Windows应用程序界面的技术。要将Unity3D的画面嵌入WPF,可以采取以下步骤: 首先,需要确保Unity3D项目已经完成并且可以导出为Windows应用程序。在Unity3D,您可以通过文件菜单的“构建设置”选项来构建并导出项目。 在WPF,您需要创建一个包含Unity3D画面的容器。您可以使用WPF的一个名为“WindowsFormsHost”的控件来实现这一点。首先,在您的WPF项目添加一个“WindowsFormsIntegration”引用,以便能够使用这个控件。然后,将该控件添加到XAML文件的合适位置,并为其指定一个名称。 接下来,您需要在代码加载Unity3D项目的画面。在WPF的代码文件,使用“WindowsFormsHost”控件的名称来创建一个WindowsFormsHost对象。然后,通过调用WindowsFormsHost对象的“Child”属性,并将其设置为一个Unity引擎的GameObject对象,将Unity3D画面嵌入WPF。 最后,您可以为WPF项目添加一些控件和功能,以与Unity3D画面进行交互。您可以在WPF使用按钮、文本框等控件来实现与Unity3D画面的交互,并通过代码来处理用户的输入。 总的来说,将Unity3D的画面嵌入WPF需要依次完成以下步骤:构建并导出Unity3D项目,添加WindowsFormsHost控件到WPF的XAML文件,加载Unity3D画面到WindowsFormsHost,以及与Unity3D画面进行交互的功能添加。这样就可以实现将Unity3D的画面嵌入WPF,并在Windows应用程序使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值