Unity WebGL 编译和打包说明(官方文档翻译校正)

发布于:2024-12-18 ⋅ 阅读:(60) ⋅ 点赞:(0)
目录

Unity WebGL 编译和打包说明

Unity 提供了对 WebGL 平台开发游戏的支持。WebGL 允许开发者将实时交互的3D图形发布到浏览器中。

WebGL 简介

Unity 编辑器中的 WebGL 选项允许您将内容发布为 JavaScript 程序,这些程序使用 HTML5/JavaScript、WebAssembly、WebGL rendering API 以及其他 Web 标准在 Web 浏览器中运行 Unity 内容。

WebGL 浏览器兼容性 (WebGL Browser Compatibility)

Unity 对桌面浏览器的 WebGL 支持因浏览器而异,支持满足以下条件的浏览器:

  • 支持 WebGL 2:注意,Unity 不再为使用 Auto Graphics API 选项创建的构建提供 WebGL 1 的支持。更多详情,请参见 WebGL 1 的弃用。
  • 符合 HTML 5 标准:浏览器应符合 HTML 5 标准。
  • 64 位并支持 WebAssembly:浏览器应为 64 位并支持 WebAssembly。

Unity WebGL 不支持移动设备。尽管可能在高端设备上运行,但当前的移动设备通常性能不足且内存不够,无法支持 Unity WebGL 内容。

Unity WebGL 支持一些压缩纹理格式。有关 Unity WebGL 支持的压缩纹理格式的信息,请参见 Recommended, default, and supported texture compression formats, by platform

平台支持 (Platform Support)

大多数流行的桌面浏览器版本都支持 Unity WebGL 内容,但请注意,不同的浏览器提供的支持水平不同。例如,Unity WebGL 不支持移动设备。

由于平台本身的限制,WebGL 构建中的以下功能不可用或有限:

  • Visual Studio 中缺乏 WebGL 构建调试支持Visual Studio 不支持调试 Unity WebGL 构建。更多信息,请参见 Debug and troubleshoot WebGL builds
  • 缺乏 Unity 缓存和缓存脚本支持由于浏览器对文件系统的访问受限,WebGL 构建不支持 Unity Cache 和 Caching Scripting API。对资产数据(asset data)和 AssetBundles 的网络请求会被缓存到浏览器缓存中。请参阅 Cache behavior in WebGL
  • 缺乏线程支持由于 JavaScript 不支持线程,因此不支持线程。这适用于 Unity 内部使用线程来加速性能的情况,以及在脚本代码和 managed DLL 中使用线程的情况。本质上,System.Threading 命名空间中的任何内容都不支持。
  • 网络限制WebGL 平台不支持以下几项网络功能:
    • 出于安全考虑,浏览器不允许直接访问 IP sockets 。更多信息,请参见 Web networking
    • System.Net 命名空间中的 .NET networking class 不受支持。
    • 由于浏览器的安全限制,WebGL 平台不支持 native socket 访问。因此,WebGL 也不支持 ICMP ping 或 UnityEngine.Ping 等功能。
  • 图形限制WebGL 平台的图形 API 基于 OpenGL ES 图形库的功能,有一些限制。更多信息,请参见 WebGL graphics
  • 音频限制WebGL 构建使用基于 WebGL Audio API 的自定义音频后端,但它只支持基本的音频功能。更多信息,请参见 Audio in WebGL
  • 代码的动态生成WebGL 是一个 AOT(Ahead Of Time)平台,因此不允许使用 System.Reflection.Emit动态生成代码。所有其他 IL2CPP 平台、iOS 和大多数游戏主机也是如此。
  • 复制和粘贴复制和粘贴功能仅在 Unity UI 内部有效。无法从系统剪贴板(system clipboard)复制和粘贴,也就是说,无法与外部应用进行复制或粘贴操作。
多线程支持

尽管 Unity 为 native C/C++ 代码提供了多线程支持,但由于 WebAssembly 的限制,Web 平台尚不支持 C# 多线程。这意味着使用 Web 平台构建的应用必须在单个 C# 线程上运行

