• Unity网页游戏


    Unity网页游戏是跑在浏览器的UnityWebPlayer插件中的,运行的模式是webplayer.unity3d+html

    在嵌入UnityWebPlayer的网页中会调用UnityObject2的initPlugin函数,将webplayer.unity3d作为参数传入来初始化Unity网页游戏的运行环境

    注:游戏dll及其他托管dll在构建Web版本时都会写入到webplayer.unity3d文件中

    UnityObject2.js (其他链接1  其他链接2

    拥有检测 Unity Web Player插件、初始化其安装和嵌入 Unity 内容的函数。可以将 UnityObject2.js 文件与 HTML 文件一起部署到网络服务器,

    但最好是从 Unity 服务器中直接加载,地址为:http://webplayer.unity3d.com/download_webplayer-3.x/3.0/uo/UnityObject2.js 或 https://ssl-webplayer.unity3d.com/download_webplayer-3.x/3.0/uo/UnityObject2.js(以获得 https 支持)。

    这样,您将始终使用到UnityObject2 最新版本。而且托管在 Unity 服务器上的 UnityObject2.js 文件被压缩了,使其变小,节约流量。

    在Windows 系统Unity编辑器的DataResources 文件夹和 Mac OS X 中的Contents/Resources文件夹中可找到UnityObject2.js 源文件。

    浏览器支持情况

    由于各大浏览器厂商开始逐渐不支持浏览器插件,Unity5.4及之后的版本,UntiyWebPlayer被移除,只提供WebGL导出方式来支持网页游戏。UnityWebPlayer Road Map

    支持UnityWebPlayer的浏览器有:

    windows平台浏览器 -- IE系列(注:最新为IE11。win10开始使用Edge作为缺省浏览器,Edge不支持插件的。另外为了访问需要插件的网站,win10也提供了IE浏览器)

    mac os x平台浏览器 -- Safari

    跨平台浏览器 -- Chrome 45前的版本、Firefox 52.0前的版本、Opera 37前的版本

    国产浏览器 -- 如:QQ浏览器、360浏览器等    一般有2个模式:兼容模式(IE)和极速模式(Chrome内核)

                        尽管集成的Chrome内核版本高于45,这些国产浏览器一般都会对集成的Chrome内核做修改,让其能支持NPAPI插件的运行

    注1:除了IE是使用ActiveX插件外,其他浏览器都是NPAPI插件

    注2:Chrome 42版本开始缺省禁止NPAPI插件,但允许用户手动开启;到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插件

    下载地址:https://unity3d.com/cn/webplayer/

                  https://unity3d.com/cn/webplayer/setup

                  http://webplayer.unity3d.com/download_webplayer-3.x/UnityWebPlayer.exe
                  http://webplayer.unity3d.com/download_webplayer-3.x/UnityWebPlayerFull.exe

                  如果需要特定版本的UntiyWebPlayer,可以安装对应的Unity编辑器,在编辑器目录下有对应的UnityWebPlayer.exe安装文件

                  形如:D:Program Files (x86)UnityEditorUnityWebPlayer.exe

    Directory键值记录是UnityWebPlayer的安装目录:%homepath%AppDataLocalLowUnityWebPlayer

    un.Directory键值记录是UnityWebPlayer卸载程序Uninstall.exe所在的目录

    在IE中查询UnityWebPlayer插件的信息与运行状态:

    win7 64bit  Internet Explorer9:主菜单 -- 管理加载项

    从控制面板中卸载UnityWebPlayer插件:

    安装后的UnityWebPlayer目录结构   -- 安装在%homepath%AppDataLocalLowUnityWebPlayer

    player为Unity运行时框架,提供游戏运行的基本环境

    mono虚拟机负责解释执行游戏脚本逻辑

    loader为浏览器插件:IE下为ActiveX控件(ocx),其他浏览器为NPAPI的dll,Mac为.plugin文件

    playerBeta-4.63.x.xDatalib及monoBeta-4.63.x.xDatalib中的dll均为托管dll

    playerBeta-4.63.x.xDataunity default resources及monoBeta-4.63.x.xDataunity_web_old为webplayer资源文件(ui贴图,shader等等)

    以下为UnityWebPlayer初始化过程中所访问的url链接(使用finddler捕捉到的)

    http://10.123.102.142/resources/Client/junhongwang/NZWebTGame.unity3d

    http://autoupdate-revision.unity3d.com/revisions.plist?content=http%3a%2f%2f10.123.102.142%2fresources%2fClient%2fjunhongwang%2fNZWebTGame.unity3d&page=http%3a%2f%2f10.123.102.142%2fresources%2fClient%2fjunhongwang%2fNZWebTGame_InnerNew.html&runtime=3.x.x&

    http://webplayer.unity3d.com//Channels/a7fe7b7f3d1f/UnityPlayer3.x.x-win32.zip // 会下载到%homepath%AppDataLocalMicrosoftWindowsTemporary Internet FilesContent.IE5COFOLVJAUnityPlayer3.x.x-win32.zip

    http://webplayer.unity3d.com//Channels/a7fe7b7f3d1f/Mono3.x.x-win32.zip // 会下载到%homepath%AppDataLocalMicrosoftWindowsTemporary Internet FilesContent.IE5C3AYLT70Mono3.x.x-win32.zip

    注:UnityWebPlayer.exe仅仅包含loader目录、UnityBugReporter.exe和UnityWebPlayerUpdate.exe文件

         UnityWebPlayerFull.exe除了UnityWebPlayer.exe包含的内容外,还包含mono目录和player目录

         UnityWebPlayer插件在初始化,会根据当前游戏用的runtime版本号,去安装目录中找是否已经存在对应版本的mono和player,若不存在则下载它们

    运行时临时目录  -- %Temp%UnityWebPlayer

    +---UnityWebPlayer
           +---log
                 |           log_bb370ff473d10349836025afd6e6808f.txt   //日志文件
                 |           manager_77b9ab931e2f344884b164d4660a0d19.txt
                 |
                 ---temp
                        ---bb370ff473d10349836025afd6e6808f    // 为了防止多个浏览器实例占用同一份dll,以下3个dll在运行每个实例前都会从UnityWebPlayer安装目录下拷贝
                                           mono-1-vc.dll
                                           webplayer_win.dll
                                           wrap_oal.dll

    IE临时目录

    reg query "HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerShell Folders" /v Cache

    下图为:win7 64bit  Internet Explorer9的缓存目录

    由于UnityWebPlayer沙盒安全限制,Unity网页游戏除了能读取浏览器缓存目录下的文件外,没有任何权限访问用户其他目录及文件

    清除IE缓存命令:

    rundll32.exe 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语句不会执行
                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%AppDataLocalLowUnityWebPlayerplayerBeta-4.63.x.x-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模块的调用

    参考

    U3D-页游-检测机制-webplayer-调试方法

  • 相关阅读:
    Win32.Dfcsvc.A
    清除“熊猫烧香”(Worm.WhBoy.h、尼姆亚、FuckJacks)
    个人网站如何提高网站的Google PR值
    ROSE病毒
    vc二进制数值字符相互转换
    全flash站制作剖析
    C#.NET 中的类型转换
    .net开发常用工具
    xflash里的hello world程序
    什么是XHTML
  • 原文地址:https://www.cnblogs.com/kekec/p/6795222.html
Copyright © 2020-2023  润新知