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

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

Unity + Oculus Integrationでボタンを押す(その4:好きな形のボタンを作成)

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

利用するコンポーネント

今回の記事で新たに使用するコンポーネントは特にありません。

Scene構築手順

Sceneの作成

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

rhikos-prgm.hatenablog.com

ボタンを作成する

Interactables/Buttons配下に「Assets/Oculus/Interaction/Runtime/Prefabs/Poke/PokeInteractable」のprefabを配置して「ObjectButton」にリネームします。

ObjectButtonを右クリックで設定して「Prefab > Unpack」します。
※前回と同様にprefabの構成をいじっていくので元のprefabに影響を与えないようにUnpackします。

prefabの構成を変更

ObjectButton/Visuals配下の構成を変更していきます。
変更前はButtonVisualに

  1. ボタン位置を決めるスクリプト
    PokeInteractableVisual
  2. ボタンのパネル表示をするスクリプト
    QuadMesh, MeshRenderer, MaterialPropertyBlockEditor, RoundedBoxProperties, InteractableColorVisual

がアタッチされている状態です。

変更前:
ObjectButton(PokeInteractable)
 +- Visuals
     +- ButtonVisual ... (1), (2)のスクリプト

これを

変更後:
ObjectButton(PokeInteractable)
 +- Visuals
       +- ButtonVisual             ... (1)のスクリプト
       |     +-- [ボタンの形状(押すと動く部分)]
       +- [ボタンの形状(押しても動かない部分)]  -> 必要に応じて

のような構成に変更します。
ボタン位置を決めるオブジェクトを親に設定して、その子要素に任意の形のボタン形状を追加するイメージです。
また、必要に応じて押しても動かない部分の形状をVisualsの子要素として追加します。

ボタンの形状は何でもよいのですが、今回はCylinderとCubeを組み合わせた、以下のような形状のボタンを追加します。

赤い円柱部分が押し込める箇所

以下、具体的な手順です。

  1. ButtonVisualからPokeInteractable「以外」のコンポーネントをすべてremoveします。
  2. ButtonVisual配下にCylinderを追加します。(ButtonVisualの右クリックメニュー「3D Object > Cylinder)
  3. Visuals配下にCubeを追加します。(ButtonVisualの右クリックメニュー「3D Object > Cylinder)

ボタンの見栄えを調整

追加したCylinderやCubeの位置・回転・スケールを調整して見栄えを整えていきます。

Cylinder: 90度回転させて長さと位置を適当に調節する。

Cube: 押し込んだときにCylinderがCubeに埋没してしまわないように位置を調節する。

ボタンの当たり判定を調整

ボタンの押し込み部分の形が円になったのでObjectButton/Model/BoxProximityField(四角形の当たり判定)をCircleProximityFieldに差し替えます。

  1. Model配下のBoxProximityFieldを削除する。
  2. Model配下にGameObjectを追加してCircleProximityFieldにリネームする。
  3. CircleProximityFieldにCircleProximityFieldのスクリプトをアタッチする。
  4. CircleProximityFieldのTransformに自分自身(CircleProximityField)、Radiusに0.5を設定する。
  5. ObjectButtonのPokeInteractableコンポーネントのProximityFieldにCircleProximityFieldを設定する。

動作確認

参考サイト

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

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

公式:APIリファレンス
Reference