一. 在 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);