プログマのプログラマ日記

技術メモや自社サービスに関する記事を書いていく予定です。

Unity + Oculus Integrationでボタンを押す(その5:Canvas上にボタンを作成)

Unity + Oculus Integrationを使ってコントローラやハンドトラッキングでボタンを押すまでの手順をStep by stepで説明します。
やっていることはOculus Integrationのサンプルシーン「PokeExamples」と同様ですが、これを0から組み立ててみてSceneを構成するコンポーネントの役割への理解を深めようという趣旨の記事です。
ボタンを押す動作はOculus IntegrationのPoke Interaction | Oculus Developersという機能を使って実装します。
Pokeには「つつく」という意味があります。

以下のステップで実装を進めていきます。

  • 無地のボタンの作成
  • ボタンの大きさ・高さの調整
  • ラベル付きボタンの作成
  • 好きな形のボタンを作成
  • Canvas上にボタンを作成(本記事)

2022/11/7: githubにプロジェクトを共有しました。
github.com

環境構築・プロジェクト作成

環境構築とプロジェクト作成の手順については、こちらの記事を参照してください。

rhikos-prgm.hatenablog.com

利用するコンポーネント

今回の記事で新たに使用するコンポーネントは以下の通りです。

PointableCanvas

PokeInteractableのIPointableイベントをUnityのCanvasイベントに変換するためのコンポーネントです。

詳細は以下を参照してください。
Unity Canvas Integration | Oculus Developers

PointableCanvasModule

シーンに存在するPointableCanvasのイベント伝達を行うコンポーネントです。
PointableCanvasを利用するシーンには必ず一つ配置する必要があります。

詳細は以下を参照してください。
Unity Canvas Integration | Oculus Developers

PointableCanvasUnityEventWrapper

PointableCanvas上に存在するUnity Selectable(ボタン、トグルなど)のイベントを追跡します。
本記事では使っていないですが、ボタンを押したときに音を鳴らすなどの用途に使います。

詳細は以下を参照してください。
Event Wrappers | Oculus Developers

Scene構築手順

Sceneの作成

空のシーンを作成します。(Assets/Sandbox/HandPoke/Scenes/PokeScene4)
途中までは以下の記事のPokeScene3と同様に進めます。
(PokeScene3が作成済みならコピーしてリネームすれば良いです)

rhikos-prgm.hatenablog.com

PointableCanvasModuleを配置する

シーンのルートに空のGameObjectを作成してPointableCanvasModuleにリネームします。

上記オブジェクトにPointableCanvasModuleのスクリプトをアタッチします。
このとき、EventSystemも自動的にアタッチされます。

Canvasの配置・設定を行う

ワールド空間上にPoke可能なCanvasを配置・設定します。
まずは、Interactables配下に以下のようなGameObject階層を作成します。

Interactables
 +- FlatUnityCanvas(空のGameObjectを作成してリネーム)
        +- ProximityField(空のGameObjectを作成してリネーム)
        +- UnityCanvas(UI -> Canvasを作成)

UnityCanvasの設定

UnityCanvasの設定を行っていきます。

  1. UnityCanvasのRenderModeを「World Space」に変更します。
  2. UnityCanvasにImageを追加して、適当な背景を設定します。(本記事ではAssets/Oculus/Interaction/Samples/Textures/RoundCorners_12ptを使用)
  3. UnityCanvasにPointablePlaneのコンポーネントを追加します。

ProximityFieldの設定

ProximityFieldの設定を行っていきます。

  1. UnityCanvasにBoxProximityFieldのコンポーネントをアタッチします。
  2. 1のコンポーネントのBoxTransformにProximityFieldを設定します。

FlatUnityCanvasの設定

FlatUnityCanvasの設定を行っていきます。

  1. FlatUnityCanvasにPokeInteractableのコンポーネントを追加します。
  2. FlatUnityCanvasにPointableCanvasのコンポーネントを追加します。
  3. FlatUnityCanvasにPointableCanvasEventWrapperのコンポーネントを追加します。
  4. 1のコンポーネントのPointable ElementにFlatUnityCanvasを設定します。
  5. 1のコンポーネントのProximity FieldにProximityFieldを設定します。
  6. 1のコンポーネントSurfaceにUnityCanvasを設定します。
  7. 2のコンポーネントCanvasにUnityCanvasを設定します。
  8. 3のコンポーネントのPointable CanvasにFlatUnityCanvasを設定します。

※今回の記事ではPointableCanvasUnityEventWrapperのイベントに何も紐づけていないので3, 8は省略しても動きます。

Canvasの配置とサイズを整える

FlatUnityCanvasの位置やUnityCanvasのスケールなどを調節してCanvasの配置とサイズを調整します。
また、ProximityFieldのスケールをUnityCanvasと同じ大きさになるように調整します。

Canvas配下にボタンなどを配置する

UnityCanvas配下にボタンなどを配置していきます。
ここから先の手順はuGUIでGUIを構築していく手順と同じなので割愛します。

動作確認

参考サイト

公式:Oculusスタートガイド(Unity)
Get Started with Oculus in Unity | Oculus Developers

公式:入力データの概要
※サンプルシーンのInteractionRigOVR~prefab配下のコンポーネント群が何をやっているのか、ざっくり理解するための最適なドキュメントだと思います。
Input Data Overview | Oculus Developers

公式:APIリファレンス
Reference