解説！MRTKv2のボタン

# 概要

MRTKは色々な機能が用意されていて本当～に便利なのですが、『「◯◯がしたい！」という目的に対して「**MRTKのどの機能がどう使えるのか**」が分からない』というのが往々にしてぶつかる壁ではないかなと思います。
本記事ではMRTKで最も使うであろうボタンについて、コンポーネント構成と設定を（分かる範囲で）解説します。
[公式ドキュメント](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/README_Button.html)と併せて読んで理解を深めていきましょう。

# 環境
Oculus Quest 2でMRTKを使います。（[導入方法はこちら]
(https://microsoft.github.io/MixedRealityToolkit-Unity/Documentation/CrossPlatform/OculusQuestMRTK.html)）

- Unity 2019.4.16f1
- MRTK v2.5.1（Package Manager）

# ボタンの作り方

MRTKでボタンを作るには、`MRTK Toolbox`を使うのが手っ取り早いです。
基本的なUIオブジェクトがまとめられており、ワンクリックでオブジェクトをシーンに配置できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/f22787aa-73aa-00b3-ac0f-bab65371c5b1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/2a1d21b3-8ddb-6a23-d34e-428e9f19a8b3.png)
今回はこちらの「Hololens2 Button 32x32mm」を使います。まずはシーンに配置して、エディタで動作確認しやすいように（0, 0, 0.2）の位置に移動させておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/914e5b6b-e156-c534-e13a-b3fc6f08f2b8.png)

# ボタンを構成するコンポーネントたち
このボタンを構成するコンポーネントは以下の通り。（記事内リンク）

