ボールの種類を増やす/ボールが3つ以上揃ったら消去する処理

Unityパズルゲームの作り方


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

前回の第6回の記事では同じ色のボールをなぞって消す処理を作りました。

前回の記事↓

タッチ操作でボールをなぞって消す処理の作り方 ~配列で管理しよう~
この記事はパズルゲームの作り方講座の第6回です。第5回では、マウスの入力処理とクリックしたゲームオブジェクトを検知する処理を実装しました。 前回の記事↓ 第6回では、このゲームの中心部でもある、同じ色のボールをなぞると消える処理を作...

今回の第7回と次回の第8回では、第6回で作成した処理を改良します。

つながっている3つ以上の同じ色のボールをなぞると消える処理を作っていきます。

記事前半では選択したボールのカウント部分を作ります。すなわち、選択したボールの数を数え、3つ以上であれば削除する処理ですね。

記事後半のボールの種類の設定では、次の3項目に分けて段階的に説明していきます。

  • 種類の追加
  • 近くのボールを検出する処理(第8回で解説)
  • 違うボールをなぞれないようにする処理(第8回で解説)

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

選択したボールのカウント

前回までのコードでは、1個や2個のような少ない数でも選択したボールが消えてしまいました。そこで、3個以上選択したときだけボールが消えるようにする処理に書き換えていきます。

まずは事前準備として、BallObject.csを次のように書き換えていきます。

isTouchは選択しているかどうかを意味する変数として定義しています。

これまでは、選択中のボールでも再度タッチすれば選択したボールの数を誤って増やしてしまっていました。

isTouch変数を使ってこの数えすぎ問題を防止します(また、Update関数内でisTouchによりEmissionの色が自動で変わるように変えました)。

それでは、ボールの数をカウントする処理を書いていきましょう。TouchManager.csのUpdate関数を次のように書き換えてください。

if文の条件判定式で先ほど定義したisTouch変数を組み合わせています。

(関連記事:Unity C#プログラミング入門講座 第6回 制御文の使い方1 if文・ switch文での条件分岐 )

以下のようにすると、タッチされていないボールの時、if文の中身が実行されるようになります。

そして、このif文の中身は次のようになっています。

一行目でisTouchをtrueにしているため、次から選択されているボールがif分岐に入ることがなくなります。これでカウント数を正しくすることができました。

さらに、TouchManager.csのReleaseobject()を次のコードに書き換えます。

コードの流れを解説します。

まず、選択したボールを記憶している配列touchBallListの要素数をtouchBallList.Countで取得しcntに代入しています。

そして、cntが3以上であれば選択したボールを削除するようにif文を使って分岐させています。

以上のコード追加により、選択したボールが3つより少ない場合、選択しても消えなくなっていることが確認できます。一度ご自身でUnityを再生して確認してみてください。

ボールの種類の設定

マテリアルの色を変えてボールの種類を作っていきましょう。

まずは、ボールの種類を列挙型を使って定義します。

(関連記事:Unity C#プログラミング入門講座 第11回 列挙型の使い方

GameResources.csという名前の新しいスクリプトを作成してください。

ここで注意ですが、GameResourcesクラスは、Start関数やUpdate関数などがあるMonobehaviorを継承したクラスとしては利用しません。

一度自動で生成されるコードを全消去して、次のコードだけになるように書き換えてください。

今回は、red、blue、green、purpleの4種類のボールを設定します。

ボールの種類を追加する方法

このゲームでは、ボールが生成されるタイミングに種類が決まるようにします。

BallGenerator.csのボールが生成される処理にそのための処理を加えていくことになります。

その前に、BallObject.csを次のように書き換えてください。

まずは追加したGameResources.BallColor型の変数colorを定義し、ボールの種類を設定できるようにしました。そして、ChangeColor関数により、colorでAlbedoの色が変わるようにしています。

さらに、BallGenerator.csを次のように書き換えましょう。

このコードではnamespace System.Linq;を使用しています。これはLinqと呼ばれるC#の言語で少し難しい処理を扱うときに使用する宣言文です。この記事では使い方のみ解説していきます。

追加した部分は、Update関数の最終行の次のコードです。

gameObject.GetComponent<BallObject>().colorは先ほど設定したボールの種類を設定する部分です。

Enum.GetValues(typeof(GameResources.BallColor)).Cast<GameResources.BallColor>().ToList()[UnityEngine.Random.Range(0,4)]; }がとてもややこしいことになっていますが、それぞれ次のような処理を行っています。

  • Enum.GetValues(typeof(T)):Tの列挙型を配列にする処理
  • Cast<T>():T型に変換する処理(Linq式を使える型に変更)
  • ToList():リストに変換する処理
  • UnityEngine.Random.Range(a,b):a~(b-1)の範囲のランダムな値を返す関数

つまり、列挙型を配列に→配列からリストに→リストの添え字をランダムに1つ選んで要素を取得という処理を一行にまとめたコードとなります。

また、Random.RangeメソッドはUnityとC#それぞれで同一名のものがライブラリとして定義されてしまっています。そのため、UnityEngineのものを利用することを明示しています。

この書き方は特別覚える必要はないですが、「指定した列挙型のランダムな値を返す処理」と考えてもらえればよいです。

関連記事1:UnityC# Listの使い方

関連記事2:UnityC#のLinq・属性・拡張メソッド・クラスの部分定義の使い方

では、この状態で実行してみましょう。色の違う生成されるボールが生成されていく様子が確認できます。

処理の流れとしては、

  1. GameResourses.csで色情報を格納した列挙体を作成
  2. BallGenerator.csでボールオブジェクトを生成し、列挙体のcolorパラメータに値を乱数で設定。
  3. BallObject.csのstart関数の中のChangeColor.cs関数が呼び出され、実際に色が変わる。

という形になっています。

 

おさらいと次回予告

今回は、ボールの設定の3項目の中の

  • ボールの種類追加

を解説してきました。

さて、段々とゲームが完成に近づいてきました。メイン部分で残っている実装部分は次の2つです。

  • 種類の違うボールを選択しない処理
  • 近くのボールの検出

これらを実装しないと、次のような結果となります。

現状、

  • 違うボールでも選択した状態になってしまうためパズル要素がない状態
  • 遠くのボールをなぞっても選択した状態

という課題が残っています。これらを第8回で解決していきます。

次回の記事↓

Unityで近い場所にあるオブジェクト・同じ色のオブジェクトだけをつなぐ方法
この記事はUnityパズルゲームの作り方講座の第8回目です。 「Unityで近い場所にあるオブジェクト・同じ色のオブジェクトだけをつなぐ方法」を習得していきましょう。他のゲームにも活かせる条件分岐の作り方を実践していきます。 第7回目に...


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

コメント

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