見出し画像

Unity×Apple Vision Proで実現する疑似的空間オーディオ

こんにちは。TOPPANデジタル株式会社のUnity/xRエンジニアの高原です。
最近業務でUnity(Polyspatial)×Apple Vision Proの開発をすることが多くなってきたので、音響にこだわりたい方に役立ちそうな知見について技術記事を書くことにしました。よろしくお願いします。

また、今回12月1日から25日まで毎日Unityに関する記事を投稿するイベントUnity Advent Calendar 2024にも参加しており、こちらは6日目の記事となります。
普段DXnoteを読まれていない読者の方も読んでいただいていると思いますが、本記事で弊社のUnity, Apple Vision Proの開発に関して興味を持っていただければ幸いです。


自己紹介

改めまして、TOPPANデジタル株式会社のUnity/xRエンジニアの高原です。
普段の業務では3D・XR関連のR&Dに携わっています。
最近はApple Vision Proの開発が増えてきたため、Apple Vision Proを被っているか頭の上に載せて、動作確認のためにオフィス内をうろうろしている怪しい人物になりつつあります。
※エビデンスは下記ジョブマッチングの該当ページを参照


また個人でもUnityやUnrealEngineを使ってゲームやXRコンテンツなど様々な作品を制作しています。
今年度は株式会社STYLY様のSTYLY for Vision Pro Challengeに当選し、Apple Vision Proを無料でお借りしてSTYLY For Vision Proで遊べるシューティングゲーム「幻海ダイバー For Vision Pro」を制作しました。
さらに京都まで遠征し、エンジニアとアニメーターがチームを組んで、Unityでアニメーションを制作するイベント「アニメxゲームジャム F.F.」に参加し、ありがたいことにANiC賞をいただきました。


Apple Vision Proと空間オーディオについて

Apple Vision Proは、最新の拡張現実(AR)および仮想現実(VR)技術を融合したApple初の空間コンピューティングデバイスです。
両目それぞれに搭載された解像度3800×3000のディスプレイ、手や視線、表情の動きを高精度に追跡できる先進的なセンサーとカメラ、人間の自然な体勢に沿う快適なデザイン、Apple独自のM2チップ、R1チップを搭載したパワフルなパフォーマンスなど、ハイスペックなデバイスとなっています。


Apple Vision Proは音声を三次元空間内で正確に配置し、ユーザーの位置や動きに応じて音の方向や距離感をリアルタイムで調整する先進的なオーディオ技術である空間オーディオを実現しています。Apple Vision Proに搭載されたセンサーにより空間の形状を把握し、音響特性を分析することで、実際に部屋の中から音が鳴っているような体験を提供します。

画像引用:Apple Vision Pro - Apple(日本)より

Unity × Apple Vision Proの空間オーディオ対応状況

そんな空間オーディオをApple Vision Proアプリの機能として使えるのであれば、Unityも合わせて開発に使えばフォトリアルな見た目と空間に合わせた説得力のある音響を実現し、超現実的なARゲームやホラーゲームを作れるのではないか?とわくわくしていたのですが…

画像引用:Supported Unity Features & Componentsより
Audioは「Not fully spatiallized」完全に空間化されていない?

2024年11月20日現在、Unityはまだ完全に空間オーディオに対応していないようです。「完全に」対応してないってどういうこと?100%対応してないけど50%くらいは対応しているということ?と疑問を持ったので、確認してみることにしました。

今回本記事で動かす環境は下記の通りです。

デバイス
MacBookPro Apple M3 Pro 36GB

MacOS
Sonoma 14.5

Unity
6000.0.23f1 URP

Polyspatial
2.0.4

Xcode
16.0

Apple Vision Pro
2.0

ひとまず簡単に自分の周囲をぐるっと囲むように星形のルートをSplineで作成し、そのSpline上をワンちゃんが吠えながら移動するUnboundedのシーンを作りました。

上から見ると歪んでいて星形?になっているSplineとワンちゃん

上記を動かしたのが下記動画です。

音に集中して聞いていただくと、ワンちゃんの鳴き声が自分の周りを時計回りに一周しており、自分との距離感によって鳴き声が大きくなったり、小さくなったりすることが分かると思います。ただ周りの壁の向こう側かこちら側かの判定はされず、それによる音の遮蔽はできていないようです。

上記から
Untiy × Apple Vision Proで3Dオーディオはできるが、その場の空間に合わせた空間オーディオはできない
という状況なのではないか?と考えています。

Unity × Apple Vision Proで作ろう疑似的空間オーディオ

元々Apple Vision Proの空間オーディオで実現したかったことの一つとして、下記の画像のようなことがあります。

音源と自分の間に遮蔽物があればそれの影響を受けさせたい