- [Transform](#transform-コンポーネント)
- [Box Collider](#box-collider-コンポーネント)
- [PressableButtonHololens2](#pressablebuttonhololens2-コンポーネント)
- [PhysicalPressEventRouter](#physicalpresseventrouter-コンポーネント)
- [Interactable](#interactable-コンポーネント)
- [Audio Source](#audio-source-コンポーネント)
- [NearInteractionTouchable](#nearinteractiontouchable-コンポーネント)
- [Button Config Helper](#button-config-helper-コンポーネント)

ひとつずつ見ていきましょう。

## Transform コンポーネント
言わずと知れた、オブジェクトの位置、回転、スケールを扱うクラスです。
Scene内の全てのオブジェクトは必ずTransformコンポーネントを持ちます。

>エディタで動作確認しやすいように（0, 0, 0.2）の位置に移動させておきます。

MRTKには入力シミュレート機能があり、Gameビューを右ドラッグしてポインターを動かし、右クリックでインタラクションできます。（[GGVインタラクション](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/InputSimulation/InputSimulationService.html#ggv-gaze-gesture-and-voice-%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%A9%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)）
前章でボタンのZ軸の位置を変えたのは、あらかじめGameビューでボタンが見えるように配置することで、このシミュレートをしやすくする意図があります。
![GGVPointer.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/bc15c2e3-596a-78ff-266e-4ca18da94d7e.gif)

## Box Collider コンポーネント
ボタンの当たり判定です。これを非アクティブにするとポインターと指で触れても何も反応しなくなります。ボタンには必須です。
「じゃあボタンを押させたくない時は`enabled = false`すればいいんだな」と思いますよね？それはそうなんですけれども、もっといい方法があります。[後述](#enabled)。
![BoxCollider.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/0f8217af-f5f5-6d24-0e1d-42399297f141.gif)
ちなみにボタンが押されるとBoxColliderも動くのかというとそうではなく、ボタンが押されてもBoxColliderは微動だにしません。

## PressableButtonHololens2 コンポーネント
このコンポーネントを展開すると、Gizmoで水色、赤色、黄色、青色の平面が表示されます。これはこのコンポーネントの設定を可視化したものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/396f3f5f-a866-fa96-e84f-4088a97c2013.png)
それぞれが何を意味しているのか見ていきましょう。

### Moving button Visuals
GameObject型のSerializeFieldで、`ButtonContent`というオブジェクトがアタッチされています。
Toolboxから出した状態では`ButtonContent`オブジェクトはただの空のGameObjectです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/2da533f3-cd1f-9c63-1cd6-6be790d7ce1a.png)

ボタンを押したときに動いてほしいオブジェクトをここに指定してあげると良さそうです。


### Start Push Distance
読んで字のごとく、「ボタンを押したと判断する面」がボタン中心からどれだけ離れているかの距離です。
Gizmoでは水色の面で表現され、これに触れると`Touch Begin`イベントが発生します。

### Max Push Distance
ボタンを押したときに`MovingButtonVisuals`のオブジェクトが動く最大距離です。
Gizmoの青い面で表現され、これが負の数値だと`Touch Begin` `Touch End`イベントは発生しても、`Button Press` `Button Release`イベントが発生しなくなります。正の数値にしておきましょう。

### Press Distance
「ボタンが押された」とみなすまでの距離です。`Touch Begin`イベント後、`Button Pressed`イベントが発生するまでの押し込み量とも言えるでしょう。Gizmoの黄色い面です。
これを大きめにすることで、いわゆる「軽く触っただけでは反応せず、深く押し込まないといけないボタン」になるでしょう。

### Release Distance Delta
`Button Pressed`イベント後、どのくらいボタンから指を離せば`Button Released`イベントが発生するかの距離です。Gizmoの赤い面で表現されています。

### Return Speed
ボタンから指を離したのち、`Moving button Visuals`のオブジェクトが元の位置に戻る際の速さです。
数値が小さいほど、ゆっくり戻ります。

### Release On Touch End
通常、イベントは`Touch Begin`→ `Button Pressed`→ `Button Released`→ `Touch End`の流れで起こりますが、処理落ちなどによって`Button Release`イベントが発生し損ねるかもしれません。このフラグがセットされていると、その場合にも`Touch End`イベントで`Button Release`イベントを発生させるようになります。
つまり、`Button Released`イベントの発生保証と言えるでしょう。

### Enforce Front Push
ボタンが前からしか押せないようにします。

### Events
このボタンのイベントです。
`Button Pressed`および`Button Released`イベントで音を発生させる他、各イベントで`PhysicalPressEventRouter`コンポーネントのメソッドも呼んでいるようです。（後で詳しく解説します）
この部分は、Unityの標準GUIのボタンと同じように、任意のメソッド呼び出しを登録できるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/420886ed-6e3e-9b51-b40e-706853a8eb09.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/555e03b6-bcaa-bc1f-4280-db4f7c48bfd3.png)

### Moving Button Icon Text
ボタンを押したときに連動して動く、ボタンのアイコンやテキストのオブジェクトを指定します。
[Moving button Visuals](#moving-button-visuals)で押したときに動いてほしいオブジェクトを指定していましたが、アイコンやテキストはそれとは別で指定できるようになっているようです。
こちらはボタンを押したときに`Moving button Visuals`オブジェクトの移動量の半分だけ動くようになっています。（アイコンや文字が激しく動きすぎないようにしている？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/bc74d71e-4b10-7f97-5143-34fba593a30c.png)

### Compressable Button Visuals
ボタンを押したときに潰れるオブジェクトです。同名のGameObjectがあり、輪郭だけ描画するマテリアルをつけた`FrontPlate`というCubeと、指を近づけたときに光る`HighlightPlate`というQuadで構成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/2211011b-451f-5550-4471-5352fe4b48b7.png)

[Moving button Visuals](#Moving-button-Visuals)は単純に移動するだけですが、こちらは押した動きに連動してZ軸に伸縮します。
![CompressableButtonVisuals.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/2284b774-5e25-23f9-2a6e-bd02326ac916.gif)

### Min Compress Percentage
ボタンを押しきったときに、[Compressable Button Visuals](#compressable-button-visuals)で指定したオブジェクトが元の何パーセントまで潰れるかを設定できます。↑のGIFでZ軸のスケールが0.25～1で変化しているのが見てわかるでしょうか。
ちなみに'Percentage'とありますが、最大値は1です。

### Highlight Plate
ボタンにフォーカスしたときにハイライトする部分を指定します。
[Compressable Button Visuals](#compressable-button-visuals)に指定したオブジェクトの子にある`HighlightPlate`オブジェクトがアタッチされています。
![HighlightAnimationTime.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/51b639e2-8a79-706d-2d97-f8aac6a24849.gif)

### Highlight Plate Animation Time
フォーカスしたときにのハイライト表現を、何秒かけて行うかの設定です。

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/f7a74274-1d5b-a531-cf2b-9082e5e78d0f.png)


### Button State
これはボタンの状態確認用の表示です。

- Current Push Distance：ボタンをどのくらい押しているのか
- Touching：ボタンに触れているか
- Pressing：ボタンを押しているか

### Editor Settings

エディタの設定です。

- Show Button Event Planes  
`Moving button Visuals`などの設定をGizmoで可視化するか
- Make Planes Editable  
`Moving button Visuals`などの設定をドラッグでできるようにするか（有効にすると、Sceneビューで面の端をドラッグして調整できるようになります）  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/09f6ddd2-f667-0bb8-fc8c-aed992409550.png)


## PhysicalPressEventRouter コンポーネント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/b2d8ede5-af1c-fa04-8597-4f47ecb9b72d.png)
このボタンにおける`PhysicalPressEventRouter`コンポーネントの役割は、`PressableButtonHololens2`コンポーネントと、後述する`Interactable`コンポーネントの橋渡しをすることです。

### Routing Target
`PressableButtonHololens2`コンポーネントに連動させる`Interactable`コンポーネントを指定します。

### Interactable On Click
`PressableButtonHololens2`のどのイベントを`Interactable`コンポーネントの`On Click`イベント発生のトリガーにするかを選択できます。

- Event On Click Completion  
`PressableButtonHololens2`の`Button Released`イベント（ボタンを押して、離す）をトリガーにします。
- Event On Press  
`PressableButtonHololens2`の`Button Pressed`イベント（ボタンを押す）をトリガーにします。
- Event On Touch  
`PressableButtonHololens2`の`Touch Begin`イベント（ボタンに触れる）をトリガーにします。

## Interactable コンポーネント
`Interactable`コンポーネントは、あらゆるオブジェクトをインタラクション可能にする、オールインワンなコンポーネントです。
[公式ドキュメント](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/README_Interactable.html)がかなり詳しくまとまっていますので、必読です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/6f65be77-d055-7201-3d64-f3edd1cb75b5.png)

Inspectorは大きく３つのセクション（General, Profiles, Events）に分かれています。
それぞれ見ていきましょう。

---

### General セクション
#### States
ボタンがどんな状態を持つかを定義されている、ScriptableObjectです。
このボタンだと`FocusPressTouchGrabStates`がアタッチされていますが、その中身は下図の通り。`Pressed`、`Disabled`など、たくさん種類が定義されています。ここに定義されている７種類の状態を、このボタンが取りうるということが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/8716b680-4f71-9382-b03e-43e49aa0637c.png)

#### Enabled
このボタンが有効かどうかのフラグです。コード上では`Interactable.IsEnabled`でアクセスできます。

>「じゃあボタンを押させたくない時はenabled = falseすればいいんだな」と思いますよね？それはそうなんですけれども、もっといい方法があります。

ボタンをただ無効にしたいときは`Interactable.IsEnabled = false`を使いましょう。
`MonoBehaviour.enabled = false`をしたときはクラス内の全てが無効化されますが、`Interactable.IsEnabled = false`を使うと、基本的な見た目の更新を維持しつつ、`On Pres`入力のみ無効化し、Disabledステート（[前述](#states)のStatesの一種）に移行させることができます。
これとビジュアルテーマ（後述）を使うと、例えば「無効化したボタンは背景を暗くして、押せないことが一目見てわかるようにする」ような表現が簡単にできるようになります。


#### Input Actions
このボタンがどんな入力に反応するかの設定でで、このボタンでは`Select`が設定されています。
この`Select`とは、`MixedRealityToolkit > Input > Input Actions`で定義されたActionです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/106785ce-65d0-d49a-52a7-09b897dbc60a.png)

`MixedRealityToolkit > Input > Gestures`で、タップ操作を`Select`に紐付けています。**要するに、タップすれば`Select`入力になるようになっています。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/c5b2ac88-3ae6-9e65-9ae9-6ad74c8cf888.png)

#### Is Global
`Input Actions`でどんな入力に反応するか設定してありますが、`Is Global`はその入力がこのオブジェクトに対して行われていなくても入力を受け取るようにする設定です。
このボタンで例えると、`Is Global`が有効ならシーン内のどこをエアタップしてもボタンが反応するようになります。（あまり使うことはない設定かも）

#### Speech Command
`Input Actions`ではどんな入力に反応するか設定しましたが、こちらはどんな音声入力に反応するかを設定できます。
「Select」と発声することで、このボタンにインタラクションできるということです。

音声入力の設定は`MixedRealityToolkit > Input > Speech`にあります。
この設定のドキュメントは[こちら](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/Input/Speech.html)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/7b91fd25-99ca-97ad-540f-5e9f2b78d8ce.png)

#### Require Forcus
フォーカスしたときにのみ音声入力を受け付けるかの設定です。これがTrueであるということは、ポインターなどでボタンにフォーカスした上で「Select」と発声することでインタラクション可能だということになります。
`Speech Command`版、`Is Global`設定と言えるでしょう。（フラグのつけ方は逆ですが）

#### Selection Mode
このボタンがどんなボタンなのかの設定です。

- Button：ただのボタンです。このボタンではこちらが選択されています。
- Toggle：トグルボタンです。On/Offの二つの状態を持ちます。
- Multi Dimension：複数の状態を持つボタンです。

---

### Profiles セクション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/dbf2fdd1-c37a-5e8e-589d-731aad095ef7.png)

`Profiles`は、インタラクションによって起こるStateの変化に対して、どんなビジュアルの変更をするかを設定できます。

#### Reset On Destroy
このコンポーネントが削除された時、変更した内容を元に戻すかどうかの設定です。

#### Target
ビジュアルの変更をするGameObjectを指定します。

#### Theme
ビジュアルの変更内容について定義した`Theme`型のScriptableObjectを指定します。

#### 設定済みのビジュアルテーマの解説１：SeeItSayItLabel
このボタンにあらかじめ設定されているProfilesを解説していきます。
まずは`HolographicButtonSeeItSayItLabel`テーマから。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/6f5644c0-d937-1afa-3ab5-677f1733c07c.png)
ざっくり言うと、ここで設定している動作は以下のような感じです。

- Stateが`Focus`になったときに、`SeeItSayItLabel`オブジェクトのScaleを（1, 1, 1）にする動作を開始する（赤枠）
- `Duration`秒後（１秒後）にこの動作を完了する（黄枠）
- ジャスト`Duration`秒に到達するまでScaleは変化させない（黄枠）

実際に、ボタンにフォーカスした１秒後に「SeeItSayItLabel」オブジェクトのScaleが変化しているのが分かるでしょうか。
この動きは、ユーザーに「このボタンは音声でインタラクションできるよ」というのを伝える目的がありそうです。
![SeeItSayItLabel.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/d1329ca0-0a0c-c685-de29-52b429cd8ec7.gif)

#### 設定済みのビジュアルテーマの解説２：FrontPlate

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/899da2e3-7898-64a7-bfdb-f5521b469a68.png)

もうお分かりですね？このProfileの動作は以下のようなものです。

- Stateが`Pressed`になったとき、`FrontPlate`オブジェクトをZ軸に0.008m動かす
- 0.03秒かけて、ゆっくりと変化を適用する

[`Compressable Button Visuals`](#Compressable Button Visuals)で、押したボタンがZ軸に伸縮するのは説明しましたが、単純にポインターを使ったときはその動きはありません。そのときにボタンの挙動が不自然にならないように、ここでポインターでボタンを押したときの動きを定義しているようです。

![FrontPlate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/1a8077cb-bd9d-127b-75db-6222dcda5995.gif)

#### 設定済みのビジュアルテーマの解説３：UIButtonSquareIcon

最後に`PressableButtonIcon`テーマです。テーマ名からして、汎用的にボタンに使うことを想定していそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/f4ac522d-726d-dfbc-369b-338d26f5713f.png)

このテーマは、`Focus`と`PhysicalTouch`で異なる動きをするようになっています。

- Stateが`Focus`になったとき、`UIButtonSquareIcon`オブジェクトをZ軸に-0.002m動かす
- Stateが`PhysicalTouch`になったとき、`UIButtonSquareIcon`オブジェクトをZ軸に-0.0005m動かす
- 瞬時に変更を適用する（`Easing`を使用しない）

---

### Events セクション

Unity標準GUIでおなじみの`On Click`イベントにメソッドを登録できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/41fb9bb1-bb89-894e-11e6-dc244402eebd.png)

