您可以按照以下方式在 WebGL 中使用联网功能:
Unity Multiplayer(取代之前的 UNet)
重要:UNet 是一个已弃用的解决方案,新的多玩家和联网解决方案 (MLAPI) 正在开发中。
或者,您可以使用 JavaScript WebSockets 或 WebRTC 实现您自己的联网功能。由于 JavaScript 代码无法直接访问 IP 套接字来实现网络连接,您不能使用 .NET 网络类。
本页面包含如何在 WebGL 中使用联网功能的指南。
Unity 支持在 WebGL 中使用 UnityWebRequest 类。为实现 UnityWebRequest 类,Unity 使用 JavaScript Fetch API,它使用浏览器来处理 web 请求。这种情况下对访问跨域资源施加了安全限制。
如果您向非 Unity 内容托管服务器发送 Web 请求,则发送请求的服务器必须授权 Unity 内容。
为了在 WebGL 中访问跨域 Web 资源,您尝试访问的服务器需要使用跨源资源共享 (CORS) 对此跨域 Web 资源进行授权。
如果您尝试使用 UnityWebRequest 来访问内容,但远程服务器未正确设置或配置 CORS,浏览器控制台中将显示如下错误:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://myserver.com/.This can be fixed by moving the resource to the same domain or enabling CORS.
服务器需要向发出的 http 响应中添加一些 Access-Control 标头,以指示哪些网页有权从 Web 浏览器读取该信息。
以下示例演示了如何添加 Access-Control 标头,以允许 Unity WebGL 从任何源点访问 Web 服务器上的资源:该示例包括常见的请求标头,并允许 GET、POST 或 OPTIONS 方法:
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Headers": "Accept, X-Access-Token, X-Application-Name, X-Request-Sent-Time",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Origin": "*",
不要使用阻止 UnityWebReqest 下载的代码,如下所示:
while(!www.isDone) {}
您不能阻止线程等待 UnityWebRequest 下载完成,否则您的应用程序将冻结。因为 WebGL 采用单线程机制,并且由于 JavaScript 中的 fetch
API 是异步的,所以除非您将控制权交回给浏览器,否则下载永远不会完成。取而代之的做法是使用协程和 yield 语句等待下载完成。有关更多信息,请参阅使用 UnityWebRequest 的协程示例。
Unity Multiplayer 通过 WebSockets 协议实现通信。请参阅 NetworkServer.useWebSockets。
WebGL 不允许直接访问 IP 套接字,但是您可以使用 WebSockets 或 WebRTC(浏览器支持的两种最常见的网络协议)来解决此问题。WebSockets 具有更广泛的支持,但 WebRTC 允许浏览器之间的对等连接 (P2P) 以及不可靠连接。Unity 未提供内置的 API 用于使用 WebSockets 或 WebRTC,但您可以使用一个 JavaScript 插件来实现。Unity Asset Store 上提供实现 WebSocket 联网的插件。