限制多线程支持的因素
  • 本地堆栈扫描(native stack scanning)的限制Web 平台使用 WebAssembly,这是一种用于在 Web 浏览器中安全高效地执行 Unity 代码的字节码格式。Web 浏览器设计为在安全和隔离的环境中运行代码,阻止直接访问本地 WebAssembly 堆栈。这影响了多线程垃圾回收,因为 Web 的垃圾回收器仅在每帧结束时运行一次,而不像其他平台那样在多帧之间增量运行。
  • 没有抢占式线程信号(pre-emptive thread signaling)支持Web 上的后台工作线程独立并行执行代码。在 native 平台上,主线程可以同步发送信号给其他线程暂停以进行垃圾回收。Web 上不支持这种同步信号,这阻止了 WebAssembly 编译的 C# 代码在多个线程上运行。
  • 其他资源 (Additional Resources)
安装 Unity Hub 并添加所需模块

要构建 WebGL 应用程序,首先必须安装 Unity Hub,然后添加 WebGL Build Support 模块。

有关如何完成这些步骤的信息,请参阅安装 Unity Hub向 Unity 编辑器添加模块
在这里插入图片描述

WebGL 开发

WebGL Player 设置

使用 Player 设置了解 Unity 如何构建(build)并显示最终的 WebGL 应用程序。有关一般 Player 设置的说明,请参阅 Player settings。

要访问 WebGL Player 设置:

  1. 从 Unity 主菜单中,转到 Edit > Project Settings > Player。Player 设置窗口将出现。
  2. 选择 WebGL 选项卡以查看 WebGL Player 设置。

注意:虽然 WebGL Player 设置中显示了图标面板,但没有图标设置可用,因为 WebGL 游戏不使用图标。

有关 WebGL Publishing Settings 的更多信息,请参阅 WebGL Building and Running

Resolution and Presentation

使用 Resolution and Presentation 部分自定义屏幕外观的各个方面。

Resolution
WebGL Template

选择要用于 WebGL 项目的模板:

  • Default 页面是一个简单的白色页面,灰色画布上有加载条。
  • Minimal 页面只有运行 WebGL 内容所需的基本代码。
  • PWA 页面包括一个 Web manifest 文件和 service worker 代码。您可以指定自己的模板,以便在类似于成品游戏的环境中运行您的游戏。有关详细说明,请参阅 Using WebGL Templates
Splash Image

使用虚拟现实启动画面设置为 XR 显示器选择自定义启动图像。有关常见启动屏幕设置的信息,请参阅 Splash Screen

Other Settings
Rendering

使用这些设置可以自定义 Unity 如何为 WebGL 平台渲染您的游戏。

Configuration
Shader Variant Loading

使用这些设置控制运行时着色器使用的内存量。

API Compatibility Level

您可以为所有 target 选择 Mono API 兼容性级别。有时,第三方 .NET 库使用的功能超出了您的 .NET 兼容性级别。要了解这种情况下的情况以及如何最好地解决它,请尝试以下建议:

  1. 为 Windows 安装 ILSpy
  2. 将导致问题的 API 兼容性级别的 .NET 程序集拖入 ILSpy。您可以在 Frameworks/Mono/lib/mono/YOURSUBSET/ 下找到这些问题文件。
  3. 拖入您的第三方程序集。
  4. 右键单击第三方程序集并选择 Analyze 。
  5. 在分析报告中,检查 Depends on 部分。报告会突出显示第三方程序集依赖但不在您选择的 .NET 兼容性级别中可用的任何内容。
Script Compilation
Optimization
Stack Trace

为 WebGL 平台选择日志记录设置。

选择与每种日志类型(Error、Assert、Warning、Log 和 Exception)对应的选项,以基于所需的日志记录类型启用首选的堆栈跟踪方法。有关更多信息,请参阅 stack trace logging。

Legacy

