Oculus Questのコントローラーからテトリスブロックを射出する処理 | Unity入門の森 ゲームの作り方

Oculus Questのコントローラーからテトリスブロックを射出する処理

Unity VRゲームの作り方


Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

今回は、コントローラからブロックを発射する処理と、フィールドにくっつける処理を作成していきます。

前回の記事↓

VRシューティングテトリスのフィールドとキューブを作ろう
今回はUnity初心者向けにVRを用いたテトリス風のゲームの作り方について10記事で解説していきます。 テトリスは代表的なパズルゲームであり、細かい仕様をのぞけば、開発レベルも高くないゲームです。 ただし、VRゲーム化する上でシューティング...

【Line登録者限定のプレゼントもあるよ!】

【事前準備】左右のコントローラの識別方法

まずは事前準備として、左右のどちらのコントローラかを識別させるための方法について説明していきます。(少し長いため、この章を飛ばして作っていく中で理解しても問題ありません

OVRでは、コントローラの種類を識別させるために、OVRInput.Controllerクラスというものがあります。これは、第1回で右コントローラにR Touchを、左コントローラにL Touchを設定したものです。これは、各コントローラのインスペクタにあるOVR Controller Helperの中のm_controller変数に格納されています。これを使って、コントローラのm_controllerがL Touchのとき左コントローラ、R Touchのとき右コントローラと識別させることができます。

この処理を使うと、OVRInput.GetButton(OVRInput.Button.One, controller)関数により右コントローラではAボタンを押しているかどうか、左コントローラではXボタンを押しているかどうかの処理になります。この関数が優れている点は、左右で別々のコードを書かずに済むようになるという点で、開発がとても楽になります。

(図はOVRInputに関する公式リファレンスより引用)

ボタンの割り当てなども詳しくは、公式リファレンスに載っているため、確認してみてください。

それでは、次の章から実装の説明に入ります。

ブロックを発射する処理

まずは、前回の画面がこちらになります。

今回は、コントローラからブロックを放つため、ヒエラルキーからはブロックを削除してください。

スクリプトの作成

それでは、コントローラに追加するコンポーネントを作成していきます。

まずは、Scriptsフォルダを作成してください。

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

そして、BlockBazookaを右手コントローラ(OVRControllerPrefab)のインスペクタ―にドラッグ&ドロップしてください。

BlockBazooka.csの実装

ではBlockBazookaのコードを作成していきましょう。

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

変数の説明

まず、変数の説明に入ります。

blockObjはブロックのゲームオブジェクト用の変数として定義して、プレハブのブロックを入れられるようにするためSerializedFieldの属性をつけています。

OVRInput.Controllerクラスのcontrollerは、左右のどちらのコントローラかを識別できるようにするため定義します。設定は、Start関数に「 controller = GetComponent<OVRControllerHelper>().m_controller;」の一行を書くことで実装しています。

関数の説明

次に、Update関数内の説明に入ります。Update関数内では、Aボタンを押したときにブロックを発射するFire関数を実行するように記述しています。このif分岐で使用している「OVRInput.GetDown(OVRInput.Button.One,controller)」は、第一引数にボタンの割り当てを、第二引数にどのコントローラかを記述することで、第二引数のコントローラの第一引数のボタンを押しているかどうかを検知できる関数です。今回は第一引数にButton.Oneを、第二引数にR Touchを指定していることになるため、「右手のコントローラのAボタンを押しているかどうか」を検知していることになります。

最後のFire関数の説明に入ります。Fire関数では、コントローラの位置にブロックを生成して、コントローラの向いている方向に放つといったコードを記述しています。

ここまで書いたら、Unityの画面に戻ってください。

プレハブのブロックのインスペクタからRigidbodyを追加してください。追加方法は下部のAdd ComponentからRigidbodyを探して追加です。

また、BlockBazookaのblockObjにプレハブのブロックをドラッグ&ドロップしてください。

これで準備は完了です。

この状態で実行すると、下のようにコントローラからブロックが放たれる様子が確認できます。

フィールドにブロックをくっつける処理

次に、フィールドにブロックをくっつける処理を作成していきます。現在は、フィールドの端のみ衝突判定が設定されているため、中身のみ衝突判定が設定されるように実装していきます。

まずは、  FieldのインスペクタからBox Colliderを追加してください。

追加したBox Colliderの設定は以下のようにしてください。だいたいフィールドの枠内の領域になります。

さらに、枠自体に衝突判定を加えないようにするため、「Bottom」「Right」「Left」のBox Colliderのラベル左にあるチェックは外しておいてください。

また、この状態で実行するとフィールドが近すぎてしまうため、FieldのPositionのz座標を5に設定してください。ちなみに、ここで5と設定するとユーザからフィールドまでの距離が5mに設定されます。遠すぎると感じたらここの数値を調整してみてください。 では、この状態で実行してみましょう。

フィールド内にブロックを当てると衝突して下に落下する様子が確認できると思います。(ちなみに、GameウインドウとSceneウインドウは下の画面のように並べて表示できます。)

スクリプトの作成

それでは、ここからは衝突したブロックがフィールドに固定されるような処理を加えていきましょう。

まずはScriptsフォルダ内にFieldという名前のスクリプトを作成してください。

作成したら、必ずゲームオブジェクトのFieldにこのスクリプトを追加しておきましょう

Field.csの実装

では、Fieldのスクリプトを記述していきます。

以下のコードを記述してください。

今回は、衝突判定のみ使用するため、OnCollisionEnter関数を使用します。この関数は、Unity特有の関数であり、「何かオブジェクトが衝突した瞬間に起動する」関数です。第一引数のotherには衝突したゲームオブジェクトが自動的に渡されます。

今回は、「衝突したゲームオブジェクトの物理演算をなくした」ため、この関数内には、otherのrigidbodyを取得して、Destory関数によりrigidbodyを削除するといった処理を記述していきます。Rigidbodyを削除するということは、物理演算をなくすことと同じなため、衝突した瞬間その場で停止するようになります。つまり、実装したいフィールドにぶつかったブロックをくっつける処理になります。

それでは、この状態で実行してみましょう。下のようにフィールドにぶつかったブロックがくっついている様子が確認できれば成功です。

次回予告

次回は、フィールドの細かい部分の実装くっつけたブロックをフィールドのマスに自動的に合わせる処理を実装していきます。

次回の記事↓

射出されたテトリスブロックをフィールドにはめる方法と計算処理の作り方
前回までは、フィールドの設定は衝突判定のみだったので、それ以外の機能を作成していきます。 前回の記事↓ 【事前準備】フィールドの設定 Field.csを開いてください。 フィールド配列の定義 まずは、フィールド上に配置されたブロックを管理し...


Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

コメント

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