没有直接套接字访问
由于安全隐患,JavaScript代码不能直接访问IP套接字来实现网络连接。因此,.NET网络类(即System.Net
名称空间中的所有内容,特别是System.Net.Sockets
)在WebGL中不起作用。这同样适用于Unity的旧版UnityEngine.Network*
类,这些类在构建WebGL时不可用。
如果您需要在WebGL中使用网络,您现在可以选择使用Unity中的WWW或UnityWebRequest类或支持WebGL的新Unity Networking,或者使用JavaScript中的WebSockets或WebRTC实现您自己的网络。
Using the WWW or WebRequest classes in WebGL
WebGL支持WWW和UnityWebRequest类。它们使用JavaScript中的XMLHttpRequest类实现,使用浏览器来处理WWW请求。这对访问跨域资源施加了一些安全限制。基本上,任何WWW对服务器的请求都不同于承载WebGL内容的服务器,需要由您尝试访问的服务器授权。要访问WebGL中的跨域WWW资源,您尝试访问的服务器需要使用CORS对其进行授权。
如果您尝试使用WWW
或UnityWebReqest
访问内容,并且远程服务器没有正确设置CORS或配置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.
CORS代表跨源资源共享,并在此处进行了说明。基本上,服务器需要为它发送的http响应添加一些Access-Control(访问控制)
标题,这会告诉浏览器它允许网页访问服务器上的内容。下面是一个头文件设置示例,它允许Unity WebGL从任何来源访问Web服务器上的资源,使用公共请求标头并使用http 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": "*",
请注意,根据CORS规范的7.1.1,WWW.responseHeaders仅限于实际响应头的一个子集。
另请注意,XMLHttpRequest不允许流式传输数据,因此WebGL上的WWW类将只会在下载完成后处理任何数据(因此AssetsBundles无法在下载时像其他平台上一样进行解压缩和加载)。
Do not block on WWW or WebRequest downloads 不要阻止WWW或WebRequest下载
不要使用阻止WWW或WebRequest下载的代码,如下所示:
while(!www.isDone) {}
WWW或WebRequest下载阻止不适用于Unity WebGL。因为WebGL是单线程的,并且由于JavaScript中的XMLHttpRequest类是异步的,所以除非您将控制权返回给浏览器,否则您的下载永远不会完成。相反,你的内容会死锁。相反,使用Coroutine和yield语句等待下载完成。
Using Unity Networking
Unity Networking支持通过WebSockets协议进行通信的WebGL。请参阅Networking.NetworkManager.useWebSockets。
Using Web Sockets or WebRTC from JavaScript 使用来自JavaScript的Web套接字或WebRTC
如上所述,WebGL无法直接访问IP套接字。但是,如果您需要超出WWW类的网络功能,则可以使用Web套接字或WebRTC,这两种浏览器都支持网络协议。 Web套接字有更广泛的支持,但WebRTC允许浏览器和不可靠连接之间的p2p连接。这些协议都没有通过Unity中的内置API公开,但可以使用JavaScript plugin来实现这一点。在AssetStore上可以找到在Unity WebGL中实现WebSocket联网的插件示例。
Unity WebGL 中文文档 Unity 2018.1.b
1. WebGL
2. webGL Browser Compatibility
3. Building and running a WebGL project
4. WebGL: Deploying compressed builds
5. Debugging and trouble shooting WebGL builds
6. WebGL Graphics
7. WebGL Networking
8. Using Audio In WebGL
9. WebGL performance considerations
10. WebGL: Interacting with browser scripting
11. Using WebGL Templates
12. Cursor locking and full-screen mode in WebGL
13. Input in WebGL