Unity VR開発で3Dモデルをシミュレーターで動かす

# はじめに
UnityでVR開発をしていて、プレイヤーの位置にアバターを表示する方法と、
VRデバイスではなく、PC操作により、VR操作をするための方法を調べたので記事にします。


https://www.moguravr.com/xr-kaigi-2022-20/

# シミュレーターについて
シミュレーターだけ知りたいという方のために、先にシミュレータについて書きます。

調べたところ、以下の二つが該当しました。
- [MRTK](https://learn.microsoft.com/ja-jp/windows/mixed-reality/mrtk-unity/mrtk2/?view=mrtkunity-2022-05)
- [XR Interaction Toolkit](https://docs.unity3d.com/ja/Packages/com.unity.xr.interaction.toolkit@2.0/manual/index.html)の[XR Device Simulator](https://docs.unity3d.com/ja/Packages/com.unity.xr.interaction.toolkit@2.0/manual/xr-device-simulator.html)

今回の記事では、XR Interaction Toolkitを使う方法を紹介します。

### 手順
- Package Manager - Unity Registry - XR Interaction Toolkitをインストール
![スクリーンショット 2024-07-05 182631.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/09377531-ac41-5b2c-e850-f3310dba2c1f.png)
- SamplesのStarter AssetsとXR Device Simulationをインポート
![スクリーンショット 2024-07-05 182643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/4d209f67-0e7f-5d70-f219-b546cc6085c7.png)
- Assets/Samples/XR Interaction Toolkit/{version}/Starter Assets/Prefabs/XR Interaction Setup.prefabをシーンに配置する
- Assets/Samples/XR Interaction Toolkit/{version}/XR Device Simulator/XR Device Simulator.prefabをシーンに配置する

これで実行するとシミュレーション操作ができます。
（シーンにMainCameraが配置されている場合は消しておきましょう）

# VRで3Dモデルを動かす
VRで3Dモデルを動かす方法で、ヒットしたのがFinalIKという有料のアセットを使用する記事でした。
本格的に開発するにはFinalIKを使用するのがよさそうでしたが、私の場合、VR開発の学習をしたいだけなので、有料のものを買うのは嫌だなと思いました。

FinalIKについての参考記事

https://orotiyamatano.hatenablog.com/entry/FinalIK

https://zenn.dev/hanchavr/scraps/e5d1db3e96adca

さらに調べたところ、以下の記事を見つけました。

https://qiita.com/lain_xr/items/56b8e68750f24a415994

https://note.com/syusyabansyu/n/naf4ce53dd813

これはよさそうと思い、試させていただいたところ、動作確認まで出来たました！（感謝）
本記事では、上記の参照記事をベースにしつつ、
- 3年前の記事なので、多少変わっている部分があること
- ユニティちゃんで試したかった
- 詰まったところがあった
など、整理も兼ねて記事にしました。

## 実装方法
### XR Interaction Toolkitをインポートする
[シミュレータについて](#シミュレーターについて)を参照し、XR Interaction ToolkitのStarter AssetsとXR Device Simulationをプロジェクトにインポートします。

### ユニティちゃんをインポート
- アセットストアからユニティちゃんの3Dモデルをダウンロードし、プロジェクトにインポートします

https://assetstore.unity.com/packages/3d/characters/unity-chan-model-18705

### Animation Riggingをインポート
Package ManagerからAnimation Riggingをインポートします
![スクリーンショット 2024-07-05 170446.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/916056e2-f383-9a65-4b68-b8a8ba674f93.png)

### シーンに配置
- Assets/Samples/XR Interaction Toolkit/2.5.4/XR Device Simulator/XR Device Simulator.prefabをシーンに配置します
- Assets/Samples/XR Interaction Toolkit/2.5.4/Starter Assets/Prefabs/XR Interaction Setup.prefabをシーンに配置します
- Assets/unity-chan!/Unity-chan! Model/Prefabs/unitychan.prefabをXR Interaction Setup - XR Origin（XR Rig）の下に配置します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/c5f0f6dc-2eb3-eba1-f248-f0d64a95121d.png)

### アバターの設定
アバター（本記事ではUnityちゃん）の設定を行います。

- まずアタッチされているスクリプトとAnimatorを削除します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/8201dab2-9ac7-a77a-4b21-b4ce78588d02.png)

- 続いて、アバターにRig BuilderをAdd Componentします
![スクリーンショット 2024-07-05 170601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/42ee05b0-82f7-b869-19d9-cf37bb6d76e1.png)

- 続いて、Bone RenderをAdd Componentします（Boneを視覚化してわかりやすくするためです）

![スクリーンショット 2024-07-05 170757.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/f7f3164d-9574-c80d-ff0a-a6171c27f2f6.png)

- 続いて、Avatarのルートを右クリックし、Select Childrenを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/47e60ae7-90e0-0ed8-08be-e9e5419f2038.png)
- 選択したら、Bone RenderのTransformsにドラッグアンドドロップします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/be4bd974-96e4-44ed-1b4c-11265a0e7930.png)

