根据项目的需要,对已经完成的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. 编译 SharpNav 遇到的问题和解决过程

    https://github.com/Robmaister/SharpNav 是github上基于recastnavtigation的一个C#项目. github上并没有详细的编译过程. 首先把项目c ...

  2. Java中常见时间类的使用

    模拟场景针对于常用的操作API,比如流操作(字符流.字节流),时间操作等,仅仅了解概念性的定义终究是无法了解该类的用途和使用方式:这种情况在使用的时候便一脸茫然,脑海中映射不到对应的知识点.本篇博客将 ...

  3. Java 面向对象(一)面向对象思想

    一.面向对象思想 1.概述 Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计.开发计算机程序. 这里的对象泛指现实中一切事 ...

  4. Python模拟登陆某网教师教育网

    本文转载自看雪论坛[作者]rdsnow 不得不说,最近的 Python 蛮火的,我也稍稍了解了下,并试着用 Python 爬取网站上的数据 不过有些数据是要登陆后才能获取的,我们每年都要到某教师教育网 ...

  5. PHP 根据二维数组中的某个字段进行排序

    <?php $data = array( array( 'id' => 5698, 'first_name' => 'Bill', 'last_name' => 'Gates' ...

  6. js 定时器(setTimeout/setInterval)出现变量未定义(xxx is not defined) 的解决方法

    首先声明本人资质尚浅,如有错误,欢迎指正.共同提高. ------------------------------------------------------------------------- ...

  7. 【Distributed】分布式锁

    一.概述 1.1 分布式解决的核心思路 1.2 分布式锁一般有三种实现方式 二.基于Redis的分布式锁 2.1 使用常用命令 2.2 实现思路 2.3 核心代码 Maven依赖信息 LockRedi ...

  8. Java之IO学习

    知其然也要知其所以然,最近对IO流莫名的感觉时候充充电了,所以上网拜读了大神的文章.在学习过程中我找到了一篇很系统很详细的文章贴出来. 声明一下这是转载的文章  原文:https://www.cnbl ...

  9. 网络流dinic ek模板 poj1273

    这里只是用来存放模板,几乎没有讲解,要看讲解网上应该很多吧…… ek bfs不停寻找增广路到找不到为止,找到终点时用pre回溯,O(VE^2) #include<cstdio> #incl ...

  10. win10+CPU+Python3.6下安装pytorch

    - 写在前面 最近,学习之余,想继续搞以前的深度学习.虽然电脑上已经安装配置好tensorflow,但是鉴于其学习难度较高,且我是一个忠实的Pythoner(爱所有Python化的东西),因此果断入坑 ...