【VR】Oculus Questのコントローラから球を出す/物体をつかむ/レイで物体をつかむ

VRゲームの作り方

今回はオキュラスクエストの使い方を習得するための練習を行っていきましょう。

コントローラを表示させて、コントローラで弾丸を撃つ、物体をつかむ、レイを出す処理を作成していきます。

コントローラの表示

前回作成したプロジェクトのままでは、VR用のカメラは配置されていますがコントローラは配置されていないため、HMD上でコントローラが見えない状態になっています。
そのため、両手2つのコントローラを表示させます。

ではまず、Oculus→VR→Prefabs→OVRControllerPrefabがあることを確認してください。こちらがコントローラのゲームオブジェクトです。

vrarticle001000000

このコントローラオブジェクトをOVRCameraRig→TrackingSpace→LeftHandAnchorとRightHandAnchorにドラッグ&ドロップしてください。

vrarticle001000001

【注意】コントローラは最初右手で設定されているため、LeftControllerAnchorにドラッグ&ドロップしたOVRControllerPrefabsのOVRControllerHelper→ControllerをL Tracked Remoteに設定してください。

vrarticle001000002

この状態でアプリを実行すると、コントローラが表示されるようになります。

play

コントローラから球を出す

ここからはコントローラのボタンを用いた様々な操作の作成方法について解説していきます。

まずは、コントローラから球を出す処理を作成します。そのため、コントローラの入力処理を行うための空のゲームオブジェクトを作成していきましょう。

vrarticle001000003

空のゲームオブジェクトの名前はInputManagerに設定してください(ここは自由な名前でも問題ありません)。

vrarticle001000004

次に、Assetsフォルダ内にScriptsフォルダを作成してください。

vrarticle001000005

そして、Scriptsフォルダ内にInputManagerという名前のスクリプトを作成してください。

vrarticle001000006

作成したInputManager.csをゲームオブジェクトInputManagerにドラッグ&ドロップしてください。
vrarticle001000007

それでは、InputManager.csのコードを書いていきましょう。以下のコードを書いてみてください。

まず、OVRInputクラスはOpenVRと呼ばれるVR向けの処理をまとめたクラスです。OVRInput.GetDown関数は、引数のボタンが入力されたフレームかどうかを検知する関数です。引数にはOVRInput.RawButton.Aと書かれていますが、これはOculus TouchコントローラのAボタンのことを指します。そのため、このif分岐はAボタンが押されたら実行する処理であることが分かります。

次に、飛ばす球を作成していくのですが、今回はヒエラルキーから作成するのではなく関数から作成しています。それは、GameObject.CreatePrimitive関数です。これは、引数の形状のゲームオブジェクトを作成する関数で、キューブ、球、カプセル、平面などのCreate GameObjectから作成できるゲームオブジェクトを作成することができます

GameObject.CreatePrimitive関数の返り値を変数goに代入させ、次の行で右手コントローラの位置に設定します。最後に、球の半径が初期値では1mであり大きすぎるため、go.transform.localScaleを変えて半径を0.1mに変更させています。

では、Unityに戻って、InputManagerのインスペクタのRight Controllerに右手コントローラのゲームオブジェクトであるOVRControllerPrefabsをドラッグ&ドロップしてください。

vrarticle001000008

この状態で実行してみましょう。右手コントローラの位置に球が生成される様子が確認できると思います。

play2

しかし、まだ物理演算がないため物体が自由落下しません。

そのため、生成した球にRigidbodyコンポーネントを追加しましょう。通常ではインスペクタ―から追加するのですが、スクリプト上で生成したゲームオブジェクトの場合インスペクタ―から追加することができないため、スクリプト上で追加します

コンポーネントの追加にはAddComponent関数を使用します。

Update関数に以下のコードを書いてください。

 

すると、次のように生成した球が自由落下していくようになります。

play3

そして、最後に、コントローラの方向に初速度を追加する処理を加えます。今回は以下のコードで10m先へ一気に飛ばす初速度を追加します。

 

 

ちなみに、right.Controller.transform.forwardの向きは下の図のようなイメージです。

vrarticle001000009