#### Receivers
`Receivers`を展開すると、さらに細かくフォーカス時などのイベントにメソッドを登録できます。
登録されているメソッド群を見ると、ボタンにフォーカスしたときにボタン表面にハイライトが入るようにしている他、ボタンを押したときに音を鳴らしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/9dfb8410-fef6-ed05-e007-d4247d293556.png)

しかし、ボタンを押したときに音を鳴らすのは、`PressableButtonHololens2`コンポーネントのイベントでもやっていました。これは同じことを二重にやっているのではなく、`PressableButtonHololens2`の方ではNear Interaction（指で押すなどの近接的な入力）、`Interactable`の方ではFar Interaction（ポインター＆エアタップなどの遠距離からの入力）のPressイベントに対応させているのです。

#### Interaction Filter
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/4142c337-1ff8-88d8-203e-04e685ee5e08.png)
On Press系のReceiverを扱うときのみ、それがFar InteractionなのかNear Interactionなのかをフィルタリングできます。
>しかし、ボタンを押したときに音を鳴らすのは、`PressableButtonHololens2`コンポーネントのイベントでもやっていました。これは同じことを二重にやっているのではなく、`PressableButtonHololens2`の方ではNear Interaction（指で押すなどの近接的な入力）、`Interactable`の方ではFar Interaction（ポインター＆エアタップなどの遠距離からの入力）のPressイベントに対応させているのです。

