发布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也是能够的......

相关文章
相关标签/搜索