Version: 6000.3
语言: 中文
Web 浏览器兼容性
Web 开发和发布流程

技术限制

Web 技术对设计用于在 Web 浏览器中运行的 Unity Web 应用程序施加了限制。在为 Web 平台构建应用程序之前,请确保了解以下技术限制。

平台支持

大多数流行的桌面浏览器版本都支持 Unity Web 内容,但请注意,不同的浏览器提供不同级别的支持

由于平台本身的限制,Web 版本中的以下功能不可用或受到限制:

Visual Studio 中缺少 Web 生成调试支持

Visual Studio 不支持调试 Web 生成。有关详细信息,请参阅调试和排查 Web 版本

缺乏 Unity 缓存和缓存脚本支持

由于浏览器中对文件系统的访问受到限制,Web 版本不支持 Unity 缓存和缓存脚本 API。对资产数据和资产包的网络请求将缓存在浏览器缓存中。请参阅 Web 中的缓存行为

缺少输入系统键盘布局映射

Web 平台不支持物理到活动键盘映射,这是 Unity 输入系统的一项功能。此限制意味着依赖于将物理键代码转换为虚拟键盘布局的某些 InputControl 属性在非英语键盘上无法按预期运行。

缺乏托管线程支持

由于 WebAssembly 中缺少多线程垃圾回收功能,因此不支持托管 (C#) 线程。您可以使用实验性播放器设置“本机 C/C++ 多线程)启用对原生 C/C++ 线程形式的线程的部分支持。请参阅多线程支持

由于此限制,C# 中的任何内容System.Threading不支持命名空间。例如,使用System.Threading.Timer类不会在 Web 构建中触发。此外,在System.Threading.CancellationTokenSource实际上不要超时,因为取消机制基于System.Threading.Timer.

以下代码突出显示了这些行为差异:

using System.Threading;
using UnityEngine;

public class NoMultithreadedTimers : MonoBehaviour
{
    private Timer t;
    private static void TimerCallbackElapsed(object obj)
    {
        Debug.Log("Timer Callback Fired!"); // This will never fire in Web builds because multithreaded timers aren't available.
    }
    private void Awake()
    {
        t = new Timer(new TimerCallback(TimerCallbackElapsed), this, 1, -1);
    }
}

public class NoCancellationTokenSourceTimeouts : MonoBehaviour
{
    private CancellationTokenSource cs;
    private void Awake()
    {
        cs = new CancellationTokenSource(0); // millisecondsDelay=0 to time out immediately
    }
    private void Update()
    {
        Debug.Log(cs.IsCancellationRequested.ToString()); // Will return false in Web builds since timeouts aren't tracked for cancellation tokens.
    }
} 

网络限制

有几个网络支持跨计算机网络进行多人游戏的 Unity 系统。更多信息
请参阅术语表
Web 平台不支持的功能:

  • 出于安全考虑,浏览器不允许直接访问 IP 套接字进行联网。有关详细信息,请参阅 Web 网络

  • .NET 网络类System.Net不支持命名空间。

  • 由于浏览器中的安全限制,Web 平台不支持本机套接字访问。因此,Web 也不支持 ICMP ping 或 UnityEngine.Ping 等功能。

图形限制

Web 平台中有一些限制,使用WebGL一种在 Web 浏览器中呈现 2D 和 3D 图形的 JavaScript API。Unity Web 构建选项允许 Unity 将内容发布为 JavaScript 程序,这些程序使用 HTML5 技术和 WebGL 渲染 API 在 Web 浏览器中运行 Unity 内容。更多信息
请参阅术语表
图形 API,它基于 OpenGL ES 图形库的功能。有关详细信息,请参阅 Web 图形

音频限制

Web 版本使用基于 Web Audio API 的自定义音频后端,但它仅支持基本的音频功能。有关更多信息,请参阅 Web 中的音频

动态生成代码

Web 是一个 AOT 平台,因此它不允许使用System.Reflection.Emit. 这在所有其他IL2CPPUnity 开发的脚本后端,在为某些平台构建项目时,可以将其用作 Mono 的替代品。更多信息
请参阅术语表
平台、iOS 和大多数游戏机。

多线程支持

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

笔记

在 Web 平台上执行复杂异步任务的推荐方法是使用Awaitable,可以将System.Threading.Tasks.Task在大多数情况下。有关详细信息,请参阅使用 Awaitable 进行异步编程简介

您还可以将协程用于异步工作流。但请注意Awaitable可以直接返回值并自动抛出错误,而协程需要为这两项任务提供额外的逻辑。

以下因素限制了多线程支持:

对本机堆栈扫描的约束

Web 平台使用 WebAssembly,这是一种字节码格式,用于在 Web 浏览器中安全高效地执行 Unity 代码。Web 浏览器旨在在安全且隔离的环境中运行代码,该环境会阻止对本机 WebAssembly 堆栈的直接访问。这会影响多线程垃圾收集,因为 Web 垃圾收集器仅在每一帧结束时运行一次,这与其他平台上的多个帧增量运行不同。

不支持抢占式线程信令

Web 上的后台辅助角色彼此独立并行执行代码。在本机平台上,主线程可以同步向其他线程发送信号,以暂停垃圾回收。Web 不支持此同步信号,这会阻止 WebAssembly 编译的 C# 代码在多个线程中运行。

生成和运行限制

Unity 使用仅具有基本功能的 Web 服务器来托管使用 Build and Run(菜单:Build and Run > Edit > Build Profiles)创建的 Web Build。

服务器不支持数据缓存,这会影响:

  • .data文件,其中包括所有场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
    请参阅术语表
    以及不使用 AssetBundlesAddressables 的构建资产。
  • 可寻址对象和 AssetBundle 文件。

其他资源

Web 浏览器兼容性
Web 开发和发布流程