### 右腕の設定
- 次にアバターの子オブジェクトとして、空のオブジェクトを作成します。名前は、VR Constraintsとします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/f86dbfa3-b7ca-0fbc-82c8-3740bb6a4da2.png)

- VR ConstraintsにRigをAdd Componentします
- アバターを選択し、Rig BuilderのRig Layersに、VR Constraintsを設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/e564d649-242e-7f0d-0c9d-6dff1cf4ea55.png)
- VR Constraintsの子オブジェクトとして、空のオブジェクトを作成し、名前をRight Arm IKとします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/ad7191b5-820a-bad7-5ca7-0dd948a968bd.png)
- Right Arm IKにTwo Bone IK ContraintをAdd Componentし、以下のようにUnityChanのBoneを設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/5a07c7d5-731b-6411-3bc4-46aeab00f17f.png)

:::note info
他の3Dモデルでも、腕は以下のように三か所のボーンで構成されているとおもいますので、下記の画像を参照に設定すれば問題なく動作するかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/3c04f092-a48d-9496-d191-c0de624b03ac.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/ae546493-ae1b-8b12-f6cf-cb5f16745fb9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/750f6067-6ec3-86a5-0e2e-32925fd1c8ca.png)

:::

- 続いて、Right Arm IKの子オブジェクトに、TargetとHintという空のオブジェクトを作成し、Two Bone IK ContraintのTargetとHintにそれぞれ設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/9010951d-ab19-be91-a76b-4a8fb47d70d2.png)

- 続いて、TargetとTwo Bone IK ConstraintのTipに選択した部位を選択し、Animation Rigging - Align Transformを押下します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/2c2ce466-a500-f411-5cf6-bcc77183c24c.png)

この設定を行うことで、Targetに右手が追従することになります。

- 続いて、HintとTwo Bone IK ConstraintのMidに選択した部位を選択し、Animation Rigging - Align Transformを押下します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/bdd15928-6625-3bea-6c3b-27d7881b7e0c.png)

### 頭の設定
- VR Constraintsの子オブジェクトに空のオブジェクトを追加し、Head Constraintという名前にします
- Head ConstraintにMulti Parent ConstraintをAdd Componentし、Constrainted Objectにアバターの頭を設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/9b6f6c0f-1c22-66b1-fc29-dfa17961abc8.png)

Source ObjectsにHead Constraintを,アタッチします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/f1b182fb-1e1d-4c1b-5b41-2b618bc47f2d.png)


- Head Constraintとアバターの頭を選択してAlign Transformします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/4bc0091e-c49d-a508-bfa8-52cf47c5b518.png)

### スクリプトの設定
- [こちら](https://qiita.com/lain_xr/items/56b8e68750f24a415994)の参照記事のVR Rigというスクリプトをコピーして、アバターにAdd Componentします
― 下記のように設定します（Offsetについては適宜調整してください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/d916f8cd-9835-e84a-6e36-e620277da320.png)