Unity⽹页游戏
Unity⽹页游戏是跑在浏览器的UnityWebPlayer插件中的,运⾏的模式是webplayer.unity3d+html
在嵌⼊UnityWebPlayer的⽹页中会调⽤UnityObject2的initPlugin函数,将webplayer.unity3d作为参数传⼊来初始化Unity⽹页游戏的运⾏环境
注:游戏dll及其他托管dll在构建Web版本时都会写⼊到webplayer.unity3d⽂件中
()
拥有检测 Unity Web Player插件、初始化其安装和嵌⼊ Unity 内容的函数。可以将 UnityObject2.js ⽂件与 HTML ⽂件⼀起部署到⽹络服务器,
这样,您将始终使⽤到UnityObject2 最新版本。⽽且托管在 Unity 服务器上的 UnityObject2.js ⽂件被压缩了,使其变⼩,节约流量。
在Windows 系统Unity编辑器的Data\Resources ⽂件夹和 Mac OS X 中的Contents/Resources⽂件夹中可到UnityObject2.js 源⽂件。
浏览器⽀持情况
由于各⼤浏览器⼚商开始逐渐不⽀持浏览器插件,Unity5.4及之后的版本,UntiyWebPlayer被移除,只提供WebGL导出⽅式来⽀持⽹页游戏。
⽀持UnityWebPlayer的浏览器有:
windows平台浏览器 -- 系列(注:最新为IE11。win10开始使⽤Edge作为缺省浏览器,是不⽀持插件的。另外为了访问需要插件的⽹
站,win10也提供了IE浏览器)
mac os x平台浏览器 --
跨平台浏览器 --  45前的版本、 52.0前的版本、 37前的版本
国产浏览器 -- 如:QQ浏览器、360浏览器等⼀般有2个模式:兼容模式(IE)和极速模式(Chrome内核)
尽管集成的Chrome内核版本⾼于45,这些国产浏览器⼀般都会对集成的Chrome内核做修改,让其能⽀持NPAPI插件的运⾏
注1:除了IE是使⽤插件()外,其他浏览器都是NPAPI插件
注2:Chrome 42版本开始缺省禁⽌插件,但允许⽤户⼿动开启;到45版本则强制禁⽌了;但flashplayer仍然可以运⾏:
chrome://settings/content/flash
注3:Firefox 52.0版本强制禁⽌除flashplayer外的所有NPAPI插件
注4:PPAPI和NPAPI说明
PPAPI是专为chrome内核⽽开发的,能够在各种浏览器、操作系统和移动设备上使⽤,软件短⼩精悍,功能强⼤,兼容性⾼。()NPAPI是当今最流⾏的插件架构,由Netscape开发后Mozilla维护,⼏乎⽀持所有的浏览器,不过它存在很⼤的安全隐患,插件可以窃取系统底层权限,发起恶意攻击。
2010年,Google在原有NPAPI(Netscape Plugin API)基础上开发了新的PPAPI(Pepper Plugin API),将外挂插件全部放到沙盒⾥运⾏,2012年Windows、Mac版本的Chrome浏览器先后升级了PPAPI Flash Player。
PPAPI的flash相较于NPAPI来讲,内存占⽤更⼤,因为全在沙盒⾥⾯运⾏,⽽且flash每次更新基本上都是修补安全漏洞。
PPAPI:Opera 15、Chrome
NPAPI:适⽤于FireFox、Safari、Opera 12.17版以下
UnityWebPlayer插件
如果需要特定版本的UntiyWebPlayer,可以安装对应的Unity编辑器,在编辑器⽬录下有对应的安装⽂件形如:D:\Program Files (x86)\Unity\
Directory键值记录是UnityWebPlayer的安装⽬录:%homepath%\AppData\LocalLow\Unity\WebPlayer
un.Directory键值记录是UnityWebPlayer卸载程序所在的⽬录
在IE中查询UnityWebPlayer插件的信息与运⾏状态:
win7 64bit  Internet Explorer9:主菜单 -- 管理加载项
从控制⾯板中卸载UnityWebPlayer插件:
安装后的UnityWebPlayer⽬录结构-- 安装在%homepath%\AppData\LocalLow\Unity\WebPlayer
player为Unity运⾏时框架,提供游戏运⾏的基本环境
mono虚拟机负责解释执⾏游戏脚本逻辑
loader为浏览器插件:IE下为ActiveX控件(ocx),其他浏览器为NPAPI的dll,Mac为.plugin⽂件
player\\Data\lib及mono\\Data\lib中的dll均为托管dll
player\\Data\unity default resources及mono\\Data\unity_web_old为webplayer资源⽂件(ui贴图,shader等等)以下为UnityWebPlayer初始化过程中所访问的url链接(使⽤捕捉到的)
注:仅仅包含loader⽬录、和⽂件
<除了包含的内容外,还包含mono⽬录和player⽬录
UnityWebPlayer插件在初始化,会根据当前游戏⽤的runtime版本号,去安装⽬录中是否已经存在对应版本的mono和player,若不存在则下载它们
运⾏时临时⽬录-- %Temp%\UnityWebPlayer
+---UnityWebPlayer
+---log
|            //⽇志⽂件
|         
|
\---temp
\---bb370ff473d10349836025afd6e6808f    // 为了防⽌多个浏览器实例占⽤同⼀份dll,以下3个dll在运⾏每个实例前都会从UnityWebPlayer安装⽬录下拷贝
mono-1-vc.dll
webplayer_win.dll
wrap_oal.dll
IE临时⽬录
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Cache
下图为:win7 64bit  Internet Explorer9的缓存⽬录
由于UnityWebPlayer沙盒安全限制,Unity⽹页游戏除了能读取浏览器缓存⽬录下的⽂件外,没有任何权限访问⽤户其他⽬录及⽂件
清除IE缓存命令:
< InetCpl.cpl,ClearMyTracksByProcess 8
开发调试技巧
在脚本中打印log到浏览器的console窗⼝中:
Application.ExternalCall( "BrowserLog", "my log message" );
然后在页⾯的Js脚本中增加函数:
<script type="text/javascript" language="javascript">
function BrowserLog( msg)
{
// log the message
try
{
if (console != null)
{
//控制台没有打开过时,该代码执⾏时会异常(注:控制台打开后⼜关闭则不会有问题),所以需要放在try-catch块中
//否则会导致后⾯alert语句不会执⾏网页app
console.log(msg);
}
}
catch (ex)
{
}
alert(msg);
}
</script>
或者直接使⽤以下语句:
Application.ExternalCall( "console.log", "my log message" );
使⽤Development模式运⾏游戏:
1. 需要在html页⾯中不要禁⽌右键菜单
2. 按住Alt键,在UnityWebPlayer插件上右键弹出如下快捷菜单(会多出⼀个Release Channel的菜单项)
3. 会下载%homepath%\AppData\LocalLow\Unity\WebPlayer\player\Beta-
-Development版本的UnityWebPlayer来运⾏游戏输出的⽇志会包含堆栈信息
[2017-06-06 11:04:44 416]PublishLog:Device info:
DeviceId:d8c0a2227ec766787d43edbbba9fbd7a8d687a74
deviceType:Desktop
deviceModel:Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz (16313 MB)
deviceName:NICOCHEN-PC0
operatingSystem:Windows 7 Service Pack 1 (6.1.7601) 64bit
systemMemorySize:16313
graphicsDeviceName:NVIDIA GeForce GTX 660
graphicsDeviceVersion:Direct3D 9.0c [nvd3dum.dll 9.18.13.3788]
graphicsMemorySize:1989
graphicsShaderLevel:30
Screen Size:1440x900
DPI:96
ProcessorType: Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
ProcessorCoreCount: 8
UnityEngine.Debug:Internal_Log(Int32, String, Object)
UnityEngine.Debug:Log(Object)
WNEngine.Logger:GeneralLog(ELogType, String, Object[])
WNEngine.Logger:PublishLog(String, Object[])
WNEngine.Logger:PrintIdentifyLog()
WNEngine.Logger:Init()
WNGameBase.GameFramework:Awake()
(Filename: C:/buildslave/unity/build/artifacts/WebPlayerGenerated/UnityEngineDebug.cpp Line: 56)
Attach调试游戏
1. 需要在html页⾯中打开调试开关
2. 打开游戏项⽬⼯程,“调试” -- “Attach Unity Debugger”
UnityWebPlayer Security Sandbox(安全沙盒)
受UnityWebPlayer沙盒限制,在⽹页游戏逻辑⾥⾯访问web player级别不⽀持的⽅法或外部Native模块中⽅法,会抛出以下异常:MethodAccessException: Attempt to access a private/protected method failed.
如果想在UntiyWebPlayer中使⽤Natvie模块中的功能,可通过间接绕⾏的⽅式来实现:
(1)写⼀个浏览器Plugin,在Plugin中调⽤Native模块
(2)在UntiyWebPlayer中通过ExternalCall调⽤js函数,在js函数中再调⽤Plugin中对应的函数,最终实
现对Native模块的调⽤参考

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。