Unity3D技术之本地客户端开发入门

2015年03月25日 14:43 0 点赞 0 评论 更新于 2025-11-21 18:32

本地客户端开发简介

本地客户端(NaCl)是Google推出的一项新技术,它允许在Web页面中嵌入本地可执行代码,从而在无需安装插件的情况下部署高性能的Web应用程序。目前,NaCl仅支持在Windows、Mac OS X和Linux(含可用的Chrome操作系统支持)上的Google Chrome浏览器使用。不过,由于这是一项开源技术,未来有望移植到其他浏览器平台。

Unity 3.5为使用NaCl运行Unity网页播放器(Web Player)目录(.unity3d文件)提供了支持,无需在Chrome上安装插件即可运行。但需要注意的是,这是早期版本,性能虽稳定,但并不支持Unity网页播放器所支持的所有功能,因为NaCl是一个不断更新的平台,并非支持浏览器插件中的所有功能。

在NaCl上构建和测试游戏

在NaCl上构建和测试游戏的过程相对简单。首先,你需要安装Google Chrome浏览器。具体步骤如下:

  1. 在发布设置(Build Settings)中选择“网页播放器(Web Player)”。
  2. 选中“启用(Enable)NaCl”复选框。这样做可以确保生成的unity3d文件能够在NaCl上运行,具体通过添加NaCl所需的GLSL ES着色器和禁用NaCl不支持的动态字体来实现。同时,系统会安装NaCl runtime和HTML文件,以便在NaCl中运行游戏。
  3. 如果单击“构建并运行(Build & Run)”,Unity会将播放器作为Chrome中的应用程序进行安装,并自动运行播放器。

使用NaCl安装游戏

在当前默认状态下,Chrome通用网页不会启用NaCl。若要将NaCl播放器嵌入到任何网页中,需要指导用户在chrome://flags中手动启用NaCl。目前,安装并立即运行NaCl游戏的唯一方法是在Chrome Web商店(Store)部署这些游戏,因为在该商店中默认会启用NaCl。

需要注意的是,Chrome Web商店是公开且不受限制的,你可以使用它来托管嵌入到自己网站的内容,也可以使用自有的付款处理系统(如果有此需求)。根据计划,当Google完成名为可移植NaCl(PNaCl)的新技术开发后,NaCl的局限性将得到改善。PNaCl允许将可执行文件作为LLVM位码安装,从而使NaCl应用程序摆脱特定CPU体系结构的影响,届时应可在任意网站上启用NaCl。

构建尺寸注意事项

在构建NaCl时,你可能会发现unity_nacl_files_3.x.x文件夹非常大,超过100 MB。你可能会疑惑每次运行NaCl目录时是否需要下载所有这些数据,通常答案是“不需要”。

Chrome Web商店提供应用有两种方式:托管应用和打包应用。

  • 若以打包应用方式提供目录,所有数据将在安装时以压缩的存档文件形式下载,并存储在用户磁盘上。
  • 若以托管应用方式提供内容,每次将从Web下载数据。不过,nacl runtime只会从unity_nacl_files_3.x.x文件夹下载相关体系结构(i686或x86_64)。正确配置Web服务器后,系统会在传输时压缩数据,待传输的实际数据大小约为10 MB(使用物理剥离可进一步缩减数据大小)。unity_nacl_files_3.x.x文件夹包含可设置Apache .htaccess文件,用于在传输时压缩数据。如果使用其他Web服务器,则可能需要自行进行设置。

NaCl的局限性

不支持的功能

NaCl并非支持常用Unity网页播放器(Web Player)的所有功能,后续版本的Chrome和Unity将支持其中许多功能。目前,NaCl不支持以下功能:

  • 网络摄像头纹理(Webcam Textures)
  • 游戏杆输入(Joystick Input)
  • 缓存(Caching)
  • 物质(Substances)
  • 动态字体(Dynamic Fonts)
  • 除WWW类之外的其他类型组成的网络
  • 分析器无法运行,因为它需要将网络连接至编辑器(Editor)
  • 和标准网页播放器插件一样,NaCl目前不支持本地C/C++插件

