テトリスユニットの回転処理とフィールド外に射出したときのバグ修正 | Unity入門の森 ゲームの作り方

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

Unity VRゲームの作り方


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

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

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

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

前回の記事↓

テトリスゲームの状態管理・ブロック落下・連射の制限処理を作る
今回はゲームの状態進行度を表すクラスや射出されフィールドにはまったブロックが落下する処理を書いていきます。 単一ブロックではなくユニットとして処理を行わないといけない&通常テトリスではなくシューティングテトリスにしたことにより処理がやや複雑...

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

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

前回までの実装では、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を追加しておいてください。

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

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

次回予告

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

次回の記事↓

テトリスブロックが一列揃ったら消える処理の作り方
今回はテトリスブロックが一列揃ったら消える処理を作っていきます。 前回の記事↓ 一列揃ったら消える処理の作り方 BlockのTagの追加 まずは、Hierarchyに存在するブロックを取得しやすくするため、プレハブのBlockに「block...


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

コメント

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