Home » 【XR Kaigi 2022】UnityでVRアプリを開発するときの最新手順を紹介!~環境構築から基本操作の設定まで~


セミナー 2022.12.29

【XR Kaigi 2022】UnityでVRアプリを開発するときの最新手順を紹介!~環境構築から基本操作の設定まで~

国内最大級のVR/AR/MRカンファレンス「XR Kaigi」が今年も開催されました。今年の「XR Kaigi 2022」はオンラインカンファレンス(12月14日~16日)と、東京都立産業貿易センター 浜松町館でのオフライン(12月22日・23日)のハイブリッドで実施。オンライン開催では、3日間の期間中に60のセッションが行われました。

今回はその中から、初日の12月14日に行われたセッション「これが最新情報!「『Unity ではじめる xRアプリ開発 2022』」をレポートします。登壇者は、ユニティ・テクノロジーズ・ジャパン株式会社(以下「ユニティ・テクノロジーズ・ジャパン」) Senior Solution Engineerの高橋忍氏。セッションではUnityを使ってxRアプリを開発するときの最新手順や、新機能の実装方法などが紹介されました。

Unityの基本構成:プラグイン管理機能で各社SDKの差分を吸収

セッションは、VRアプリ開発を念頭に置いた、Unityの基本構成の説明からスタート。

Unityは、xRアプリを作るための基本機能を「XR Subsystem」にまとめています。その中には、各社SDKの差分を吸収してくれる「XR Plugin Management」(編注:拡張プログラムの管理機能)があります。

そこから開発者が使用する各社のSDK(編注:Software Development Kit。ソフトウェア開発キットのこと)に適するものを選び、開発を進めます。

VRアプリ開発のSDKには、Unity製の「XR Interaction Toolkit」やMeta社製の「Oculus Integration」、Microsoft社製の「Mixed Reality Toolkit(MRTK)」などがあります。

今回、高橋氏は、Unity純正SDKである「XR Interaction Toolkit」の使い方を説明しました。

XRデバイス用のドライバー(編注:システムとデバイスをつなぐプラグイン)は、Oculus専用やWindows MR専用のものに加えて、オープン規格のOpen XR Pluginが普及してきました。デファクトスタンダード(事実上の標準規格)として、今後はこちらに統一される流れになりそうです。

今回は、「XR Plugin Management」のうち「Oculus XR Plugin」と「Open XR Plugin」の両方を使用し、「XR Interaction Toolkit」に対応させます。

Unityのインストールと追加モジュールのダウンロード

続いて高橋氏は、UnityでVRアプリを開発するための環境設定を説明しました。

(編注:Unity IDを持っていない方は、事前にUnity Hubのインストールとアカウント作成を済ませてください(利用規約に同意が必要です)。サインイン完了後、特に指定しなければ、最新バージョンのUnityがインストールされます。不慣れな方はアカウント設定(My Account Settings)で言語設定(Prefered Language)を「日本語」に変更すると安心です。)

Unityのバージョンは2021.3 LTS以降を推奨(講演時点)。デバイスにMeta Quest Proを使う場合は、2021.3以降でモジュールが追加されています。なるべく新しい環境を利用することをオススメします。

また、スタンドアローンのデバイスはAndroidがベースになっていることが多いため、その開発用にAndroid SDK/ Open JDK /Android NDKも忘れずに追加しておきます。

それらに加えて、大抵のテスト環境はWindowsで実行するため、Windows用のIL2CPPモジュールも忘れずに入れておきます。

(編注:Unity Hubを起動したら「インストール」画面の設定ボタンをクリック。「モジュールを加える」をクリックすると、モジュール追加画面が表示されます。)

デバイス側の設定は、Meta Quest 2/Proは「開発者モード」にしておきます。セットアップ時に使用するスマホアプリで設定できます。

また、Windows環境で直接デバッグを行うため、Oculus Linkも設定しておきます。

テンプレートを使ったプロジェクトの作成とプラグインの確認

各種のインストールが終わったら、まずはUnity Hubの画面で、アプリ開発に用いるプロジェクト(Project)を作成します。

かつては「3D」のテンプレートなどから作り始めていましたが、現在は専用のテンプレート「VR」が用意されています。

Unity Hubから右上の「新しいプロジェクト」をクリックし、中央のリストに表示されたテンプレートの中から、「VR」を選んでクリックします。

初期状態(デフォルト)ではVRテンプレートがインストールされていないため、右下にある「テンプレートをダウンロード」から取得しておきます。プロジェクト名を入力したり、保存場所を指定することもできます。

