ブロックの射出先を示すポインター作り/射出後に他ブロックに引っかかるバグを修正

VRゲームの作り方

ここまででかなりVRシューティングテトリスの仕組みができてきました。

しかし、

  • ブロックがどこに飛んでいくのかわかりにくい
  • ブロックがたまにフィールドに引っ掛かってしまう

といったプレイする上で致命的な欠点が残っています。

特に、ブロックがフィールドに引っ掛かって誤動作を起こしてしまうのを防ぎたいですね。

ブロックが衝突する場所にポインタを表示させる処理

今回は、ブロックが衝突する場所が分かりやすくするようにポインタを表示させるようにします。

重力処理をなくす

まずは処理を簡単にするため、発射するブロックユニットの重力処理をなくして一直線に発射できるようにします。

BlockBazooka.csのFire()を下のように書き換えて重力処理をなくしましょう。

衝突先を可視化

次に、ポインタのゲームオブジェクトを作成して、衝突先を可視化させていきます。まずは、ポインタのゲームオブジェクトを処理しやすくするため、BlockBazooka.csに以下を定義しましょう。

そして、インスペクタの各コントローラのOVRControllerPrefabの子オブジェクトとしてSphereを生成しましょう。Scaleは0.05にしましょう。

生成したSphereを先ほど作成したFieldオブジェクトのPointObjに割り当てましょう。

そして、ポインタを可視化させるための関数ViewPointer()を追加します。この関数内では、Physics.RaycastAll()を使用して、コントローラの指す先の方向にぶつかったゲームオブジェクトをすべて取得するようにしています。ここで取得したい部分はFieldに当たった場合であるため、衝突したゲームオブジェクトの名前が”Field”のときpointObjの座標を変化させるように

そして、GameStatusが「Shot」のときのみ、ViewPointer()を処理させるようにします。Field.csのUpdate()を以下のように書き換えましょう。

この作業を右手と左手のコントローラの両方に割り当ててください

この状態で実行してみましょう。
Field内の衝突する場所がポインタとして表示されている様子が確認できます。

【演出】ブロックが収まらない場合どこかへ飛んでいく処理

ここでは、演出を少し考慮していきます。
Field.csのOnCollisionEnter()ではめられないブロックを遠くへ飛ばす処理を実装していきます。

追加したAddForce()により、フィールドから跳ね返るような方向にブロックが飛んでいくように処理することができます。

では、この状態で実行してみましょう。ブロックが跳ね返る様子が確認できたでしょうか?

コメント

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