テトリスブロックが一列揃ったら消える処理の作り方 | Unity入門の森 ゲームの作り方

テトリスブロックが一列揃ったら消える処理の作り方

Unity VRゲームの作り方


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

今回はテトリスブロックが一列揃ったら消える処理を作っていきます。

前回の記事↓

テトリスユニットの回転処理とフィールド外に射出したときのバグ修正
今回の講座ではテトリスブロックを枠の外に連射したときのバグの解決から始めていきましょう。 そして、テトリスの肝となる”ブロックユニットの回転処理”の開発を行います。 ここまでくるとかなりVRシューティングテトリスが形になってきますね。 前回...

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

一列揃ったら消える処理の作り方

BlockのTagの追加

まずは、Hierarchyに存在するブロックを取得しやすくするため、プレハブのBlockに「block」タグを追加しましょう。

プレハブのBlockを選択して、InspectorのTagからAdd Tagを選択してください。

Tagsから「block」を追加してください。

最後にもう一度プレハブのBlockを選択して、Tagを「block」に変更してください。これでTagの登録は完了です。

コードの追加

ではコードに移ります。

まずは、Field.csのUpdate()を次のように変更してください。Fallが完了した後にShotではなくDeleteに遷移するようにしています。

ここで、CheckLines()という新しい関数を記述しています。これは、揃っている列があるかどうかをチェックしてその列のブロックを削除する関数になります。実際の

CheckLines()は次のようになります。
こちらでは、y座標降順にblocksを走査して、そろっている列がないかチェックしています。そして、そろっている列があれば、列を削除する関数DeleteBlocks()と消えた分だけブロックをずらす関数DropBlocks()を実行させるようにしています。

DeleteBlocks()は、次のようなコードになります。
ここでは、先ほど設定したBlockのタグ「block」を利用して、GameObject.FindGameObjectsWithTag(“block”)によりHierarchy上のBlockをすべて取得させるようにしています。それらをすべてチェックし、指定した座標のブロックであれば削除するようにしています。

さらに、DropBlocks()は次のようになります。

こちらでもTagを利用してBlockのゲームオブジェクトをすべて取得しています。その配列を一度リストに変換しています。変換する理由は、y座標降順にソートさせるためです。ソートはOrderBY()で実行されます。ここでは、ラムダ式を用いて「(x) => x.GetComponent<Block>().y 」によりソートさせています。

 

これで設定は完了です。実行してみましょう。
次のように一列揃ったらブロックが消えるようになったでしょうか?

次回予告

実際にプレイしてみるとわかると思いますが、このままではかなり操作性が悪いと思います。そのため、次回はブロックが衝突する位置を可視化するコードを作成していきます。

次回の記事↓

ブロックの射出先を示すポインター作り/射出後に他ブロックに引っかかるバグを修正
ここまででかなりVRシューティングテトリスの仕組みができてきました。 しかし、 ブロックがどこに飛んでいくのかわかりにくい ブロックがたまにフィールドに引っ掛かってしまう といったプレイする上で致命的な欠点が残っています。 特に、ブロックが...


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

コメント

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