今天測試了一下發布 WebGL 的過程, 經過 Unity3D 建立, 至關麻煩, 它不只對API有限制, 對測試Debug有限制, 也對服務器有要求, 而且如今的瀏覽器都很注重安全策略, 這些都增長了複雜度...javascript
流程大概以下:java
1. 作個簡單場景, 放到 BuildSettings 裏面去web
2. 若是有代碼, 檢查是否是有不能使用的API或是引用不能用的命名空間, 好比 System.Threading 這些, 即便引用了打包也不報錯, 而後發佈以後運行拋異常, 它就不動了.json
3. Build 出來的工程不能直接拖到瀏覽器運行, 360 / Firefox / Google Chrome 試過了都不讓運行, 安全策略的問題跨域
4. 打開IIS服務, 建立本地服務器, 把生成的WebGL的工程拖進去, 綁定端口瀏覽器
5. 添加Web.config文件, 添加各類文件流支持, 要否則瀏覽器會報Unexpected Token錯誤安全
6. 使用各類瀏覽器直接 localhost:端口 打開都沒有問題服務器
最簡單的工程坑仍是挺多, 按順序看下來:多線程
2.1 WebGL多線程不能用, 因此Threading有關都不能用. app
2.2 部署在服務器上, 因此文件讀寫都不能用, StreamingAssets的地址在本地變成了 [ /http:/localhost:61281/StreamingAssets ] , 因此只能老實用WebRequest來進行下載了
2.3 Resources文件夾下的東西仍是能正常讀取, 它的資源應該是會在加載時就所有下載了, 因此很大的話基本沒有用戶體驗了, 不太小工程仍是能用
5.1 沒有Web.config的話彷佛任何傳輸都不正確, 就是資源跨域之類的問題了
其實還有不少問題, 中文輸入法跟隨啊, Shader啊.......
先從搭建IIS開始:
必須用服務器, 先打開本地的IIS服務, win10比win7快了至少10倍:
啓動完成後繼續打開管理工具, 能夠設置IIS了:
在設置中設置本地硬盤映射, 直接設置到WebGL的輸出目錄:
添加一個綁定端口, 省得多個地址衝突:
設置好了以後, 須要在根目錄添加 Web.config 文件支持資源類型文件傳輸:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <staticContent> <remove fileExtension=".mem" /> <remove fileExtension=".data" /> <remove fileExtension=".unity3d" /> <remove fileExtension=".jsbr" /> <remove fileExtension=".membr" /> <remove fileExtension=".databr" /> <remove fileExtension=".unity3dbr" /> <remove fileExtension=".jsgz" /> <remove fileExtension=".memgz" /> <remove fileExtension=".datagz" /> <remove fileExtension=".unity3dgz" /> <remove fileExtension=".json" /> <remove fileExtension=".unityweb" /> <mimeMap fileExtension=".mem" mimeType="application/octet-stream" /> <mimeMap fileExtension=".data" mimeType="application/octet-stream" /> <mimeMap fileExtension=".unity3d" mimeType="application/octet-stream" /> <mimeMap fileExtension=".jsbr" mimeType="application/octet-stream" /> <mimeMap fileExtension=".membr" mimeType="application/octet-stream" /> <mimeMap fileExtension=".databr" mimeType="application/octet-stream" /> <mimeMap fileExtension=".unity3dbr" mimeType="application/octet-stream" /> <mimeMap fileExtension=".jsgz" mimeType="application/x-javascript; charset=UTF-8" /> <mimeMap fileExtension=".memgz" mimeType="application/octet-stream" /> <mimeMap fileExtension=".datagz" mimeType="application/octet-stream" /> <mimeMap fileExtension=".unity3dgz" mimeType="application/octet-stream" /> <mimeMap fileExtension=".json" mimeType="application/json; charset=UTF-8" /> <mimeMap fileExtension=".unityweb" mimeType="application/octet-stream" /> </staticContent> </system.webServer> </configuration>
這樣就能在本地瀏覽器打開了, 放在 Resources 中的 Txt 資源文件能夠正常讀取:
text2.text = Resources.Load<TextAsset>("Test").text; // Test Resources
放在 StreamingAssets 下的 Txt 文件不能經過IO讀取, 使用 UnityWebRequest 進行獲取, 讀取地址通過 System.Uri 加工:
private void Start() { StartCoroutine(GetData(Application.streamingAssetsPath + "/Test.txt", (_handle) => { text1.text = _handle.text; // Test streamingAssetsPath })); } IEnumerator GetData(string loadPath, System.Action<DownloadHandler> succ) { var uri = new System.Uri(loadPath); UnityWebRequest www = UnityWebRequest.Get(uri.ToString()); yield return www.SendWebRequest(); if(www.isNetworkError || www.isHttpError) { Debug.Log(www.error); } else { Debug.Log(www.downloadHandler.text); succ.Invoke(www.downloadHandler); } }
不過若是在Build的時候選擇 [ Build & Run ] 的話, 它會臨時起一個服務器來跑打包出來的工程, 不須要IIS也是能夠的......