【Unity】MRTKって3Dモデルの動的ロード とか、XR以外にも使えるよねという話

# はじめに
MRTKとは、もともとMicrosoft社のMR(AR)ゴーグル、HoloLens用の開発キットです

<iframe width="560" height="315" src="https://www.youtube.com/embed/qfONlUCSWdg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

https://docs.microsoft.com/ja-jp/windows/mixed-reality/mrtk-unity/?view=mrtkunity-2021-05

現在はOculus等VRゴーグルやリープモーションなどにも対応し、
手でのモデル操作や、空間配置するボタン等のUXが充実しています。

XR関係の人しかさわったことがないと思うのですが、
中にはXRに関係なく使えそうな機能がいくつかありますので、
サンプルを見てみるところくらいまで紹介しようと思います。

#目次
・環境、導入方法
・3Dモデルの動的(ランタイム)ロード
・全部入りの便利なシェーダー(ビルドイン、対処すればURPにも)
・音声入力コマンド

#●環境、導入方法
<details><summary>環境、導入方法</summary>
現在のUnity2020+MRTKv2.7では、PackageManagerの機能を使いインポートすることが出来ます。
さらに、Mixed Reality Feature Toolという外部ツールが登録をアシストしてくれます。
こちらのツールを使い、「Mixed Reality Toolkit Foundation」「Mixed Reality Toolkit Examples」をインポートします。
https://docs.microsoft.com/ja-jp/windows/mixed-reality/develop/unity/welcome-to-mr-feature-tool
設定後プロジェクトを開くと、XRの設定を自動でしてくれる画面が出ますがスキップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1317891/1494b6ea-90bd-2505-be67-8d7519b90881.png)
すでに基本の機能はインポートされた状態で、PackageManagerにパッケージが登録されています。
「Mixed Reality Toolkit Examples」のSamplesから必要なサンプルをダウンロードできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1317891/1d74b4e8-6983-2888-f99e-6371922d5441.png)
ダウンロードしたサンプルは↓の場所に入ります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1317891/168d60b4-696e-b94b-248c-97c837b79873.png)</details>



#●3Dモデルの動的(ランタイム)ロード
**サンプル名:Demos - Gltf**
**サンプルシーン：Demos - Gltf\Scenes\Glb-Loading-Demo**

この記事を書いた動機です。
ネット上で「Unity モデル ランタイムロード」などで検索しても有料アセットしか出てこず、買うしかないかなと思っている人多いのでは。
対応しているのはgltfという、主にWEB上でモデル表示をするのに使われている(?)形式。
自分は聞きなじみがなかったですが、世間的には一般的なフォーマットらしく、blender等でも書き出し可能です。
**とりあえずの使い方**
サンプルシーンを再生すると、インターネット上のラジカセのモデルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1317891/0eb55709-c63e-b972-27fd-19f53c7d4022.png)
他のシーンで使うには、空のオブジェクトにTestGlbLoadingを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1317891/cf56dac8-e650-db31-af7a-c2149a2e22be.png)

URLを指定して再生すると、インターネット上のgltfモデルを表示してくれます。
ローカルのモデルにも対応しているので、デスクトップなどのファイルを指定することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1317891/10f3c7d4-3a97-ed44-3298-9208e4a6b593.png)
↓はTestGlbLoadingの内容ですが、作成したオブジェクトは gltfObjectに格納されます。
gltfObject.GameObjectReferenceでGameObject型になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1317891/36b0e4a8-e2c2-4140-9c13-0d472ffbb40d.png)




#●全部入りの便利なシェーダー
**サンプル名:Demos - StandardShader**
**サンプルシーン：Demos - StandardShader\Scenes**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1317891/de1c1f83-8571-245b-b599-33005ef984c6.png)

https://docs.microsoft.com/ja-jp/windows/mixed-reality/mrtk-unity/features/rendering/mrtk-standard-shader?q=shader&view=mrtkunity-2021-05

URP、shadergraphの普及で難易度が下がってきてはいますが、初心者には難しいシェーダー作成。
MRTKで使われているシェーダーは、書き込み深度の変更、ディソルブや断面表示、リムライトなど、少しニッチだけれども使いたい人は確実にいる機能が1シェーダーの機能切替で使えます。
URPで使用するには↓のコマンドを実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1317891/86cf1822-b24c-d6e7-d561-5a8b75f36726.png)


#●音声入力コマンド
**サンプル名:Demos - Input**
**サンプルシーン：Demos - Input\Scenes\Speech**
あらかじめ登録したワードを使ってイベントを実行できます。
日本語入力も難なくやってくれます。
(日本語なら表音文字だから登録はひらがなで登録すればいいけど、英語はどういう理屈なのかわからん…自分の下手な英語では認識してくれなかった)
**とりあえずの使い方**
MRTKは、どのインプットを受け付けるか、MRTKプロファイルというものを使って設定します。
”Demos - Input\Scenes\Speech”を開き、独自のコマンドを追加してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1317891/ac5270b9-29f9-ade1-4294-f0ab4f3ccc33.png)
次に、音声入力で実行されるイベントを作成します。
サンプルではオブジェクトにアタッチされているので、編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1317891/9595a2a7-7cdb-a5fd-d30e-01bd122c9b56.png)
これで、「じっこう」と言うとオブジェクトの色が変わると思います。


##●終わり
各機能、Untiyで公式採用してほしいくらいです。無料とは有り難いですね。
以上紹介でした。参考になれば幸いです。