「プロジェクト」が作成されると、画面に「チュートリアル」が表示されますが、今回の説明では使わないのでクローズしました。

「VR」テンプレートは、コンポーネントの階層構造が「2D」「3D」など他のテンプレートを用いるときとは異なります。最上位に「Main Camera」がないかわりに、「XRRig」というクラスがあります。その配下に「Camera Offset」があり、さらにその下に「Main Camera」があるという構造です。

高橋氏によると、「『XRRig』と『XRPlatformControllerSetup』は古いので使用せず、後ほど削除します」とのこと(編注:Unity公式の変更履歴でも「非推奨」とされています)。

画面左の最上部にある「Window」メニューから「Package Manager」を開くと、「Project」の配下に「VR 2packages」がインストールされているとわかります。

VR用のプラグインはひと通り入っているため、ほかに入れる必要はありません。事前に追加していれば、先ほどのOculus用とOpenXRのプラグインが入っていることも確認できます。

SDKを導入し、コントローラーのボタン割付に使うコンポーネントをインポート

次は、Unityの純正SDKである「XR Interaction Toolkit」を導入します。

画面左上の「Window」メニューから「Package Manager」を開き、「Packages: In Project」タブを「Packages: Unity Registry」に切り替えます。

リスト下部の「XR Interaction Toolkit」を選択し、「Install」ボタンをクリックしてインストールします。

「XR Interaction Toolkit」の配下には「Starter Assets」と「XR Device Simulator」という、ふたつのサンプルがあります。

今回はデバイスが手元にあるので、「Starter Assets」の[Import]ボタンをクリックしてインポートします。サンプルではありますが、モーションコントローラーのボタン割り付けが予めセットアップされています。

「XR Device Simulator」はデバイスが手元にないときに使います。必要に応じてインポートします。

「Starter Assets」をインポートしたら、セットアップ対象のアセットを確認します。

画面下部の「Project」配下のフォルダ「Assets」→「Samples」→「XR Interaction Toolkitmigi」→「2.0.4(編注:バージョン情報)」→「Starter Assets」を開きます。

すでにセットアップされたアセットが5つ入っていると確認できます。それぞれを選択し、画面右上「Inspector」欄の「Add to …」ボタンを押下すると、プリセットのアセットに設定できます。

さらに、画面左上部の「Edit」から「Project Settings」を開き、「Preset Manager」を選択します。コントローラーはライト(右手)とレフト(左手)が同じカテゴリーで入っていますが、あとで区別することがあるため、「Filter」欄に名前を入れておくと使いやすくなります(「Right」「Left」など)。

採用デバイスに応じたプラグインの設定と変更変更

引き続き、「Project Setting」画面で「XR Plugin Management」の設定を2種類行います。ひとつはOpenXR用のプラグイン。もうひとつはOculus用の設定です。後者はAndroidデバイスなどにビルドするときに使います。

(編注:詳しいチェック項目は投影資料(下図)を参照してください)

先ほどふれた通り、古い「XR Rig」を削除して(右クリックで「delete」)、「XR Origin」を追加しておきます(「+▼」ボタンから「XR」→「XR Origin (Action Based)」を選択)。

「XR Origin」は2種類ありますが、今回は「OpenXR」で利用する「XR Origin(Action-based)」を追加します。

「XR Origin」の設定も行います(編注:投影資料(上図)参照)。セットした時点でヘッドマウントディスプレーの情報がメインカメラと同期されます。

この処理を司るコンポーネントが「Tracked Pose Driver」です。「Main Camera」配下に追加され、ヘッドマウントディスプレーの動きがカメラに連動する仕組みです。

モーションコントローラーのモデル作成・設定

続いて、モーションコントローラーのモデルを作成・設定します。コントローラーの3Dモデルを用意し、プレハブ化して割り当てることで、ユーザーの手の位置にコントローラー(の3Dオブジェクト)を表示できます。

Meta Quest2までの3Dモデルは、Meta社が開発者向けに一般公開しています。

Oculus Questのコントローラーモデルは、ひとつの3Dモデル内に「右用」と「左用」が入ってしまっており、分ける必要があるところに注意してください。いったんUnityに取り込み、「右用」と「左用」それぞれのプレハブを分けて作ります。

(編注:詳しい手順は投影資料(下図)を参照してください)

スティック操作、テレポーテーション、移動先レティクルの管理機能を追加

続いて、空間内の「移動」を管理する「Locomotion System」を追加します。すでにXR Interaction Toolkitに用意されているので、XR Originに適用(セット)するだけでOKです。

