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

VRゲームの作り方

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

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

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 」によりソートさせています。

 

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

次回予告

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

コメント

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