前言

页游目前有两个客户端入口:

  1. 网页端 (unity webplayer)
  2. 游戏微端 (unity standalone)

关于微端的技术,可参考我之前的文章:

dotNet开发游戏微端

游戏微端的多渠道思路和简易的自动化打包工具

总体思想

近日为提高页游的转化率,在做页游的检测机制,现把这个检测机制的思想及相关知识分享一下。大概就是浏览器-webplayer插件-操作系统-浏览器的一些信息检测和处理。

总体思想是,如果玩家不能通过网页启动游戏,根据操作系统区分,WIN7及以上优先安装微端,XP或其它操作系统建议下载webplayer插件

PS:关于webplayer 技术是否过时,官方是否不支持之类话题,此处不过多的讨论,如果是新的网页游戏项目建议使用webgl开发。

检测脚本:https://github.com/zhaoqingqing/blog_samplecode/blob/master/web-w3c/detect-for-webplayer.js

大致的原型检测流程图如下:

机制流程图

测试环境

  • windows 10 x64

    • ie 11 ,edge ,firefox 48 , 360极速浏览器8.7-chrome50
    • ie Test
  • windows 7 x64(SP1)
  • ie 11 ,firefox 48, chrome 52, 360极速浏览器8.7-chrome50
  • windows xp x86(官方原版)
  • ie 6 ,firefox 48, chrome 52

Unity Webplayer

Player Plugin Mono

网页播放器是由3个组件所构成的,分别是插件,播放器和Mono。播放器是执行你的游戏并为你加载资源的Unity运行时。它是和你制作Standalone游戏的时候所使用的运行时是一样的(或多或少)。

