文章写的非常好, 完美解决问题:https://www.cnblogs.com/fengshen/p/Unity3D.html

根据项目的需要,对已经完成的Unity三维模型以及游戏要使用Winform进行包装,也就是使用Winform做一层外壳。因此在展示Unity的时候使用到了UnityWebPlayer这个插件,对于此插件就不多说了,无论是想把Unity嵌在网页中还是winform中都要使用到。

网上很多资料是在Web中使用Unity的,很自然的把Unity发布成Web类型,在此如何在Web中使用Unity也就不多说了,重点是解决在winform中使用Unity出现的插件自带的右键问题以及Logo问题。

一、winform中使用Unity

在winform中使用Unity,同样是像网页形式把做好的Unity发布成Web类型,然后直接使用文件格式为.unity3d的文件。把Unity文件的路径赋值给UnityWebplayer的src属性即可,对于动态赋值,从网上找到如下方法:

/// <summary>/// 实例化UnitywebPlayer控件并添加到界面上/// </summary>/// <param name="panel">承载unity的控件</param>/// <param name="unityfileServerpath">服务端路径</param>public void BindUnity(Panel panel,string unityfileServerpath){if (panel.Controls.Count > 0){panel.Controls[0].Dispose();}panel.Controls.Clear();///指定空的Unity3D,用来做外壳string unityfilepath = Application.StartupPath + unityfileServerpath;//"/U3D/LoadAsset.unity3d";unityex = new UnityWebPlayerEx();((System.ComponentModel.ISupportInitialize)(unityex)).BeginInit();this.Controls.Add(unityex);((System.ComponentModel.ISupportInitialize)(unityex)).EndInit();unityex.src = unityfilepath;AxHost.State state = unityex.OcxState;unityex.Dispose();unityex = new UnityWebPlayerEx();((System.ComponentModel.ISupportInitialize)(unityex)).BeginInit();this.SuspendLayout();unityex.Dock = DockStyle.Fill;unityex.Name = "Unityex";unityex.OcxState = state;unityex.TabIndex = 0;unityex.DisableContextMenu = true;unityex.OnExternalCall += new AxUnityWebPlayerAXLib._DUnityWebPlayerAXEvents_OnExternalCallEventHandler(unityex_OnExternalCall);panel.Controls.Add(unityex);((System.ComponentModel.ISupportInitialize)(unityex)).EndInit();this.ResumeLayout(false);}

二、屏蔽UnityWebPlayer控件的右键问题

实现的代码如下:

class UnityWebPlayerEx : AxUnityWebPlayerAXLib.AxUnityWebPlayer{#region MyRegion//private const int WM_RBUTTONDOWN = 0x204;//private const int WM_RBUTTONUP = 0x205;//private const int WM_RBUTTONBLCLK = 0x206;//public override bool PreProcessMessage(ref Message msg)//{//    switch (msg.Msg)//    {//        case 0x204://鼠标右键按下消息                  //            this.SendMessage("ThiredViewCamera", "RightMouseButtonDown", null); //            this.SendMessage("FirstViewCamera", "RightMouseButtonDown", null); //            this.SendMessage("Main Camera", "RightMouseButtonDown", null);//            this.Focus();//            return true;//        case 0x205://鼠标右键抬起消息                  //            this.SendMessage("ThiredViewCamera", "RightMouseButtonUp", null); //            this.SendMessage("FirstViewCamera", "RightMouseButtonUp", null); //            this.SendMessage("Main Camera", "RightMouseButtonUp", null);//            return true;//        case 0x206://鼠标右键点击消息                  //            return true;//    }//    return base.PreProcessMessage(ref msg);//}  #endregionpublic UnityWebPlayerEx(){}[DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern int MoveWindow(IntPtr hwnd, int x, int y, int nWidth, int nHeight, bool bRepaint);[DllImport("user32")]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);private const int WM_PARENTNOTIFY = 0x210;protected override void WndProc(ref Message m){_menuHided = false;switch (m.Msg){case WM_PARENTNOTIFY:HideContextMenu(m);break;}base.WndProc(ref m);}/// <summary>/// 是否隐藏右键菜单,默认还是要显示的,new出来后要设置一下/// </summary>public bool DisableContextMenu{ get; set; }private bool _menuHided { get; set; }private void HideContextMenu(Message m){if (_menuHided) return;if (DisableContextMenu == false) return;if (m.ToString().Contains("WM_RBUTTONDOWN")){if (_menuHided == false){new Thread(() =>{while (_menuHided == false){HideContextMenu();}}).Start();}}}private void HideContextMenu(){//Unity.ContextSubmenu 为右键快键菜单的FormIntPtr handle = FindWindow("Unity.ContextSubmenu", null);if (handle != IntPtr.Zero){//把快捷菜单Form移到左上角并设置其大小为0MoveWindow(handle, 0, 0, 10, 10, true); MoveWindow(handle, 0, 0, 0, 0, true);_menuHided = true;}}}

需要注意的是在关闭使用的窗体的时候需要释放Unitywebplayer所占用的资源,否则在第二次进来的点击的第一次右键还是会弹出快捷菜单。

三、遮住unitywebplayer的Logo

在网上找了很多资料,基本都是网页形式通过修改param参数来更换Logo的,但是winform中直接使用Unity文件,也就没有使用到其一起发布的js文件,所以此方式的可能性不大。一开始也还是抱着可行的态度尝试了使用C#调用js的方式,然并没有解决。在网上是在找不到方法的时候想到了一种“投机取巧”的方法:先遮住UnityWebPlayer,等加载完成后在显示出来。于是在初始化UnityWebPlayer的时候先在其上边添加一个遮挡物,遮挡物可以自定义,比如使用Panel或者自定义一个用户控件,把界面做得好看些。

//实例化遮挡物shadeuc = new ShadeUC();shadeuc.Name = "shadeuc1";shadeuc.Dock = DockStyle.Fill;//把遮罩层添加到界面this.splitContainerEx1.Panel1.Controls.Add(shadeuc);//遮罩层置顶以遮住底层shadeuc.BringToFront();

接下来的一个问题是何时移除遮挡物,根据自己的项目我是在UnityWebPlayer的OnExternalCall事件中接收到Unity返回的消息时移除的,这种方式得到的效果还可以。还有一种不是太靠谱的方式是使用计时器,自定义一个时长移除遮挡物。

this.splitContainerEx1.Panel1.Controls.Remove(shadeuc);

在Winform中屏蔽UnityWebPlayer的右键以及自带Logo解决方案整理相关推荐

