複合現実を使って部屋をコムウェアカラーで一杯にする！

この記事は[NTTコムウェア Advent Calendar 2023](https://qiita.com/advent-calendar/2023/nttcomware) 1日目の記事です。

# はじめに
NTTコムウェアの掛内です。

今年は翔泳社様から[動かして学ぶ！Flutter開発入門](https://www.shoeisha.co.jp/book/detail/9784798177366)を出版させて頂いたり、生成系AIで画像や文章を作っていたりしたので、これらのネタにしようかとも思ったのですが、約2ヶ月前にMetaQuest3が発売され、新しいおもちゃを手に入れてしまったので、MetaQuest3もUnityも使ったことが無いのですが、MR(複合現実)についての記事を書いてみたいと思います。

## デモ
まず、最初に今回作成したもののデモをお見せしたいと思います。
※Qiitaに直接動画を埋め込めないため、Xへのリンクとなっております。

https://twitter.com/i/status/1728401659947372580

複合現実を使って、自分の部屋に球や立方体をたくさん発射して一杯にしてみました！

今回は、これを何もない状態から作っていきたいと思います！！

# 基本用語
まず、基本的な用語を確認します。

## MR
MRはMixed Realityの略で、複合現実と呼ばれます。
MRは、現実空間上に仮想空間のオブジェクトなどを配置する技術で、現実と仮想の両方が複合されて可視化されます。
実現には、MRに対応したヘッドセットを用います。ヘッドセットが現実世界の空間の形状を認識し、ホログラムを合成して投影することで実現します。

似たような技術にVRとARがありますが、MRはVRとARを組み合わせた中間のような位置づけです。
* VR(Virtual Reality) : 仮想現実
    * 現実世界の情報は利用せずに、仮想空間を作りその中で情報を可視化します。
* AR(Augmented Reality)：拡張現実
    * 現実世界をベースに、情報の付与を行います。

## MetaQuest
MetaQuestは、Meta社が開発したVRヘッドセットです。
MetaQuestには、MetaQuest2、MetaQuest3、MetaQuestProという種類があり、[公式サイト](https://www.meta.com/jp/quest/compare/) で比較情報が提供されています。

MetaQuest3は2023/10/10に発売され、MetaQuest2と比べてMR機能が大幅に強化されています(もちろんVRも使えます)。
MetaQuestには、パススルー(周囲の環境をリアルタイムに見ることができる機能)があり、これを使い現実世界の情報をヘッドセットに投影し、なおかつホログラムを合成することで、MRが実現できます。


## Unity
Unityは、UnityTechnologiesが開発しているゲームエンジンです。2D/3DのゲームをC#を用いて開発することができます。
PC/モバイル/VR・MRデバイスなどのクロスプラットフォームに対応しており、MetaQuestにUnityで開発したアプリケーションをインストールすることで、MRアプリを作ることもできます。
なお、類似製品には、Unreal Engineがあります。


# アプリの作成
## 概要
今回は自身初めてのMRということで、初歩的なところで、MetaQuest3を使って何かオブジェクトを部屋に置けるところを目指しました。具体的には、コムウェアカラーの球と立方体にカウンタを付けて発射し、自分の部屋を何個で一杯にできるかやってみました。
※完成したものは、記事冒頭のXの動画になります。

::: note alert
記事執筆のタイミングにおいて、製品そのものが発売されたばかり、かつ、インターネット上にノウハウが少ない先進的なものを取り扱っているため、最新の正確な情報は、公式サイト等でご確認ください。
:::

## 1.MetaQuest3を動かす
まず、[公式サイト](https://www.meta.com/jp/quest/quest-3/)でMetaQuest3を購入します。
※私の場合は、10/20に注文し商品到着予定日が10/31になっていたのですが、10/25に予定より早く届きました。

開封後に、ヘッドセットの初期設定と公式アプリ(Meta Quest)のインストールを行います。購入した箱に、QRコードが付いており「Scanして開始」とありますので、読み込んで表示される手順に従ってセットアップします。

## 2.開発環境を準備する
まず、[UnityHub](https://unity.com/ja/download)をダウンロードしインストールします。
その後、UnityHubのサイドメニューのインストールを選択し、「エディタをインストール」をクリックして、Unityをインストールします。

なお、開発時の環境のバージョンは、下記のとおりです。
* UnityHub:3.6.0
* Unity:2022.3.12f1

続いて、スマホアプリの方でヘッドセットの設定から開発者モードを選択し、有効にします。

さらに、MetaQuestの開発者になるために、組織を作成しアカウントと紐づけます。[こちらのURL](https://developer.oculus.com/manage/organizations/create/)から作成ができます。

なお、[Meta Quest Developer Hub](https://developer.oculus.com/meta-quest-developer-hub/)を利用すると、ヘッドセットの状況が詳しく確認できるため、インストールしておくと良いかと思います。

## 3. MetaQuest3とPCをつなぐ
MetaQuest3とPCを繋ぐ方法は、有線(QuestLink)と無線(AirLink)の両方があります。
[デスクトップアプリ(Windows)](https://www.oculus.com/download_app/?id=1582076955407037)をインストールし、ペアリング画面まで進めたあとに、MetaQuest3側でクイック設定からQuestLink(またはAirLink)を有効にします。

::: note warn
自分の環境ではQuestLinkもAirLinkもどちらも認識がされず、困った状態になりました。

QuestLinkの方では、かろうじてPC側でドライブとしては認識できていたので、接続自体はできていたようでした。
そのため、[SideQuest](https://sidequestvr.com/) というツールを使って接続とアプリの転送を行いました。
※今回は、本流からそれるためSideQuestについては掘り下げません。
:::

## 4. Unityでアプリを作る
今回は、ゼロから作るにはあまりに時間がかかりそうだったため、[こちらのテンプレート](https://qiita.com/noritsune/items/8b1ef9e99e668916e202)を利用させて頂きました。
Githubからクローンした後に、[README.md](https://github.com/noritsune/quest-mr-template)に従って、Unityで該当プロジェクトの設定や必要なライブラリのインポートを行います。


元々のプログラムでは、カラフルな無地の球と立方体が飛び出るようになっていますが、下記の修正を入れます。

1. 色を指定する
    * Assets/App/ObjectLauncher/ObjectLaunchers.csで球と立方体の色をコムウェアのロゴに使われている、白と緑のカラーコードに固定します。
    * [UnityのColor](https://docs.unity3d.com/ja/2021.2/ScriptReference/Color.html)は、0-255ではなく、0-1でRGBを指定するのに気がつくまで、意図した色がでず一瞬躓きました。
2. カウンタの文字を入れる
    * TMP(TextMeshPro)を使ってballとCubeに、カウンタの文字を貼ります。
    * 緑のオブジェクトには白、白のオブジェクトには緑のカラーコードを指定します。
    * 球のカウンタは、きれいに文字を貼るためには曲げたほうが良いのですが、やってみたらそこまで違和感はなかったので、今回は妥協しました。
    * ObjectLaunchers.csの中でカウンタを持ち、発射のタイミングでカウンタをインクリメントしてTMPの文字を更新して表示します。
3. サイズを変更する
    * 小さいとなかなか部屋がいっぱいにならないので、Assets/App/ObjectLauncherのballとCubeのサイズをデフォルトより大きくしました。

## 5. 動作確認をする
作ったアプリを、Androidアプリ(APKファイル)としてビルドします。
その後、(今回は直接転送ができなかったので)SideQuestを使って、apkファイルをPCからMetaQuest3に転送します。
MetaQuest3側では、アプリライブラリから、提供元不明アプリの該当のアプリを選択すると起動できます。

# 所感
* MetaQuestやUnityを全く使ったことがなくても、1週間もあればこういうのができることに感動しました
* オブジェクト間や部屋(境界線)との物理演算も思った以上にいい感じ
* 途中QuestLink/AirLinkが使えない部分があるなど、うまく行かない時のトラブルシュートの情報がまだまだ少ないので、困ったときの解決に時間がかかりそう
* VR/MRに慣れていないのか、終わったあとに眼精疲労っぽい症状がたまにでました。
    * 単に遊びすぎかもでしれません(笑)
---
記載されている会社名、製品名、サービス名は、各社の商標または登録商標です。