【AppleVisionPro】おそらく国内初のAppleVisionPro専用ゲームをリリースしたので開発中大変だったことを紹介します【Unity】

Graffity でUnityエンジニアをやっているcovaです。

この度GraffityからAppleVisionPro専用ゲームである『Ninja Gaze Typing』をリリースしました。

https://apps.apple.com/us/app/ninja-gaze-typing/id6476380797


AppleVisionPro では基本操作が 見て(Gaze)親指と人差し指を合わせること(Tap) によって選択することができます。
このGaze、いわゆるアイトラッキングですが、かなり精度がよく、ちゃんと選択可能なObjectを見ているときにTapしないと選択できないようになっています。

この操作を利用して簡単なタイピングゲームを作りました。

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


開発者インタビューもあるので見てね

https://t.co/IBlAzcaCQz


本記事では、制作にあたり大変だったことを備忘録も兼ねて紹介しようと思います。

# 開発環境
| 項目 | Version |
| --- | --- |
| PC | MacBookPro chip:M2 |
| Unity | Unity2022.3.18f1 |
| PolySpatial | 1.0.3 |
| Xcode | 15.2 |
| visionOS | 1.0 |

# 大変だったこと

## Appleのポリシーで色々取得することができない.

[以前の記事](https://qiita.com/Cova8bitdot/items/5b77a390c12571fea7e8) でも紹介した通り、AppleはVisionPro においてはユーザーのプライバシー保護の観点から様々な情報を開発者に `隠蔽した状態` で提供します。
隠蔽される情報の例としては以下のとおりです

- ユーザーの両手の位置（HandTrackingの座標)
- 視線ベクトル(Gaze)
- カメラ映像(ColorTexture)

これは変に開発者に情報を提供すると、特にカメラ映像とかに関しては映っている人の情報だったりを吸い出せてしまうため、妥当な判断だと思います。
しかしながら、入力値が色々とれなくなるため、かなり工夫しないと従来通りのiPhone/iPad 用ゲームのような開発テクニックは使えません。

その代わり以下のComponent/Classが用意されています

- VisionOSHoverEffect : HoverされるとMaterialの色を白くするコンポーネント
- EnhancedTouchSupport : Objectの選択個数や、Rayがぶつかった先の座標などを返す

今回のゲームは、入力元は取れないが入力後の情報は上記コンポーネントでいくつかはとれるため、それを利用してゲーム開発を進めていきました

## 視線ベクトルの表現ができない
元々VisionPro 向けにゲーム開発を進めてきましたが、プロトタイプは Meta Quest Pro を用いて開発していました。

QuestProは Quest3とは異なり、EyeTrackingの仕組みがあるため、擬似的にVisinoProと同じようなUXを提供できると考え、プロトタイピングを行いました。
その時は視線がどこを向いているかを補助するため、視線ベクトルを LineRenderer コンポーネントで表現していました。

しかしVisionPro ではLineRendererのDestinationこそ、なんとかとれますが、大元の位置がわからず設定できなかったり、そもそもLineRendererが描画されないという課題がありました。

色々試行錯誤しましたが、結果として、これはQuestPro 用の機能と割り切って、VisinoPro 向けには機能をOmitしました。

## 音がバグる
### 起動時にノイズが鳴る
アプリ起動時にブツブツと結構激し目のノイズが発生することがあります。
当時PolySpatial 0.6.3で開発していたこともあり、当初はUnity側のバグだと思っていて、リスクヘッジのためにアプリをこのまま `PolySpatial(Unity)を用いて開発する担当` と `Swiftやったことないけど、頑張って0からUnityで作ったアプリをSwiftに移植する担当` に分かれて開発をしました。

<br>
<br>
<br>
<br>

はい。後者担当でした。

<br>
<br>
<br>
とりあえず会社にあった古いSwiftUIの書籍を握りしめて基礎の基礎から学びつつ、最低限の動作の部分だけSwiftで作ってSimulator で動作チェックをしました。
その結果、なんとSimulator でアプリを起動したときに大きめのノイズが発生しました。

このことから、今回の件はPolySpatial 側ではなくvisionOS側のサウンド処理周りに課題があるということがわかりました。
また、3D制作はUnityの方が慣れていて楽だったため、Swift開発は打ち切りにしてPolySpatialで開発＆リリースしようという決断にいたりました。

※もちろん本バグはAppleさん側にバグレポートとして提出してあります。

### Home画面にいってもBGMが鳴りっぱなし
これはどうやらVisionOS側の仕様です。
visionOSはMacOSと同じ発想でアプリが多重に起動されることを許可しています。そのためiPhone/iPad で出来た OnApplicationPause 系のイベントが発火されないので、Home画面に戻ってもBackgroundでアプリは起動しっぱなしになります。

そのためHomeに戻ってもBGMは鳴りっぱなしだし、ゲーム内のタイマーも進んでしまうということになります。

ゲーム的にはちょっと困るのでAPIのリクエストを投げていますが、最近でたvisionOS1.1のリリースノートを見る分にはバグ修正系が当面は優先されているようです。

https://developer.apple.com/documentation/visionos-release-notes/visionos-1_1-release-notes


# 最後に

紆余曲折ありましたが、開発時期としては昨年10月くらいからで実稼働としては1ヶ月くらいで作った本作です。
色々穴はあると思いますが、VisionPro向けゲームをリリースできたという点では、頑張ってよかったなと思います。

<br><br><br>

弊社Graffityでは、AR/MR系のエンタメコンテンツを作っています。
今回のVisionPro 向けゲームであったり、ARグラスやMRのHMD向けのコンテンツ開発などを行っています。

今後も積極的にVisionPro向けのエンタメコンテンツを作っていきますので、作ってみたいという方を大募集しております。

https://graffity.jp/