ただ前章でUnityの公式資源ではまだ空間オーディオに対応していないことが判明しています。
そこでAppleが公開している空間オーディオプラグイン「PHASE(Physical Audio Spatialization Engine)」を利用して、疑似的に空間の壁によって音の遮蔽を発生させる仕組みを作ってみることにしました。
(いつかUnityが空間オーディオに完全対応してお蔵入りになりそう…)

画像引用:PHASE | Apple Developer Documentationより

開発環境情報は前章と同じです。
ただPHASEプラグインのビルドのため事前にPhtyon3とnpm(Node.js)をインストールしておきましょう。

空間オーディオプラグインのビルド、Unityパッケージへの導入

まずapple/unitypluginsリポジトリをローカルにクローンします。

画像引用:apple/unitypluginsより

クローンできたら資源内にあるbuild.pyを実行し、tgzファイルが生成されるのを待ちます。

そうしたらUntiyにプラグインを追加していきましょう。
必要なのは「Apple.Core」と「Apple.PHASE」になります。
UnityのPackage Managerで「com.apple.unityplugin.core-〇.〇.〇.tgz」と「com.apple.unityplugin.phase-〇.〇.〇.tgz」をAdd package from tarballで追加しましょう。
これでAppleの空間オーディオプラグインをUnityプロジェクトで使えるようになりました。

シーン作成

次に動作用のシーンを作成します。
基本的なUnboundedのシーンを作成し、XROriginを追加します。
XROrigin内のMain CameraにPHASE Listenerコンポーネントを追加します。
そして音源となるオブジェクト(今回の例では再度ワンちゃんを採用)にPHASE Sourceコンポーネントを追加します。

次に音の遮蔽物となる空間の壁の状態をリアルタイムで検知するためにAR Plane ManagerをARSessionに追加します。

SoundEvent作成

PHASE SourceコンポーネントにはAudioClipを設定するプロパティがありません。どんな音をどんな風に鳴らすのか設定するにはSound Eventを作成する必要があります。
Apple.PHASEプラグインをプロジェクト内にインストールしていると、プロジェクトタブにSound Eventが新規作成できるようになっています。

Sound Eventを作成するとPHASE Sound Event Composerというノードベースでオーディオの設定ができるエディターが開きます。
単純に音を鳴らしたい場合はPHASE Sound Event SamplerとPHASE Spatial Mixerを配置し、接続しましょう。

そして再生したいAudio ClipをPHASE Sound Event SamplerのAudioClipに設定します。

その後、SoundEventのインスペクタに戻りRootNodeにPHASE Sound Eventを設定します。(プロジェクトタブ内のSoundEventを展開するとPHASE Sound Eventが見えるのでそれをドラッグ&ドロップ)

そして音源となるPHASE SourceのSound Eventに作成したSoundEventを設定します。
これで空間オーディオ音源の準備は完了です。

空間の壁を音の遮蔽物にする準備

ここまで準備できたオーディオにARPlaneManagerでリアルタイムで検知した壁を音の遮蔽物にすることで空間オーディオっぽくしていきます。肝となるのはARPlaneManagerに設定するPlane Prefabです。

ヒエラルキータブでXR>AR Default Planeを作成し、それをPrefab化した後、
AR Default PlaneのマテリアルにAR/Basic Occulusionシェーダーを設定しましょう。

そしてARPlaneが壁を検知したタイミングで音の遮蔽物となるためのコンポーネントであるPHASEOcculuderを追加するスクリプトを作成し、AR Default Planeに追加します。※
※最初からARPlaneにPHASEOcculuderを付けた状態で試したのですが、Meshの面積が全くない状態でPHASEOcculuderが動作するとエラーが発生し、その後壁を検知してもうまく動かないようでした。

完成したAR Default PlaneをARManagerに設定します。

これで疑似的空間オーディオシーンの完成です!

動作確認

作成したシーンを実際に動かしてみたのがこちらの動画になります。

ドアを開ける前はワンちゃんの鳴き声がこもっているけれど、ドアの向こう側に行くとこもらなくなるオーディオを実現できました!

まとめ

UnityでもPolyspatial最新資源であれば、3Dオーディオは可能。
ただし、Apple Vision Pro本来の機能を活用した空間オーディオはまだ実現できない。

Apple.PHASEプラグインとARPlaneManagerを組み合わせれば、
Unityでもそれっぽい疑似的な空間オーディオが実現できる。

今回空間オーディオの実装のために、SoundEventのノードの組み合わせはあまり試さずにApple.PHASEを使用しましたが、ノードの組み合わせや設定次第で様々なことができそうな雰囲気を感じたので、今後も色々と触っていきたいですね。