テトリスユニットの回転処理とフィールド外に射出したときのバグ修正

VRゲームの作り方

今回の講座ではテトリスブロックを枠の外に連射したときのバグの解決から始めていきましょう。

そして、テトリスの肝となる”ブロックユニットの回転処理”の開発を行います。

ここまでくるとかなりVRシューティングテトリスが形になってきますね。

【微修正】フィールド外にブロックユニットを発射してしまったときの対処

前回までの実装では、Fire()でブロックユニットを発射してフィールドに当たらなかった場合にゲームが進行しない状態となっていました。

これに対処するため、発射してから60フレームの間フィールドに当たらなかった場合にはGameStatusをShotに戻るようにしていきます。

まずは、Field.csのコードに以下を定義して下さい。

そして、Update()を以下のように書き換えましょう。

これで、実装完了です。実行してみましょう。ブロックユニットがフィールドに当たらなかった場合に、GameStatusがShotへ戻るようになる様子が確認できます。

ブロックユニットの回転

次に、発射前にブロックユニットを自由に回転できるようにします。

現状では、発射するブロックが発射するまでわからなくなっているため、発射前にCreateBlock()で生成するようにします。そのため、BlockBazooka.csにブロックユニットを保持するshotObj変数を追加して、Start()を以下のように記述してください。

 

最後の3行で、「ブロックユニットの生成→親をコントローラに設定→ブロックユニットの表示位置をコントローラの位置」を実装しています。

さらに、発射した後に新しいブロックユニットを生成したいため、Update()を以下のように修正してください。少し操作性が悪いと感じたためボタンの割り当てを次のように変更しています。

ボタン 操作
トリガーボタン ブロックユニットの発射
Aボタン ブロックを右回転
Bボタン ブロックを左回転

 

RotateBlockUnit()はブロックを回転させる関数になります。

まず、BlockUnitを回転させる方法としては、回転行列を利用するのが一般的です。今回は簡単のため、右回転する際、元の座標(x, y)は回転座標(X,Y)としたとき, X = -y, Y = xとなることだけ理解しておけば問題ありません。では、RotateBlockUnit()を次のように実装します。今回の実装では、第一引数のisRightがtrueのとき右回転、falseのとき左回転するように実装しています。そのため、Aボタンを押したときはRotateBlockUnit(true)を、Bボタンを押したときはRotateBlockUnit(false)を実行させるようにしています。

最後に、生成したブロックユニットが物理演算により回転しないように、CreateBlock()にfreezeRotation = trueを、重力がかからないようにuseGravity = falseに設定しておきましょう。

最後に、発射後に重力がかかるようにFire()内にuseGravity = trueを追加しておいてください。

この状態で実行してみましょう。

ブロックユニットが回転できる様子が確認できたでしょうか?

次回予告

次回はブロックが一列揃ったら消える処理を実装していきます。

コメント

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