💬

unityでUniVRMを使ってGLB/GLTFを外部ファイルからロードする

2025/01/19に公開

はじめに

デスクトップマスコットの OSSとして以下のプロジェクトを開発しています。

https://github.com/MidraLab/uDesktopMascot

こちらのプロジェクトでは、StreamingAssetsにglb/gltfを置くことで任意のモデルをロードできるようにしています。

環境

  • Unity 6000.0.31f1(Build In Pipeline)
  • UniVRM v0.128.1(PackageManager経由でインストール)

デモ

以下のモデルをお借りして、glb/gltfのロードをテストします。

https://sketchfab.com/3d-models/pumpkin-head-ab0922ede42a47e88656bdded890d159

ロード処理

UniVRMはUniGLTFが含まれています。 その中のAutoGltfFileParserは、gltfzip, othersを自動的に判定をして切り替えてくれます。

以下のようにAutoGltfFileParserにパスを渡すことで、ロードすることができます。

// ファイルを自動的にパースする
var parser = new AutoGltfFileParser(path);

実際には、以下のように処理を行いました。

        private static async UniTask<GameObject> LoadGlbOrGltfModelAsync(string path)
        {
            try
            {
                // ファイルを自動的にパースする
                var parser = new AutoGltfFileParser(path);

                using var gltfData = parser.Parse();
                // ImporterContextを作成
                var importer = new ImporterContext(gltfData);

                // IAwaitCallerを作成
                var awaitCaller = new RuntimeOnlyAwaitCaller();

                // モデルを非同期でロード
                var gltfInstance = await importer.LoadAsync(awaitCaller);

                // 必要に応じてメッシュを表示
                gltfInstance.ShowMeshes();

                // ルートのGameObjectを取得
                var model = gltfInstance.Root;

                return model;
            }
            catch (OperationCanceledException)
            {
                Log.Warning("モデルのロードがキャンセルされました。");
                return null;
            }
            catch (Exception e)
            {
                Log.Error($"モデルのロード中にエラーが発生しました: {e.Message}");
                return null;
            }
        }
MidraLab(ミドラボ)

Discussion