本地客户端开发入门

本地客户端 (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 不支持以下这些功能:

网络摄像头纹理 (Webcam Textures)

游戏杆输入 (Joystick Input)

缓存 (Caching)

物质 (Substances)

动态字体 (Dynamic Fonts)

除 WWW 类之外的其他类型组成的网络

分析器未运行,因为它需要将网络连接至编辑器 (Editor)。

和标准网页播放器插件一样,NaCl 目前不支持本地 C/C++ 插件。

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 版本计划在窗口模式下支持光标锁定。

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 网页播放器 (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 中查看播放器日志:

在编辑器中执行一次构建并运行 (Build & Run),确保您的游戏已作为应用程序安装到 Chrome。

在 Mac OS X 上从终端启动 Chrome,然后单击其图标启动此应用程序。您应该可以在终端看到 Unity 播放器输出的日志。

Windows 系统也一样,但您需要设置 NACL_EXE_STDOUT 和 NACL_EXE_STDERR 环境变量,并使用不带沙箱的选项启动 Chrome。