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
環境構築・プロジェクト作成
環境構築とプロジェクト作成の手順については、こちらの記事を参照してください。
利用するコンポーネント
今回の記事で新たに使用するコンポーネントは特にありません。
Scene構築手順
Sceneの作成
空のシーンを作成します。(Assets/Sandbox/HandPoke/Scenes/PokeScene3)
途中までは以下の記事のPokeScene2と同様に進めます。
(PokeScene2が作成済みならコピーしてリネームすれば良いです)
ボタンを作成する
Interactables/Buttons配下に「Assets/Oculus/Interaction/Runtime/Prefabs/Poke/PokeInteractable」のprefabを配置して「ObjectButton」にリネームします。
ObjectButtonを右クリックで設定して「Prefab > Unpack」します。
※前回と同様にprefabの構成をいじっていくので元のprefabに影響を与えないようにUnpackします。
prefabの構成を変更
ObjectButton/Visuals配下の構成を変更していきます。
変更前はButtonVisualに
- ボタン位置を決めるスクリプト
PokeInteractableVisual - ボタンのパネル表示をするスクリプト
QuadMesh, MeshRenderer, MaterialPropertyBlockEditor, RoundedBoxProperties, InteractableColorVisual
がアタッチされている状態です。
変更前: ObjectButton(PokeInteractable) +- Visuals +- ButtonVisual ... (1), (2)のスクリプト
これを
変更後: ObjectButton(PokeInteractable) +- Visuals +- ButtonVisual ... (1)のスクリプト | +-- [ボタンの形状(押すと動く部分)] +- [ボタンの形状(押しても動かない部分)] -> 必要に応じて
のような構成に変更します。
ボタン位置を決めるオブジェクトを親に設定して、その子要素に任意の形のボタン形状を追加するイメージです。
また、必要に応じて押しても動かない部分の形状をVisualsの子要素として追加します。
ボタンの形状は何でもよいのですが、今回はCylinderとCubeを組み合わせた、以下のような形状のボタンを追加します。
以下、具体的な手順です。
- ButtonVisualからPokeInteractable「以外」のコンポーネントをすべてremoveします。
- ButtonVisual配下にCylinderを追加します。(ButtonVisualの右クリックメニュー「3D Object > Cylinder)
- Visuals配下にCubeを追加します。(ButtonVisualの右クリックメニュー「3D Object > Cylinder)
ボタンの見栄えを調整
追加したCylinderやCubeの位置・回転・スケールを調整して見栄えを整えていきます。
Cylinder: 90度回転させて長さと位置を適当に調節する。
Cube: 押し込んだときにCylinderがCubeに埋没してしまわないように位置を調節する。
ボタンの当たり判定を調整
ボタンの押し込み部分の形が円になったのでObjectButton/Model/BoxProximityField(四角形の当たり判定)をCircleProximityFieldに差し替えます。
- Model配下のBoxProximityFieldを削除する。
- Model配下にGameObjectを追加してCircleProximityFieldにリネームする。
- CircleProximityFieldにCircleProximityFieldのスクリプトをアタッチする。
- CircleProximityFieldのTransformに自分自身(CircleProximityField)、Radiusに0.5を設定する。
- ObjectButtonのPokeInteractableコンポーネントのProximityFieldにCircleProximityFieldを設定する。
動作確認
参考サイト
公式:Oculusスタートガイド(Unity)
Get Started with Oculus in Unity | Oculus Developers
公式:入力データの概要
※サンプルシーンのInteractionRigOVR~prefab配下のコンポーネント群が何をやっているのか、ざっくり理解するための最適なドキュメントだと思います。
Input Data Overview | Oculus Developers