この状態で実行してみましょう。次のようにボタンから球が発射できるようになれば無事に球を出す処理の完成です。

play4

コントローラで物体をつかむ

それでは次に、コントローラで物体をつかむ処理を作成していきましょう。

まずは、つかむ用のキューブを作成していきます。ヒエラルキーから右クリック→Create GameObject→3D Object→Cubeでキューブを作成して、Transformを下のように設定してください。

 

vrarticle001000010

この状態で実行したとき、コントローラの届く位置にキューブが配置されていればOKです。

play5

つかむ処理には衝突判定を使用するため、ゲームオブジェクトの識別用にCubeのTagを設定していきます。CubeのインスペクタからTag→Add Tagを選択してください。

vrarticle001000011

Tags&LayersのTagsの+ボタンを押してCubeという名前でタグを作成してください。

vrarticle001000012

作成し終えたら、Cubeのインスペクタに戻り、Tag→Cubeを設定してください。これでCubeのタグの設定が完了です。

vrarticle001000013

では、InputManager.csのコードにつかむ処理を実装していきましょう。

以下のコードを書いてください。

このコードでは、Bボタンを押したときCubeが近くにあれば右コントローラの子オブジェクトに設定するといった処理を実行しています。Physics.SphereCastAll関数は、第一引数の位置を中心に第二引数の半径の球体に衝突するゲームオブジェクトを取得する関数です。第三引数はその球をどこに飛ばすかという設定になりますが、今回は必要な部分ではないので正面方向に設定しています。

そして、ヒットしたゲームオブジェクト群をforeach文でループさせています。この中で、タグがCubeのゲームオブジェクトであれば、右コントローラの子オブジェクトに設定するといった処理を加えています。

【注意】実際には、子オブジェクトのparentを右コントローラに設定する処理をコードに記述していることに注意してください。

コントローラの子オブジェクトに加えることにより、右手コントローラの位置や方向を変えたときCubeも同期して動くようになります。

この状態で実行してみましょう。すると下の図のようにつかむ処理ができると思います。

play6

 

離す処理は、Cubeタグのついた子オブジェクトを切り離すだけでできるため簡単に実装できます。こちらもつかむ処理と同じように、実際にはCubeのparentをnullにする処理となるため、子オブジェクトの親を指定しないといった処理を記述しています。

この状態で実行すると、ボタンを離すと物体を離すことができることが確認できます。

play7

コントローラからレイを出して物体をつかむ

次に、空いている左手のコントローラからレイを出す処理を作成していきます。

まず、レイ用のゲームオブジェクトを作成します。空のゲームオブジェクトを左手コントローラの子オブジェクトとして作成してください。名前はRayObjectに変更してください。

vrarticle001000014

そして、Add Componentから線を描画するためのLine Rendererを追加しておいてください。

vrarticle001000015

それではコードを書いていきます。InputManager.csに以下の変数を追加してください。

そして、これらを割り当てるため、インスペクタでleftControllerとrayObjectを以下のように割り当ててください

vrarticle001000016

vrarticle001000017

設定し終えたら、コードの説明に戻ります。

まずは、レイを出す処理を作成していきます。以下のコードを書いてください。

この処理では、レイの線の長さや太さを設定しています。

※ ここで、LineRenderer.SetVertexCount(int)と’LineRenderer.SetWidth(float, float)が古い書き方のため警告が表示されますが、現状は問題なく動作します。

この状態で実行すると、次のようになります。

play8

それでは次に、レイにあたった物体をつかむ処理を作成していきます。下のコードを記述してください。

 

このコードは、前述した物体をつかむ処理をコピー&ペーストして少し改良したものとなります。Yボタンを押したとき、レイにあたったタグがCubeの物体を子オブジェクトに設定する処理となっています。Yボタンを離したときの処理はrightControllerからleftControllerに変えただけです。

この状態で実行してみましょう。すると、レイに当たった物体をつかんで移動させることができることが分かります。

play9

 

最後に

今回紹介した3つの操作は、すべて独立して実装しているため、組み合わせて簡単なゲームを実装することができます。この記事を参考にしながら、ぜひVR開発を始めてみてください。

play10

 

コメント

タイトルとURLをコピーしました