本地客户端开发入门

本地客户端 (NaCl) 是 Google 提供 的新技术,其允许您在 Web 页面嵌入本地可执行代码,以便您在无需安装插件的情况下部署性能非常强的 web 应用程序。目前,NaCl 仅支持在 Windows、Mac OS X 和 Linux(含可用的 Chrome 操作系统支持)上使用 Google Chrome,但这是一项开源技术,我们以后可将此技术移植到其他浏览器平台。

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

在 NaCl 上构建和测试游戏

在 NaCl 上构建和测试游戏非常简单。您需要安装 Google Chrome。只需在发布设置 (Build Settings) 中选择 "网页播放器 (Web Player)",然后选中 "启用 (Enable) NaCl" 复选框。这将确保生成的 unity3d 文件可在 NaCl 上运行(通过添加 NaCl 所需的 GLSL ES 着色器和禁用 NaCl 不支持的动态字体),并安装 NaCl runtime 和 html 文件,以在 NaCl 中运行游戏。如果单击构建并运行 (Build & Run),Unity 会将播放器作为 Chrome 中的应用程序安装起来,并自动运行播放器。

使用 NaCl 安装游戏

在当前状态的默认情况下不会启用 Chrome 通用网页。将 NaCl 播放器嵌入至任何网页并指导用户在 chrome://flags 中手动启用 NaCl,目前,安装并立即运行 NaCl 游戏的唯一方法是在 Chrome Web 商店 (Store)(默认情况下将启用 NaCl)部署这些游戏。请注意,Chrome Web 商店 (Store) 是公开且不受限制的,可供您托管嵌入至自己网站的内容,或使用自有的付款处理系统(如果需要)。根据计划,Google 完成名为可移植 NaCl (PNaCl) 的新技术的开发工作后,NaCl 的局限性将得到改观,此技术允许您将可执行文件作为 LLVM 位码安装,从而让 NaCl 应用程序摆脱任何特定 CPU 体系结构的影响。然后应在任意网站上启用 NaCl。

构建尺寸注意事项

构建 NaCl 时,您可能会发现 "unity_nacl_files_3.x.x" 文件夹非常大,超过 100 MB。您可能想知道,每次运行 NaCl 目录时是否需要下载所有这些数据,答案通常是“不需要”。Chrome Web 商店 (Store) 有两种方式提供 应用,一种是托管应用,一种是打包应用。如果以打包应用方式提供 目录,则将在安装时将以压缩的存档文件形式下载所有数据,然后将所有数据存储在用户磁盘上。如果以托管应用方式提供 内容,则每次将从 web 下载数据。但是,nacl runtime 将只从 "unity_nacl_files_3.x.x" 文件夹下载相关体系结构 (i686 or x86_64),正确配置 web 服务器后,系统将在传输时压缩数据,待传输的实际数据大小应为 10 MB 左右(使用物理剥离可缩减数据大小)。"unity_nacl_files_3.x.x" 文件夹包含可设置 Apache “.htaccess” 文件,以便在传输时压缩数据。如果正在使用其他 web 服务器,可能需要自己进行设置。

NaCl 的局限性

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

NaCl 支持以下功能,但存在一些局限性:

深度纹理适用于制作实时阴影和其他效果。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 版本计划在窗口模式下支持光标锁定。
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 网页播放器 (Web Player) 使用与闪存相似的 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.ExternalCall 或 Application.ExternalEval。但是,Google 已撤销对 Chrome 应用 Eval 函数的支持,因此,将其发布至 Chrome Web 商店也无法运行。为解决此问题,您可以使用 Application.ExternalEval 发送您在 unity_nacl.js moduleMessage 类函数中截获的字符串,或将应用设置为您满意的沙箱 (Sandbox),详情请参阅此处的内容。

日志

NaCl 不允许访问用户文件系统,所以不会编写日志文件。而会将所有日志输出到标准输出流。要在 NaCl 中查看播放器日志:

Page last updated: 2013-07-02