MRが楽しい

MRやVRについて学習したことを書き残す

KhronosGroup/UnityGLTFを使ったglbファイルの動的読み込みをHoloLens2プロジェクトで試す その1

本日は glTF の技術調査枠です。
KhronosGroup/UnityGLTF で glb ファイルの読み込みを試してみます。
今回は KhronosGroup/UnityGLTF を HoloLens2 プロジェクトで利用してみます。
f:id:bluebirdofoz:20200510220304j:plain

KhronosGroup/UnityGLTFの準備

本記事は以下の記事の続きです。
bluebirdofoz.hatenablog.com

UnityEditor 上で確認した glb ファイルの読み込み動作を HoloLens2 アプリに移植します。
f:id:bluebirdofoz:20200510220408j:plain

HoloLens2プロジェクトの準備

以下の記事を元に HoloLens2 用プロジェクトを作成します。
bluebirdofoz.hatenablog.com

今回は glb ファイルをオブジェクトとして読み込ませるため、シーンに Cube オブジェクトは配置していません。
f:id:bluebirdofoz:20200510220436j:plain

KhronosGroup/UnityGLTFのUWP対応

KhronosGroup/UnityGLTF を UWP でビルドした場合、以下のようなエラーが発生することがあります。

error CS1703: Multiple assemblies with equivalent identity have been imported:
...

f:id:bluebirdofoz:20200510220446j:plain

これは GLTFSerialization のビルドで Plugins フォルダ配下に UWP サポートのための SDK がコピーされることが原因です。
Unity のインストール時に UWP Support の追加を有効にしていると、dll が競合してしまいます。

対処として UnityGLTF/Runtime/Plugins/uap10.0.10586 配下に出力された以下の dll 以外は全て削除します。
・GLTFSerialization.dll
・Newtonsoft.Json.dll
f:id:bluebirdofoz:20200510220509j:plain

アセットの UnityGLTF/Runtime/Plugins/uap10.0.10586 配下が更新されたことを確認して再ビルドを実行します。
f:id:bluebirdofoz:20200510220520j:plain

これで UWP のビルドが行えます。
KhronosGroup/UnityGLTF を UWP で利用する準備ができました。
f:id:bluebirdofoz:20200510220532j:plain

HoloLens2プロジェクトへのインポート

KhronosGroup/UnityGLTF を HoloLens2 プロジェクトにインポートします。
UnityGLTF フォルダをそのまま HoloLens2 プロジェクトにドラッグしてコピーすることでインポートできます。
f:id:bluebirdofoz:20200510220608j:plain

GLTF の読み込みを行う以下のプレハブを Hierarchy にドラッグしてシーンに追加します。
・Assets/UnityGLTF/Runtime/Prefabs/GLTF.prefab
f:id:bluebirdofoz:20200510220622j:plain

追加した GLTF を選択し、Inspector ビューを開きます。
各項目を以下の通り変更します。
・Transform

Scale X:0.1, Y:0.1, Z:0.1

・GLTFComponent

Use Stream : True
Append Streaming Assets : False

f:id:bluebirdofoz:20200510220633j:plain

更に Unity プロジェクト上で動作確認が行えるように、前回と同様に StreamingAssets ディレクトリを作成し、直下に Duck.glb を配置しました。
・StreamingAssets/Duck.glb
f:id:bluebirdofoz:20200510220645j:plain

読み込み処理の実装

UnityEditor 上と HoloLens2 上で読み込み先のファイルを切り替えるため、以下のようなスクリプトを作成しました。
・SettingPath.cs

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

// UnityGLTFの名前空間を追加
using UnityGLTF;

// GLTFComponentのコンポーネントを利用する
[RequireComponent(typeof(GLTFComponent))]
public class SettingPath : MonoBehaviour
{
    /// <summary>
    /// 読み込むファイル名
    /// </summary>
    [SerializeField, Tooltip("読み込むファイル名")]
    public string filename;

    /// <summary>
    /// 起動時処理(Awake)
    /// </summary>
    void Awake()
    {
        // 参照ディレクトリのパスを環境によって切り替える
        string directorypath = "";
#if WINDOWS_UWP
        // HoloLens上での動作の場合、LocalAppData/AppName/LocalStateフォルダを参照する
        directorypath = Windows.Storage.ApplicationData.Current.LocalFolder.Path;
#else
        // Unity上での動作の場合、Assets/StreamingAssetsフォルダを参照する
        directorypath = UnityEngine.Application.streamingAssetsPath;
#endif
        // ディレクトリ直下の指定ファイル名のパスを取得する
        string filepath = System.IO.Path.Combine(directorypath, filename);

        // GLTFComponentの参照を取得する
        GLTFComponent component = GetComponent<GLTFComponent>();
        // GLTFComponentに読み込みファイルパスを指定する
        component.GLTFUri = filepath;
    }
}

f:id:bluebirdofoz:20200510220703j:plain

作成した SettingPath スクリプトを GLTF オブジェクトにアタッチします。
f:id:bluebirdofoz:20200510220717j:plain

GLTF を選択し、Inspector ビューを開きます。
SettingPath の項目を以下の通り変更します。
・SettingPath

Filename : Duck.glb

f:id:bluebirdofoz:20200510220726j:plain

この状態で[再生]ボタンをクリックして動作確認を行います。
UnityEditor 上の動作では StreamingAssets 直下にある Duck.glb を読み込んで表示します。
f:id:bluebirdofoz:20200510220737j:plain

長くなったので記事を分けます。
次回は HoloLens2 での動作確認です。
bluebirdofoz.hatenablog.com