「これを`Near And Far`すればイベント登録が一回で済むじゃん」というのはそうなのですが、わざわざ`Far Only`にして別々にイベント登録しているのは、`PressableButtonHololens2`の方ではボタンを背面から押せないようにする`Enforce Front Push`という設定がありましたが、`Interactable`にはその区別がなく、背面からでも`OnPress`イベントが発生してしまうからだと思われます。（より現実的な動きに準ずるためにこのようにしている？）

## Audio Source コンポーネント
音の発生源となるコンポーネントです。このボタンでは、ボタンを押したときに音を出すのに使用しています。
`AudioSouce`コンポーネントを大量に配置するのは負荷的によろしくないので、ある程度数が多くなってきたら、効果音発生用のAudioSourceを用意して統括的に音を出した方がいいかも知れません。

参考：[【Unite Tokyo 2018】Audio機能の基礎と実装テクニック](https://www.slideshare.net/UnityTechnologiesJapan002/unite-tokyo-2018audio)


## NearInteractionTouchable コンポーネント
Near Interaction（指で押すなどの近接的な入力）をするために必須のコンポーネントです。
実際にこのコンポーネントがついていないと、`PressableButtonHololens2`コンポーネントに警告が表示されます。
警告に従ってボタンをポチポチ押せばパラメータを設定してくれるので、特に設定で困ることはありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/8e323310-5c2a-618c-ce88-3c47384287ec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/27a1f800-757f-3220-c5d0-492eefb3ad32.png)
例えば`Local Forward`はボタンの向きの設定で、`PressableButtonHololens2`の[前からのみボタンを押せるようにする設定](#enforce-front-push)に使われたりします。


## Button Config Helper コンポーネント
最後のコンポーネント、`ButtonConfigHelper`はMRTK v2.4で追加されました。
名前の通り、ボタン名やイベント登録、アイコン設定などを補助してくれます。
`Labels`,`Basic Events`,`Icon`のセクションに分かれており、`Show Component References`を有効にすることで、実際に紐付けられているオブジェクトのSerializeFieldが見えるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/9b0f892c-df7b-6772-6c70-68b3c4d1de13.png)