  1. 在WinForm中屏蔽中文输入法

    在WinForm的开发中,有时有些特殊的要求.例如:在某个Form上彻底屏蔽中文输入法,使之不能切换到中文输入,不能进行中文输入. 这个问题看上去简单,实现起来并没有想象中的简单.下面,把我做的几个实 ...

  2. UnityWebPlayer使用(3) WinForm中屏蔽右键菜单

    百度到的解决方案:     鼠标右键的BUG      1).3D模型基本操作都是鼠标右键按下以后,拖动鼠标可以旋转模型视角,但是WPF加载后的UnityWebPlayer控件存在一个BUG:右键菜单 ...

  3. Winform中自定义添加ZedGraph右键实现设置所有Y轴刻度的上下限

    场景 Winforn中实现ZedGraph自定义添加右键菜单项(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  4. Winform中怎样设置ContextMenuStrip右键菜单的选项ToolStripMenuItem添加照片

    场景 怎样在Winform程序中添加鼠标右键时使子选项显示图片. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编 ...

  5. js中屏蔽a标签右键中在新窗口打开功能

    一.在现实开发中,开发人员需要对某些a标签的在新窗口打开进行屏蔽. 这时候问题就来了,我们该如何去屏蔽,是用js直接屏蔽a标签的右键事件呢,还是去修改本地的浏览器右键事件(不现实),我们不可能要求用户 ...

  6. Winform中自定义ZedGraph右键复制成功后的提示

    场景 Winform中实现ZedGraph中曲线右键显示为中文: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100115292 ...

  7. 【HTML】如何在网页中屏蔽右键 ?

    如何在网页中屏蔽右键 众所周知,要保护一个页面,最基础的就是要屏蔽右键.而现在网页上用得最多的是function click(),即下面这段代码:   <script> function ...

  8. 在Winform中播放视频等【DotNet,C#】

    在项目中遇到过这样的问题,就是如何在Winform中播放视频.当时考察了几种方式,第一种是直接使用Windows Media Player组件,这种最简单:第二种是利用DirectX直接在窗体或者控件 ...

  9. 如何在网页中禁止使用鼠标右键?几种方法和大家分享

    如何在网页中禁止使用鼠标右键 方法一:最简单的方法 <SCRIPT language="JavaScript"> function click() { if(event ...

  10. 在winform中使用三层架构学习总结

    Winform 三层架构小例子 http://www.cnblogs.com/jacky73/archive/2009/09/01/1558083.html 在web开发中常常用到工厂模式三层架构,现 ...

最新文章

  1. 洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)
  2. 安装ruby1.9.3
  3. MAC/PHY与MII(GMII/SGMII/RGMII)(一)
  4. GitHub 热点速览:不可思议的浏览器 Browser-2020 周涨 Star 超 3 千
  5. [LintCode] Coins in a Line I Coins in a Line II
  6. 揭开2016手机进化史 寒冬整合重返市场成主旋律
  7. 2019年最新移动互联网全行业排行榜!
  8. 计算机硬盘序列号有什么意义,硬盘序列号会/为什么会改变
  9. php js轮播图片代码,javascript实现焦点图轮播效果代码示例
  10. 利用FFT成功实现拓扑识别(五)--关于频谱泄露
  11. Wireshark TS | 丢包?不要轻易下结论续
  12. P2440 木材加工(二分答案)
  13. 草枯树荣,让生命活得云淡风轻
  14. 工业物联网网关是什么?工业物联网网关有什么作用?
  15. 现代汉语词典第五版_瑜 典 寻 瑕——第五版《现代汉语词典》的瑕疵(周克庸原创)...
  16. u盘有声音但是不显示怎么办?u盘不显示解决方案
  17. 千万千万不可运行的Linux命令
  18. No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi
  19. DHCP Relay的介绍
  20. SCSA❀基础信息安全概述

热门文章

  1. bitmap位图详解
  2. string.join用法
  3. LeetCode:累加数【306】
  4. stm32系统时钟配置,标准库v3.5
  5. CTRL-Space always toggles Chinese IME (Windows 7、10)
  6. TypeError: Object of type ‘int64‘ is not JSON serializable
  7. 基于TensorFlow实现自定义层的项目代码
  8. 计算机软件相关的优秀基金,计算机软件研究所
  9. Qt QSsh 使用 windows Qt实现ssh客户端
  10. Qt 应用程序图标设置