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

2015年03月15日 14:33 0 点赞 0 评论 更新于 2025-11-21 17:10

本地客户端概述

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

Unity 3.5 对 NaCl 的支持

Unity 3.5 为使用 NaCl 运行 Unity 网页播放器 (Web Player) 目录(.unity3d 文件)提供了支持,无需在 Chrome 上安装插件即可运行。但这只是早期版本,虽然性能稳定,但并不支持 Unity 网页播放器 (Web Player) 的所有功能。这是因为 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 播放器嵌入到任何网页中,需要指导用户在 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++ 插件

支持但有局限性的功能

深度纹理

深度纹理适用于制作实时阴影和其他效果。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 中查看播放器日志,可以按照以下步骤操作:

Mac OS X 系统

  1. 在编辑器中执行一次 “构建并运行 (Build & Run)”,确保游戏已作为应用程序安装到 Chrome。
  2. 从终端启动 Chrome,然后单击其图标启动此应用程序。此时,你应该可以在终端看到 Unity 播放器输出的日志。

Windows 系统

同样需要先在编辑器中执行 “构建并运行 (Build & Run)” 确保游戏安装到 Chrome。然后,你需要设置 NACL_EXE_STDOUT 和 NACL_EXE_STDERR 环境变量,并使用不带沙箱的选项启动 Chrome,之后才能查看日志。

作者信息

boke

boke

共发布了 3994 篇文章