【Unity】VR Multiplayerテンプレートを使ってみる

## はじめに
※この記事は、[3D都市モデル Project PLATEAU Advent Calendar 2024](https://qiita.com/advent-calendar/2024/plateau)の10日目の記事です。

先日、[PLATEAU XR ＆ デジタルツイン ハッカソン2024](https://izumo-driven-development.connpass.com/event/325091/)に参加して、PLATEAUのデータを使ったVRマルチプレイ陣取りゲーム「[島根っ化大作戦 vs 鳥取ビジョン](https://protopedia.net/prototype/6204)」を作りました。その際にUnityのVR Multiplayerテンプレートを使ってみたのですが、便利だったので使い方を書いていこうと思います。
 
## 環境
* Windows 11 Home
* Unity6000.0.25f1
* Meta Quest2, Meta Quest3
* Muitiplayer Play Mode v1.3.1
* PLATEAU SDK for Unity v3.1.1 alpha

## VR Multiplayerテンプレートについて
Unityのプロジェクト作成時に選択できるテンプレートで、これを使うとVRマルチプレイ用の設定がされた状態で開発を始めることができます。

## プロジェクト作成
以下の手順でプロジェクトを作成します。

1. エディターバージョンが`6000.0.22f1`以降が選択されていることを確認
1. VR Multiplayerテンプレートを選択する
1. 「Unity Cloud に接続」にチェックを付ける（デフォルトで付いているはず）
1. 「プロジェクトを作成」ボタンを押す

※エディターバージョンについては、後述する`Muitiplayer Play Mode`の対応しているバージョンが`6000.0.22f1`以降になっているためです。また、マルチプレイの実行のためにUnity Cloudに接続しておく必要があります。

![スクリーンショット 2024-11-11 092804-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621034/2124bf47-fe2c-0a9c-e6d7-abacc1444465.png)

### ビルドしてみる
`ファイル > ビルドプロファイル`を開いてAndroidを選択します。Quest3を接続して、「ビルドして実行」を押します。

![スクリーンショット 2024-12-06 143225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621034/c101e099-92b1-c6a1-daf9-fa8863fc0f19.png)

Quest3を着けて確認すると、ルーム作成を促され、ルームに入室成功するといくつかのサンプルゲームを遊べるようになっています。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621034/b1b8ef72-c20d-b0dc-ec5f-c398af086cb0.jpeg">

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621034/b697c5ea-c24d-a3ea-81fe-d4795bc6d958.jpeg">

一度エディターに戻って、シーン内にPLATEAUのモデルを配置してみます。
（PLATEAUモデルの取り込み方は[PLATEAU SDKの使い方](https://project-plateau.github.io/PLATEAU-SDK-for-Unity/index.html)を参照）

もう一度ビルドして確認してみます。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621034/a8ccbae5-29bd-0c5f-510a-ece6211b842f.jpeg">

PLATEAUのモデルが表示できています。
手持ちにQuest3が複数台なかったので、Quest2とマルチプレイしてみましたが問題なく成功しました。（片方がルームを作成して、もう片方がルームIDを入力して入室）

## テストプレイを手軽にする
このままだと、テストプレイをしたいときに毎回ビルドしてから実行するというプロセスを経ることになります。Quest Linkで接続してエディター上で実行するという手もありますが、これではマルチプレイのテストができません。

そこで、`XR Device Simulator`と`Muitiplayer Play Mode`を使ってエディター上でマルチプレイのテストができるようにします。

### XR Device Simulator
まずVRヘッドセットを着けなくてもテストプレイできるようにします。
そのために`XR Device Simulator`を使うのですが、VR Multiplayerテンプレートには既に入っています。

`Assets/Samples/XR Interection Toolkit/3.0.6/XR Device Simulator/`にある`XR Device Simulator`プレハブをヒエラルキーに配置してからエディター上で実行してみてください。マウスとキーボードで操作できるようになっています。

![スクリーンショット 2024-12-07 170704.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621034/fc9a4412-96b9-0f55-a0ee-a8d280c9b484.png)

`Tabキー`でHMD、左手コントローラ、右手コントローラの操作を切り替えることができます。


### Muitiplayer Play Mode（MPPM）
Muitiplayer Play Modeを使うことで、メインのエディタープレイヤーに加えて最大3人の仮想プレイヤーを同時に実行できます。

まず、パッケージマネージャーのUnityレジストリから`MultiplayerPlayMode`をインストールします。

![スクリーンショット 2024-11-11 092804.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621034/e8f34fde-8d75-2566-4a9d-035549ecd7f7.png)

`ウインドウ > Multiplayer > Multiplayer Play Mode`を開いて、「Add Tags to Player」で各プレイヤーにタグをつけます。

![スクリーンショット 2024-11-26 170929.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621034/70670681-5137-6f0b-baaf-6388f048bde4.png)

プレイヤー名の左にあるチェックボックスをオンにすると状態がActiveになり、そのプレイヤーのウィンドウが立ち上がります。その状態で実行すると、エディタープレイヤーとアクティブな仮想プレイヤーで同時にテストプレイできます。

![スクリーンショット 2024-11-26 142318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621034/a28ac9c6-57ad-3e55-ca82-732cc794b06f.png)

![スクリーンショット 2024-11-11 105803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621034/8ab07c9e-b229-d002-5e78-4880f6bda020.png)

## まとめ
以上、VR Multiplayerテンプレートの使い方とテストプレイを手軽にする方法でした。

VRやマルチプレイのアプリを作るとなると複雑な設定が必要なイメージでしたが、このテンプレートを使うと簡単にできてしまいます。これにPLATEAUのデータを使ってコンテンツを作ってみるのも面白いのではないかと思います。

なお、マルチプレイには`Netcode for GameObjects`が使われています。この単語で調べるとマルチプレイ実装方法のあれこれがわかるかもしれません。

おすすめ：[Netcode for GameObjectsを使ってみよう - Unityステーション](https://www.youtube.com/watch?v=GRUtGLL8iMQ)

## 参考文献

https://docs.unity3d.com/Packages/com.unity.template.vr-multiplayer@2.0/manual/index.html

https://docs.unity3d.com/ja/Packages/com.unity.xr.interaction.toolkit@2.0/manual/xr-device-simulator.html

https://docs-multiplayer.unity3d.com/mppm/current/about/