Web 技术对设计为在 Web 浏览器中运行的 Unity Web 应用程序施加限制。在为 Web 平台构建应用程序之前,请确保了解以下技术限制。
大多数流行的桌面端浏览器版本都支持 Unity Web 内容,但请注意,不同的浏览器提供不同程度的支持。
由于平台本身的限制,Web 构建中的以下功能不可用或受到限制:
Visual Studio 不支持调试 Web 构建。有关更多信息,请参阅Web 构建的调试和故障排除。
由于浏览器中对文件系统的访问受限,Web 构建不支持 Unity 缓存和缓存脚本 API。对资产数据和 AssetBundle 的网络请求将改为缓存在浏览器缓存中。请参阅 Web 中的缓存行为。
由于 JavaScript 中缺少线程支持,因此不支持线程。在 Unity 内部使用线程来加速性能以及在脚本代码和托管的 dll 中使用线程都是不受支持的。实质上不支持 System.Threading 命名空间中的任何内容。
有一些联网功能是 Web 平台不支持的:
出于安全考虑,浏览器不允许直接访问 IP 套接字来进行联网。有关更多信息,请参阅 Web 联网。
不支持 System.Net 命名空间中的 .NET 联网类。
由于浏览器内的安全限制,Web 平台不支持原生套接字访问。因此,Web 也不支持 ICMP ping 或 UnityEngine.Ping 等功能。
WebGL 图形 API 基于 OpenGL ES 图形库的功能,因此 Web 平台存在一些限制。有关更多信息,请参阅 Web 图形。
Web 构建使用基于 Web 音频 API 的自定义音频后端,但仅支持基本的音频功能。有关更多信息,请参阅 Web 中的音频。
Web 是一个 AOT 平台,因此不允许使用 System.Reflection.Emit 来动态生成代码。在所有其他__ IL2CPP__种由 Unity 开发的脚本后端,可在为某些平台构建项目时替代 Mono。更多信息
See in Glossary 平台、iOS 和大多数游戏主机上都是如此。
虽然 Unity 为原生 C/C++ 代码提供多线程支持,但由于 WebAssembly 的限制,Web 平台尚不支持 C# 多线程。这意味着使用 Web 平台构建的应用程序必须在单个 C# 线程上运行。
注意:
仅当在 Web 播放器设置中启用原生 C/C++ 支持时,Web 平台才支持 C/C++ 多线程。
当您的文档位于安全上下文中时,Web 平台支持多线程。
以下 HTTP 响应标头必须由服务器设置。
在 Web 平台上执行复杂异步任务时,推荐使用协同程序。有关更多信息,请参阅协同程序文档。
以下因素限制了多线程支持:
Web 平台使用 WebAssembly,这是一种字节码格式,用于在 Web 浏览器中安全高效地执行 Unity 代码。Web 浏览器被设计为在安全和隔离的环境中运行代码,从而阻止对 WebAssembly 本地堆栈的直接访问。这会影响多线程垃圾收集,因为 Web 垃圾回收器仅在每帧末尾运行一次,不像其他平台那样在多个帧上逐步递增。
Web 上的后台工作线程彼此独立并行执行代码。在原生平台上,主线程可以同步向其他线程发送信号以暂停垃圾收集。Web 不支持此同步信令,因此会阻止 WebAssembly 编译的 C# 代码在多线程中运行。
Unity 使用仅具有基本功能的 Web 服务器来托管使用构建并运行 (Build and Run) 创建的 Web 构建(菜单:编辑 (Edit) > 构建配置文件 (Build Profiles) > 构建并运行 (Build and Run))。
服务器不支持数据缓存,这会影响:
.data 文件,其中包含不使用 AssetBundle 或 Addressables 的构建的所有场景和资产。