启用 Clamp BlendShapes(已弃用)选项以在 Skinned Mesh Renderers 中夹住混合形状权重的范围。

Publishing Settings

使用 Publishing Settings 配置 Unity 构建 WebGL 应用程序的方式。例如,您可以选择启用浏览器缓存以在构建中存储其文件。

Show Diagnostic Overlay 设置

为了帮助优化 WebGL 构建并诊断潜在问题,您可以通过启用此设置查看诊断信息(目前限于内存使用情况)。启用后,构建上会出现一个图标,显示有关构建的有用数据。此选项适用于开发和发布构建。

要查看诊断信息,请在 Player settings 窗口(File > Build Settings > Player Settings > Publishing Settings)中启用 Show Diagnostics Overlay 选项。

在桌面上,诊断图标出现在 WebGL 画布的页脚:
在这里插入图片描述

在移动设备上,诊断图标出现在屏幕右下角:
在这里插入图片描述

点击 Diagnostics 图标。会出现一个覆盖层,显示 JavaScript 内存的详细信息,其中进一步细分显示 WASM 堆内存使用情况:
在这里插入图片描述

覆盖屏幕上显示以下诊断信息:

属性 (Property)

功能 (Function)

Total JS Memory

JavaScript(JS)堆的当前大小,包括未分配给任何 JS 对象的未使用内存,以兆字节(MB)为单位。

Used JS Memory

JS 对象使用的内存,以兆字节(MB)为单位。

Total WASM heap memory

表示 C/C++ Unity 引擎使用 Emscripten 编译的整个堆内存的线性内存,包括未分配的内存,以兆字节(MB)为单位。

Used WASM heap

已分配的 WASM 堆空间,以兆字节(MB)为单位。

Important note about JS Memory

JS 内存信息是使用 performance.memory API 获得的,目前仅支持 Chrome 或 Edge。没有其他 API 可返回此信息以供 Safari 或 Firefox 使用。

注意:iOS 设备不支持 performance.memory API。

在不支持此 API 的浏览器上,会显示消息 “N/A”。

与浏览器脚本的交互

当你为 Web 构建内容时,可能需要与网页上的其他元素进行通信,或者使用 Web API 来实现 Unity 默认未提供的功能。

在这两种情况下,你都需要直接与浏览器的 JavaScript 引擎进行交互。Unity Web 提供了不同的方法来处理这些交互。

代码示例:在 Unity 中调用 JavaScript 和 C/C++/C# 函数

你可以使用代码在插件和 Unity 代码之间执行交互。以下示例展示了如何在 Unity 项目中从 JavaScript 和 C/C++/C# 代码调用各种类型的函数。

在 Unity C# 示例中调用 JavaScript 代码

以下代码是一个 JavaScript 示例,你的 Unity C# 脚本可以从中调用函数。

mergeInto(LibraryManager.library, {

  Hello: function () {
    window.alert("Hello, world!");
  },

  HelloString: function (str) {
    window.alert(UTF8ToString(str));
  },

  PrintFloatArray: function (array, size) {
    for(var i = 0; i < size; i++)
        console.log(HEAPF32[(array >> 2) + i]);
  },

  AddNumbers: function (x, y) {
    return x + y;
  },

  StringReturnValueFunction: function () {
    var returnStr = "bla";
    var bufferSize = lengthBytesUTF8(returnStr) + 1;
    var buffer = _malloc(bufferSize);
    stringToUTF8(returnStr, buffer, bufferSize);
    return buffer;
  },

  BindWebGLTexture: function (texture) {
    GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[texture]);
  },

});

以下代码是一个 Unity C# 示例,调用了上述 JavaScript 示例中定义的函数。

using UnityEngine;
using System.Runtime.InteropServices;

public class NewBehaviourScript : MonoBehaviour {

    [DllImport("__Internal")]
    private static extern void Hello();

    [DllImport("__Internal")]
    private static extern void Hel

网站公告

今日签到

点亮在社区的每一天
去签到