🍰

Unityのラインタイム中に表現に利用する3Dモデルを動的に差し替える

2023/01/12に公開

はじめに

Unityを使うと様々な用途で使えるアプリが簡単に作成できます。
DCC、CAD、BIMなど様々な3Dモデルをコンテンツの一部として表現に利用することができますが、それらの3Dモデルを変更する度にアプリを更新するのでは手間がかかります。
実現方法はいろいろとあると思いますが、ここではglTFastを使います。
https://github.com/atteneder/glTFast

なぜUnity glTFastか?

CADやBIMといった産業用データをUnityに取り込む場合、Pixyz製品を利用することが一般的です。
データ変換処理を自動化するPixyz Scenario Processorではデータ処理ワークフローの解説として以下の例を挙げており、その中でUnity glTFastが登場しています。
Pixyzで出力したglTFをglTFastでRunite Appに取り込む図

サポートファイルフォーマットにサポート拡張子や用途が記述されています。

環境構成

  • Unity 2022.1.23f1
  • glTFast 5.0.0
  • GitHub (ここでは表示したいglb/gltfを公開するWebサーバーの代替として利用)

上記の環境で動かすとシーン内に表示する3Dモデル(Adamの顔、トカゲ、アヒル)をUnityのProject内にAssetとして持たせていなくても、ランタイム実行中にWebサーバーから3Dモデルを取得して表示させることができます。

手順

  1. 前述glTFastのGitHubリポジトリよりUnity Installer Packageをダウンロードする
  2. Assets > Import Package > Custom PackageからglTFをインポートする
  3. glTFがインポートできるとGameObjectに追加できるComponentでGltf AssetGltf Bounds Assetが利用できるようになる
InspectorでComponentを追加する場合
  1. Hierarchyで空のGameObjectを追加する(右クリック > Create Empty)
  2. そのGameObjectのInspectorでGltf Assetをコンポーネントとして追加する
  3. 追加したGltf AssetコンポーネントのUrlに取得したい3Dモデルのアドレスをセットする

    Urlに指定したアドレス

https://github.com/takaakikawasaki/dataStorage/raw/main/glb/AdamHead.glb

  1. この状態でUnity EditorでPlay Modeに入るとUrlのアドレスに対してWebRequestが発行され、3Dモデルのシーン内へのロードが実行される
Scriptの場合
  1. Hierarchyで空のGameObjectを追加する(右クリック > Create Empty)
  2. そのGameObjectのIspectorでNew Scriptを追加する
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using GLTFast;

public class ChangeGlb : MonoBehaviour
{
    //glb,gltfを取得するURLは外部サービスから取得し、UIのDropdownと連動させれば動的に変えることができる。
    static string option1 = "https://github.com/takaakikawasaki/dataStorage/raw/main/glb/AdamHead.glb";
    static string option2 = "https://github.com/takaakikawasaki/dataStorage/raw/main/glb/15f772d7febd45a48d3cecf1cef6fe10.glb";
    static string option3 = "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF/Duck.gltf";
    private GLTFast.GltfAsset gltf;

    private void Start()
    {
        gltf = gameObject.AddComponent<GLTFast.GltfAsset>();
        gltf.Url = option1;
    }

    public void OnValueChanged(int value)
    {
        switch (value)
        {
            case 0:
                gltf.Dispose();
                gltf = gameObject.AddComponent<GLTFast.GltfAsset>();
                gltf.Url = option1;
                break;
            case 1:
                gltf.Dispose();
                gltf = gameObject.AddComponent<GLTFast.GltfAsset>();
                gltf.Url = option2;
                break;
            default:
                gltf.Dispose();
                gltf = gameObject.AddComponent<GLTFast.GltfAsset>();
                gltf.Url = option3;
                break;
        }
    }
}
  1. この状態でUnity EditorでPlay Modeに入るとUrlのアドレスに対してWebRequestが発行され、3Dモデルのシーン内へのロードが実行される

さいごに

Unity glTFastにはEditorでデザイン時のデータのImport、データのExportといった機能もありますが、ここではランタイム時のデータのロードについて記述しました。

Discussion