VR空間内の移動は、「スティック操作(回転機能)」「現在地の移動(テレポーテーション機能)」の2種類を組み合わせて実現します。

「回転機能」は「Snap Turn Provider」を「XR Origin」にセットすると実現できます。

テレポーテーションは「Telepotation Provider」で管理します。

移動先のエリアには何かしらのオブジェクトが必要ですが、床面(Plane)に「Telepotation Area」を追加すると、モーションコントローラーで指し示すとレイ(Ray)が白くなり、移動可能であると表示できるようになります。

レイ(Ray)を出したときに、移動先の詳細な位置を指定するときは、「Teleportation Area」のプロパティである「Custom Reticle」を使って、移動先にマーカーを作ります。

レイ(Ray)をかざすと、移動場所(レイと地面の接触点)にレティクルが表示されるようになります。

モノを掴む動作を設定する

続いて、モノを掴む動作を設定します。「XR Grab Interactable Component」を使うと、対象物となる3Dオブジェクトに「掴む」判定が付与され、ユーザーが「掴む動作」をすると、そのオブジェクトを取り寄せられるようになります。物理運動を司る「Rigidbody」も必須です。

ボタンで上下移動

モーションコントローラーのボタンに操作機能を割り当てます。ボタン入力を認識するように設定すれば、プログラム的に処理できます。

モーションコントローラーの操作は、抽象的な形で定義されています。ボタン操作などを認識するスクリプトを追加して、動きを与えていきます。

「XR Default Input Actions」にすべての定義が入っているので、実現したい動作に適した定義を追加していきます。

次に、アップ(上移動)とダウン(下移動)のプロパティをどのボタンに割り当てるのか定義します。

上下移動用のコードを実装します。先ほど定義したアクションを取得するために、「XR Origin」に「InputActionReferene」を追加します。ボタン押下やスティック位置変更などのイベントが発生したとき、スクリプトで設定したアクション(例:上下移動)を取得する処理です。

設定が完了したら、Up / Downプロパティそれぞれに、先ほど定義した「Action」を割り当てておきます。

テレポート移動の挙動を調整

終盤には、高橋氏が「以前から実装したかった」という機能が紹介されました。ひとつはテレポート移動の動作変更です。

標準的なアプリケーションでは、スティックを押し込むと初めてレイ(Ray)が表示され、移動可能な場所を選択しているときだけ、スティックを戻すと移動します。

「XR Interaction Toolkit」のデフォルト設定を変更して、「Telepotatoon Area」でしか移動できないように実装します。

移動可能ターゲットのみを移動可能にし、Rayを釣り竿型に変えて、スティックを押し込むとRayを表示するようにします。

さらに、「Teleportatoon Area」にレイ(Ray)が当たっているときだけ、スティックを離すと移動するようにします。グラブボタンを押せばキャンセルできるようにもします。

「Passthrough」機能でMRのような「飛び出す表現」を実装する方法

高橋氏が実装したかったふたつ目の機能は、Meta Quest 2/Proの新機能「Passthrough」です。

デバイスのカメラで取り込んだ映像を表示することで、MRデバイスのような「オブジェクトが現実世界に飛び出す」表現ができます。

現時点では残念ながらOculusのSDKを使わないと実現できないそうで、「XR Interaction Toolkit」にOculusのSDKを設定すれば「Passthrough」機能が使えるように、技術調査したそうです。

(編注:現時点で実現可能な手法で、今後は変更される可能性があります)

最初にプロジェクト(Project)を作成します。「VR」テンプレートで新規プロジェクトを作成すると、Hierarchyに最初から「床面(Plane)」がありますが、「MR」では使わないため削除しておきます。

次にOculusのSDK「Oculus Integration」を導入します。Unity Asset Storeから無料で入手できます。

実装の手順を説明します。まずはOVR Managerを導入します。次に、Passthrough画面を表示するための「OVR Passthrough Layer」を追加します。

「OVR Passthrough Layer」を追加すると、デフォルトでは最前面に表示されて3Dオブジェクトが見えなくなってしまいます。

そこで設定を変更して、「OVR Passthrough Layer」を最背面に持っていきます。

この状態でも3Dオブジェクトは「Skybox」に隠れて見えなくなるので、「Main Camera」で「Skybox」をソリッドカラーの透明色に設定します。

こうすると、「Passthrough Layer」が最前面になり、MRのような表現ができます。

最後に高橋氏は、「XR Interaction Toolkitを使えば、VRアプリを短期間で簡単に開発できます。ぜひみなさんも、作ってみてください」と語り、セッションを締めくくりました。


VR/AR/VTuber専門メディア「Mogura」が今注目するキーワード