發佈WebGL的過程

  今天測試了一下發布 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也是能夠的......

相關文章
相關標籤/搜索