根据项目的需要,对已经完成的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 > )
{
panel.Controls[].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 = ;
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);
//}
#endregion public 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 为右键快键菜单的Form
IntPtr handle = FindWindow("Unity.ContextSubmenu", null);
if (handle != IntPtr.Zero)
{
//把快捷菜单Form移到左上角并设置其大小为0
MoveWindow(handle, , , , , true);
MoveWindow(handle, , , , , 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. c# winform 中的 工具栏自动隐藏 splitter用法 带源码

    c# winform 中的 工具栏自动隐藏 splitter用法 带源码 代码下载地址 http://download.csdn.net/detail/simadi/7649313

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

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

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

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

  4. 记一次WinForm中屏蔽空格键对按钮的作用

    事件的起因是在做一个项目功能时,添加快捷键关闭声音,这个键最终选择了空格键,但是当按下空格键时,会把窗体中获取焦点的控件(比如按钮,文本框等)的单击事件触发,所以要屏蔽这个现象. 开始使用各种方法,在 ...

  5. 收藏:FLASH中键检测与右键屏蔽

    原文:http://space.flash8.net/space/?591172/viewspace-708726.html <!DOCTYPE html PUBLIC "-//W3C ...

  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. C#winform中ListView的使用

    使用ListView模仿Windows系统的资源管理器界面,实现文件(夹)的浏览.重命名.删除及查询等功能,主要功能界面展示如下: 1.MainForm.cs及MainForm.Designer.cs ...

随机推荐

  1. Kafka 快速入门

    Kafka Kafka 核心概念 什么是 Kafka Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.该项目的目标是为处理实时数据提供一个统一.高吞吐.低延迟 ...

  2. java 传入用户名和密码并自动提交表单实现登录到其他系统

    不用单点登录,模拟远程项目的登录页面表单,在访问这个页面的时候自动提交表单到此项目的登录action,就可以实现登录到其他系统. ssh框架项目 1.以下是本地系统的action代码: import ...

  3. scp2自动部署

    安装scp2 npm install scp2 --save-dev 配置服务器文件 项目根目录创建文件 .env.dev 文件 (测试环境变量)和创建 .env.prod 文件 (生产环境变量) V ...

  4. m3u8系列(一)练手spider

    本次目标 http://www.qiqi.la/vod-detail-id-46194.html 目的,down魔道祖师,实现 前期分析文件得到以下粗略步骤 1 进入二级页面,找到 <ifram ...

  5. [Selenium3+python3.6]自动化测试3-八种元素元素定位(Firebug和firepath)

    参考http://www.cnblogs.com/yoyoketang/p/6123890.html   #coding=utf-8 from selenium import webdriverdri ...

  6. Const *ptr ptr

    1. const int *ptr = NULL; <=> int const *ptr = NULL; 1) 表示指向符号常量的指针变量,指针变量本身并非const所以可以指向其他变量. ...

  7. 挖矿病毒watchbog处理过程

    1 挖矿病毒watchbog处理过程 简要说明 这段时间公司的生产服务器中了病毒watchbog,cpu动不动就是100%,查看cpu使用情况,发现很大一部分都是us,而且占100%左右的都是进程wa ...

  8. No result defined for action com.java.test.Action.HelloAction and result index

    Struts中配置action访问出错: Struts Problem Report Struts has detected an unhandled exception: Messages: No ...

  9. 移动Web前端开发 3移动web开发现状

    移动端的手机浏览器内核一般都是Webkit内核,只需要适配Webkit就可以了 适配问题 屏幕尺寸不一

  10. validatebox自定义验证规则以及使用

    //===============jsp======state==== //开启验证 <script  type="text/javascript"> ​​​​​​​y ...