沒有直接套接字訪問
由于安全隱患,JavaScript代碼不能直接訪問IP套接字來實(shí)現(xiàn)網(wǎng)絡(luò)連接。因此,.NET網(wǎng)絡(luò)類(即System.Net名稱空間中的所有內(nèi)容,特別是System.Net.Sockets)在WebGL中不起作用。這同樣適用于Unity的舊版UnityEngine.Network*類,這些類在構(gòu)建WebGL時(shí)不可用。
如果您需要在WebGL中使用網(wǎng)絡(luò),您現(xiàn)在可以選擇使用Unity中的WWW或UnityWebRequest類或支持WebGL的新Unity Networking,或者使用JavaScript中的WebSockets或WebRTC實(shí)現(xiàn)您自己的網(wǎng)絡(luò)。
Using the WWW or WebRequest classes in WebGL
WebGL支持WWW和UnityWebRequest類。它們使用JavaScript中的XMLHttpRequest類實(shí)現(xiàn),使用瀏覽器來處理WWW請求。這對訪問跨域資源施加了一些安全限制?;旧?,任何WWW對服務(wù)器的請求都不同于承載WebGL內(nèi)容的服務(wù)器,需要由您嘗試訪問的服務(wù)器授權(quán)。要訪問WebGL中的跨域WWW資源,您嘗試訪問的服務(wù)器需要使用CORS對其進(jìn)行授權(quán)。
如果您嘗試使用WWW或UnityWebReqest訪問內(nèi)容,并且遠(yuǎn)程服務(wù)器沒有正確設(shè)置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代表跨源資源共享,并在此處進(jìn)行了說明?;旧?,服務(wù)器需要為它發(fā)送的http響應(yīng)添加一些Access-Control(訪問控制)標(biāo)題,這會告訴瀏覽器它允許網(wǎng)頁訪問服務(wù)器上的內(nèi)容。下面是一個頭文件設(shè)置示例,它允許Unity WebGL從任何來源訪問Web服務(wù)器上的資源,使用公共請求標(biāo)頭并使用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": "*",
請注意,根據(jù)CORS規(guī)范的7.1.1,WWW.responseHeaders僅限于實(shí)際響應(yīng)頭的一個子集。
另請注意,XMLHttpRequest不允許流式傳輸數(shù)據(jù),因此WebGL上的WWW類將只會在下載完成后處理任何數(shù)據(jù)(因此AssetsBundles無法在下載時(shí)像其他平臺上一樣進(jìn)行解壓縮和加載)。
Do not block on WWW or WebRequest downloads 不要阻止WWW或WebRequest下載
不要使用阻止WWW或WebRequest下載的代碼,如下所示:
while(!www.isDone) {}
WWW或WebRequest下載阻止不適用于Unity WebGL。因?yàn)閃ebGL是單線程的,并且由于JavaScript中的XMLHttpRequest類是異步的,所以除非您將控制權(quán)返回給瀏覽器,否則您的下載永遠(yuǎn)不會完成。相反,你的內(nèi)容會死鎖。相反,使用Coroutine和yield語句等待下載完成。
Using Unity Networking
Unity Networking支持通過WebSockets協(xié)議進(jìn)行通信的WebGL。請參閱Networking.NetworkManager.useWebSockets。
Using Web Sockets or WebRTC from JavaScript 使用來自JavaScript的Web套接字或WebRTC
如上所述,WebGL無法直接訪問IP套接字。但是,如果您需要超出WWW類的網(wǎng)絡(luò)功能,則可以使用Web套接字或WebRTC,這兩種瀏覽器都支持網(wǎng)絡(luò)協(xié)議。 Web套接字有更廣泛的支持,但WebRTC允許瀏覽器和不可靠連接之間的p2p連接。這些協(xié)議都沒有通過Unity中的內(nèi)置API公開,但可以使用JavaScript plugin來實(shí)現(xiàn)這一點(diǎn)。在AssetStore上可以找到在Unity WebGL中實(shí)現(xiàn)WebSocket聯(lián)網(wǎng)的插件示例。

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