存在局限性的支持功能

  • 深度纹理:深度纹理适用于制作实时阴影和其他效果。Unity NaCl支持深度纹理,但Chrome的OpenGL ES 2.0实施不支持所需的Windows扩展,因此深度纹理不适用于OS X和Linux。
  • 其他图形功能:NaCl使用OpenGL ES 2.0,不支持普通OpenGL中的所有扩展。这意味着有些功能会受扩展影响,例如NaCl目前不支持线性和HDR光照功能。另外,着色器(Shaders)需要编译为GLSL着色器,目前并非所有内置Unity着色器都支持此功能,如GLSL着色器不支持屏幕空间环境光遮蔽(Screen Space Ambient Occlusion)。
  • 光标锁定:支持光标锁定,但仅限于全屏模式。未来的Chrome版本计划在窗口模式下支持光标锁定。
  • NullReferenceExceptions(空引用异常):NaCl不支持硬件异常处理。这意味着脚本代码中的NullReferenceException会导致NaCl崩溃。不过,你可以将softexceptions="1"传送至嵌入的参数(构建开发播放器时由Unity自动设置),以告知mono检查软件中是否存在NullReferences(空引用)。这样做虽然会减慢脚本的执行速度,但可以避免崩溃。

系统要求及其他限制

Google未对使用NaCl设定任何系统要求,但Mac的操作系统至少应为OS X 10.6.7,在旧系统中运行效果不佳,尤其是使用旧GPU或图形驱动程序以及主内存较小的系统。如果需要在旧硬件上运行,网页播放器(Web Player)可能会提供更好的性能。

  • 全屏模式:设置Screen.fullScreen属性可支持全屏模式,但只能在用户释放鼠标按钮的情况下进入全屏模式。NaCl实际上不会更改硬件屏幕分辨率,所以Screen.resolutions只会返回当前的桌面分辨率。不过,Chrome支持渲染更小的后台缓冲区,然后将位图放大至屏幕大小。因此,请求更小的分辨率,然后桌面分辨率通常可支持全屏模式,但会导致根据GPU缩放屏幕,而非改变全屏模式。
  • WWW类:WWW类支持NaCl,但需要遵循Unity网页播放器(Web Player)不同的安全政策。Unity网页播放器使用与闪存相似的crossdomain.xml政策文件,而Unity NaCl必须遵循NaCl所遵循的跨域安全机制。实际上,要访问托管播放器的其他域中的HTML文档,需要将Web服务器配置为传送Access-Control-Allow-Origin响应请求头,以便让此域托管播放器。

在NaCl中与浏览器javascript通信

NaCl支持使用JavaScript与网页进行互动,这与使用Unity网页播放器(Web Player)进行互动类似,但从HTML JavaScript发送消息至Unity的语法有所不同,必须通过NaCl模块。使用默认的Unity生成的HTML时,以下代码可以运行:

document.getElementById('UnityEmbed').postMessage("GameObject.Message(parameter)");

要从NaCl调用浏览器JavaScript代码,可调用Application.ExternalCallApplication.ExternalEval。但需要注意的是,Google已撤销对Chrome应用Eval函数的支持,因此将其发布至Chrome Web商店也无法运行。为解决此问题,你可以使用Application.ExternalEval发送在unity_nacl.js moduleMessage类函数中截获的字符串,或将应用设置为你满意的沙箱(Sandbox)。

日志

NaCl不允许访问用户文件系统,因此不会编写日志文件,而是将所有日志输出到标准输出流。要在NaCl中查看播放器日志,可按以下步骤操作:

  • 在编辑器中执行一次“构建并运行(Build & Run)”,确保你的游戏已作为应用程序安装到Chrome。
  • 在Mac OS X上,从终端启动Chrome,然后单击其图标启动此应用程序,你应该可以在终端看到Unity播放器输出的日志。
  • 在Windows系统上,需要设置NACL_EXE_STDOUTNACL_EXE_STDERR环境变量,并使用不带沙箱的选项启动Chrome。

作者信息

feifeila

feifeila

共发布了 3994 篇文章