这个运行时需要Mono运行正确。(因为你的游戏使用的JavaScript、C#或者Boo脚本是需要依赖于Mono的)。

最后,这个插件是连接网页浏览器和运行时的中间件。该插件在Windows系统下对于IE浏览器下是ActiveX控件(OCX)的形式,对于其他类型的浏览器则是NPAPI-style动态连接库,而Mac下则是一个.plugin。

摘自:http://www.ceeger.com/Manual/TroubleShootingWebplayer.html

安装unity webplayer插件之后,在以下路径可以看到webplayer插件的一些文件

c:\Users\Administrator\AppData\LocalLow\Unity\WebPlayer\

loader(插件)

路径:Unity\WebPlayer\loader\

功能:Unity为浏览器提供的插件

  • UnityWebPluginAX.ocx
  • npUnity3D32.dll
  • UnityWebPlayerNP.map
  • info.plist

mono(运行时)

路径:Unity\WebPlayer\mono\Stable5.x.x\

功能:为mono提供运行时

  • Data\
  • mono-1-vc.dll
  • info.plist

Unity\WebPlayer\mono\Stable5.x.x\Data\lib\

  • System.Core.dll
  • System.dll
  • mscorlib.dll
  • Mono.Security.dll

player(播放器)

路径:Unity\WebPlayer\player\Stable5.x.x\

功能:网页播放器?真正的播放器,类似flash player?

  • Data\
  • wrap_oal.dll
  • webplayer_win.dll
  • info.plist

Unity\WebPlayer\player\Stable5.x.x\Data\

  • lib\
  • unity default resources

Unity\WebPlayer\player\Stable5.x.x\Data\lib\

  • UnityEngine.dll
  • CrossDomainPolicyParser.dll

CrossDomainPolicyParser(跨域政策解析器)

检测操作系统和浏览器

检测操作系统和浏览器信息

开源JS脚本:https://github.com/bestiejs/platform.js

使用方法:(建议在浏览器的控制台中运行)

  • 检测操作系统

    • platform.os.family(家族): Windows XP,7,NT,版本:Server R2 10等
  • 检测浏览器
    • platform.name; platform.version,比如chrome 54,IE 11,Firefox 48 等

浏览器是否安装webplayer

对于chrome 52(不支持webplayer),假如你的操作系统上安装了webplayer插件,那么可以检测出安装了webplayer,但如何检测是否可以运行呢?

方法一

IE内核使用ActiveX,其它内核使用插件检测,mimeType

资料:http://docs.unity3d.ru/Manual/Detecting the Unity Web Player using browser scripting.html

//just install in os , not detect support
function HasInstallWebPlayer() {
var tInstalled = false;
if (navigator.appVersion.indexOf("MSIE") != -1 &&
navigator.appVersion.toLowerCase().indexOf("win") != -1) {
tInstalled = detectUnityWebPlayerActiveX();
} else if (navigator.mimeTypes && navigator.mimeTypes["application/vnd.unity"]) {
if (navigator.mimeTypes["application/vnd.unity"].enabledPlugin &&
navigator.plugins && navigator.plugins["Unity Player"]) {
tInstalled = true;
}
}
return tInstalled;
}

方法二

function GetUnity() {
if (typeof unityObject != "undefined") {
return unityObject.getObjectById("unityPlayer");
}
return null;
}

WebPlayer是否运行成功

参考资料:http://www.ceeger.com/Manual/Working_with_UnityObject.html

通过unity提供的UnityObject.js来检测,UnityObject简化了Unity的内容嵌入到HTML中。它具有检测Unity网络播放器插件的功能,初始化网络播放器的安装和嵌入Unity的内容

注意事项

  • 在WIN 10 + IE 11 安装了web player,但运行失败
  • 360极速浏览器 使用chrome50的内核,但依然可以运行webplayer(win 10 x64)
function UnityRunCallback(result) {
var unityDiv = document.getElementById('unityPlayer');
if (!result.success) {
alert("webplayer 启动失败");
}
alert("webplayer 启动成功");
} function RunUnity(){
var width = document.documentElement.clientWidth;
var height = document.documentElement.clientHeight;
var params = {
disableContextMenu: true,
disableExternalCall: false, backgroundcolor: '000000',
bordercolor: "000000",
textcolor: "FFFFFF"
}
unityObject.embedUnity("unityPlayer", "WebPlayer.unity3d", width, height, params, null, UnityRunCallback);
}

JS技术知识

  • string 转int
  • Number 或 parseInt(建议)
  • 判断 object是否为null
  • typeof xxobj == "undefined"

JS全局函数,比window.onload 还更早执行,如下所示:

if (typeof unityObject != "undefined") {
var width = document.documentElement.clientWidth;
var height = document.documentElement.clientHeight;
var params = {
disableContextMenu: true,
disableExternalCall: false,
};
unityObject.setBaseDownloadUrl("http://webplayer.unity3d.com/download_webplayer-3.x");
//通过webplayer自启动,在callback中处理
unityObject.embedUnity("unityPlayer", "WebPlayer.unity3d", width, height, params, null, unityLoaded);
}

webplayer调试

浏览器是否可运行webplayer

  1. 浏览器访问 http://unity3d.com/cn/webplayer/setup

如果当前使用的浏览器支可运行web player,则可以看到webplayer的版本号和缓存的文件信息,否则运行失败。

查看游戏的运行日志

On Windows 7 the debug log is located at C:\Users*Your User Name Here*\AppData\Local\Temp\UnityWebPlayer\log

webplayer调试模式

在浏览器中调试Unity web player的方法:按住 ALT键,然后点击右键 - Release Channel - Dev

调用浏览器的控制台打印日志

在unity的脚本中(C#)调用下列方法,可以将日志打印在浏览器的console

Application.ExternalCall( "console.log", "my log message" );

参考:http://stackoverflow.com/questions/25860597/unity-web-how-to-show-debug-log-in-browser-inspector-rather-then-library-lo

扩展资料

IE6倒计时

查看IE6在各国家的占用率

https://developer.microsoft.com/en-us/microsoft-edge/ie6countdown/

浏览器官网下载

Firefox 火狐

https://www.mozilla.org/zh-CN/firefox/new/

Chrome 离线版

https://support.google.com/chrome/answer/126299?hl=zh-Hans

https://www.google.com/chrome/browser/desktop/index.html?platform=win&extra=stablechannel&standalone=1

https://www.zhihu.com/question/19981495

====== 如安装遇到错误码:0x80004002 ,请自行科普

扩展阅读

unity3d webplayer UnityObject 你不知道的秘密

浏览器运行webplayer测试

下面以各个浏览器在安装webplayer插件之后,运行webplayer的测试,因操作系统环境,或浏览器是否官网版 等原因,存在一定的局限性,欢迎各位指正。

微软

  • xp

    • IE 6.7 运行失败
  • win 7

    • IE 9,10,11 运行成功
  • win10

    • IE 11 运行成功
    • edge 不支持

firefox

firefox 全系列运行成功

PS: firefox 是否存在部分版本可以运行?

google

chrome45及以上运行失败,之前的版本则可以运行

chrome 45 移除了NPAPI

chrome地址栏输入 chrome://plugins/ 查看chrome启用的插件

PS:国产基于chrome内核的浏览器是否有做过修改?比如基于chrome 50但也可以运行webplayer成功,但google官方下载的chrome是运行失败的。

U3D-页游-检测机制-webplayer-调试方法的更多相关文章

  1. Angular 4 变更检测机制 ChangeDetectorRef 使用方法

    1.在angular 2中,回调函数的返回结果,不会自动更新视图层的显示,可以用 ChangeDetectorRef 来驱动angular更新视图. import {ChangeDetectorRef ...

  2. Perl的调试方法

    来源: http://my.oschina.net/alphajay/blog/52172 http://www.cnblogs.com/baiyanhuang/archive/2009/11/09/ ...

  3. Linux内核调试方法总结

    Linux内核调试方法总结 一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2   ...

  4. 页游安全攻与防,SWF加密和隐藏密匙

    原文链接:http://netsecurity.51cto.com/art/201211/364775.htm 页游,最最核心的就是客户端(swf)与服务端的游戏通信了.游戏通信产生的封包,内容是否可 ...

  5. 基于Adobe Flash平台的3D页游技术剖析

    写在前面 从黑暗之光,佛本是道,大战神的有插件3D页游.再到如今的魔龙之戒. 足以证明,3D无插件正在引领页游技术的潮流. 目前,要做到3D引擎,有以下几个选择. 说到这里,我们发现.这些都不重要. ...

  6. Linux内核调试方法总结【转】

    转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...

  7. 【转】Linux内核调试方法总结

    目录[-] 一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2  dump_sta ...

  8. Thermostat:双层存储结构的透明巨页内存管理机制

    这是一篇由密歇根大学的Neha Agarwal 和 Thomas F. Wenisch,发表在计算机系统顶会ASLOS的论文,Thermostat: Application-transparent P ...

  9. Windows 下常见的反调试方法

    稍稍总结一下在Crack或Rervese中比较常见的一些反调试方法,实现起来也比较简单,之后有写的Demo源码参考,没有太大的难度. ①最简单也是最基础的,Windows提供的API接口:IsDebu ...

随机推荐

  1. PHP工作笔记:数组转字符串与字符串转数组

    一个数组要入库,发现不可以,特定用函数转为字符串入库 $data = array( 'http://img4.bitautoimg.com/autoalbum/files/20110420/734/2 ...

  2. tet

    施大峰[[昂司法部]]... [[分公司电饭煲]]

  3. golang中如何使用http,socket5代理

    Golang Http use socket5 proxy 因为最近想爬取一些网站上的视频,无奈网站在墙外,只能通过代理进行爬取,因此在网上搜索关于golang使用代理的方法. 功夫不负有心人,最后我 ...

  4. Ajax调用处理页面错误信息500的解决思路

    最近在做项目的时候遇到一个问题:(李昌辉) 在本地服务器上做好之后,部署到阿里云虚拟主机,结果访问页面出现问题,由于登录使用的是AJAX调用处理页面,所以在点击登录的时候没有任何反应. 打开F12调试 ...

  5. SQL SERVER 2008 R2数据库出现“远程过程调用失败”(0x800706be)错误,怎么办!!

    以前SQL Server 2008 不能登陆的时候,总是通过“计算机管理”→“SQL Server服务”更改一下,"SQL Server(MSSQLSERVER)". 可是现在出现 ...

  6. 推荐15款最佳的 jQuery 分步引导插件

    当用户浏览到一个网站,它可能从不知道如何浏览,如何操作网站或 Web 应用程序的内容和流程.在这篇文章中,我们编制了一些最好的 jQuery 引导插件列表.你会发现这些插件对于提高你的网站的整体用户体 ...

  7. CSS中详解hight属性

    目录结构: // contents structure [-] hight属性值类型一览表 height的%的使用 定义 实例 需要注意的 参考文章 hight属性值类型一览表 value descr ...

  8. easyui框架对tab的限制提示

    使用easyui框架如果页面打开太多可能导致页面加载缓慢的问题,下面我们看看代码怎么写: var $tab = $('#tabs'); var tabCount = $tab.tabs('tabs') ...

  9. browserify学习总结

    前言 在未接触browserify,虽然我知道它是一个前端构建工具,但还是有几个疑问: 1. browserify出现的日期? 2. 能构建哪些文件? 3. 附加的browserify代码体积是多大? ...

  10. QuickFlow UI 控件之 NamedFormAttachment

    在开发自定义表单时,如果碰到需要按类别上传附件的情况,(比如流程附件分为草稿版,正式版,发布版),比较难处理,需要开发自定义字段控件来实现. QF最新版本(Build131124)提供了NamedFo ...