根据项目的需要,对已经完成的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. C# 控制台日历 region分区编写思想

    已知道1900-1-1为星期一. 模块分区 //获取用户的正确输入并分别保存到变量year和month中 //声明一个用于保存空白和当月日期数的集合dates //遍历输出集合dates using ...

  2. Java 之 Map 接口

    一.Map 接口概述 java.util.Map 接口专门用来存放键值对这种对象关系的对象. 下面比较一下 Collection 与 Map 的区别: Collection 中的集合,元素是孤立存在的 ...

  3. 为什么加了jquery mobile 会有 Loading 字样在页面底部?【已解决】

    这是一个奇怪的问题,用了jquery mobile js库,页面底部就会出现Loading字样, 解决办法如下: 1,正常加上css样式 2,一定要在jquery mobile js库加载之前,设置 ...

  4. CAD二次开发之入门坑

    如果没有引用第一个dll,则会报未找到引用CommandMethod

  5. C++ 类再探

    关于类的一些遗漏的点. #include <iostream> #include <typeinfo> #include <string> using namesp ...

  6. h5 安卓/IOS长按图片、文字禁止选中或弹出系统菜单 的解决方法

    最近在做IM的语音功能,发现当长按录音的时候手机会弹出来系统菜单, IOS下bug形式:1)长按的标签设置为css background的形式:不会弹出菜单: 2)但是当设置为img时,系统默认识别为 ...

  7. mysql 忘记/修改数据库密码

    window mysql 修改密码 方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = ...

  8. CSS浮动特性

    float:left/right左浮动有浮动 特点: ①浮动不占位:浮动元素不占位置 ②默认排列成一行,遇到边界自动换行 ③如果有文字(没有设置浮动的元素内容)会绕着浮动元素走 <!DOCTYP ...

  9. 关于zsh在使用scp时报错zsh: no matches found: scp

    root@banxia:scp root@172.16.13.150:/123/* . zsh: no matches found: root@172.16.13.150:/123/* root@ba ...

  10. 《JavaScript DOM编程艺术》(第二版)学习笔记(一)

    这本书去年就买了但一直没看,闲暇的时候看了下,发现里面写的内容还真是不错,所以决定一边在博客上记录些学习的笔记,以便以后观看及查找方便. js文件最好的做法是放在< body>标签里,这样 ...