### Labels セクション
ボタンのテキストをここでまとめて変更できます。`Enable *`のチェックを外せば、そのオブジェクトを非アクティブにできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/53d07c27-bfa5-5197-ee05-a69af88a1f39.png)

### Basic Events セクション
ここにイベントを登録すれば、`Interactable`コンポーネントの`On Click`イベントに登録されます。登録を解除すれば、`Interactable`の方でも登録解除されます。便利！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/94d3aaf8-a4d7-bcbc-a626-3d8f3c3c17ad.png)

### Icon セクション
ボタンのアイコンを変更できます。
既定のアイコンから選べるほか、任意のフォントを追加して使うことができるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/d84dadbf-9ee5-d691-e18f-57455c8e7b80.png)

参考：[MRTKでボタンのアイコンセット（IconSet）を作成してアイコンの見た目を変更する](https://bluebirdofoz.hatenablog.com/entry/2020/10/25/222944)

---

以上でこのボタンの解説は終了です。（長かった...）

# 参考

- [Button (ボタン) | Mixed Reality Toolkit Documentation](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/README_Button.html#pressable-button-%E6%8A%BC%E3%81%97%E3%83%9C%E3%82%BF%E3%83%B3-%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)
- [入力シミュレーション サービス (Input Simulation Service) | Mixed Reality Toolkit Documentation](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/InputSimulation/InputSimulationService.html)
- [Speech (音声) | Mixed Reality Toolkit Documentation](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/Input/Speech.html)
- [Interactable (インタラクタブル) | Mixed Reality Toolkit Documentation](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/README_Interactable.html)
- [Visual themes | Mixed Reality Toolkit Documentation](https://hololabinc.github.io/MixedRealityToolkit-Unity/Documentation.ja/VisualThemes.html)
- [Class PhysicalPressEventRouter | Mixed Reality Toolkit Documentation](https://microsoft.github.io/MixedRealityToolkit-Unity/api/Microsoft.MixedReality.Toolkit.PhysicalPressEventRouter.html)
- [MRTKでボタンのアイコンセット（IconSet）を作成してアイコンの見た目を変更する](https://bluebirdofoz.hatenablog.com/entry/2020/10/25/222944)
- [【Unite Tokyo 2018】Audio機能の基礎と実装テクニック](https://www.slideshare.net/UnityTechnologiesJapan002/unite-tokyo-2018audio)
- [MRTK Standard Shader | Mixed Reality Toolkit Documentation](https://microsoft.github.io/MixedRealityToolkit-Unity/Documentation/README_MRTKStandardShader.html)