見出し画像

UnityのWebGLビルドでのVRMファイル読み込み

UnityのWebGLビルドでVRMファイルを読み込む方法をまとめました。

1. WebGLビルドのネットワークの制限

UnityのWebGLビルドは、System.Net、System.Net.Sockets、UnityEngine.Networkなどのネットワーククラスは利用できません。次のAPIを利用します。

・WWW
・WebRequest
・Unity Network

さらに、シングルスレッド制限があるので、非同期メソッドはコルーチンを使って実装する必要があります。

2. WebGLビルドでのHTMLファイルの読み込み

WebGLビルドでHTMLファイルを読み込むコードは、次のとおり。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

// HTMLファイルの読み込み
public class HTMLLoader : MonoBehaviour
{
    // スタート時に呼ばれる
    void Start()
    {
        StartCoroutine("LoadHTML", "https://www.google.co.jp/");
    }

    // HTMLファイルの読み込み
    IEnumerator LoadHTML(string path)
    {
        // HTMLファイルの読み込み
        UnityWebRequest request = UnityWebRequest.Get(path);
        yield return request.SendWebRequest();

        // HTMLファイルをログ出力
        string html = request.downloadHandler.text;
        print(html);
    }
}

3. WebGLビルドでのVRMファイルの読み込み

WebGLビルドでHTMLファイルを読み込むコードは、次のとおり。
「Assets/StreamingAssets」にVRMファイル「AliciaSolid.vrm」を配置しています。

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using VRM;

// VRMファイルの読み込み
public class VRMLoader : MonoBehaviour {

    //スタート時に呼ばれる
    void Start() {
        StartCoroutine("LoadVRM", "AliciaSolid");
    }

    // VRMファイルの読み込み
    IEnumerator LoadVRM(string name)
    {
        // パスとインポーターの生成
        string path = Application.streamingAssetsPath+"/"+name+".vrm";
        VRMImporterContext context = new VRMImporterContext();

        # if UNITY_EDITOR
            // VRMファイルの読み込み
            context.Parse(path);
            context.Load();
            yield return null;
        # else
            // VRMファイルのダウンロード
            UnityWebRequest webRequest = UnityWebRequest.Get(path);
            yield return webRequest.SendWebRequest();
            if (webRequest.isNetworkError)
            {
                // エラー処理
                print(webRequest.error);
                yield break;
            }

            // VRMファイルの読み込み
            context.ParseGlb(webRequest.downloadHandler.data);
            context.Load();
            yield return null;
        # endif

        // メッシュの表示
        context.ShowMeshes();
    }
}

Unity Editorは、context.Parse()で直接ファイルを読み込みます。

WebGLビルドは直接ファイルにアクセスできないので、WebRequestでバイナリをダウンロードしてから、context.ParseGlb()で読み込みます。


この記事が気に入ったらサポートをしてみませんか?