Unityパズルゲーム講座で“3つ揃ったら消える”ルールを追加!消去ロジックと色管理【第7回】
前回↓

今回の講座では、つながった同じ色のボールが3つ以上で消える仕組みを実装していきました。
前回までで「ボールをなぞって選択する」ところまでは動いていましたが、ここからは実際のパズルゲームっぽいルール作りに入っていきます。
参考先:ボールの種類を増やす/ボールが3つ以上揃ったら消去する処理 | Unity入門の森 ゲームの作り方
選択したボールを正しくカウントする仕組み作り
まず前半では、選択したボールの数を正しく数える処理から着手しました。
特に重要だったのは isTouch 変数の導入です。
これまでは、すでに選択中のボールを再度タッチすると、誤ってカウントが増えてしまう問題がありました。
そこで、
&& !h[0].collider.GetComponent<BallObject>().isTouch
という条件を入れ、
「まだ選択されていないボールのときだけ追加する」
という仕組みに変更しました。
isTouch を true にした瞬間から、そのボールは選択済み扱いとなるため、
二重カウントが防げるようになります。
さらに Update の中で isTouch を参照して Emission の色が自動で変わるようにし、
視覚的に選択状態がわかりやすくなりました。
MouseUp 時にボール数を判定して消去
指(マウス)を離したタイミングで実行される ReleaseObject() では、
選択したボールの数を取得
3つ以上なら破壊(Destroy)
選択状態を解除してリセット
という流れが実装できました。
var cnt = touchBallList.Count;
if (cnt >= 3)
{
Destroy(go);
}こうして、
なぞった数によってボールが消える/消えないの分岐が完成しました。
なお、2つしか選んでいないのに消えてしまう場合は、
isTouch = true の書き忘れや、判定条件のミスが原因。
コードが複雑になってきたことで、こうした入力漏れが起こりやすくなります。

後半:ボールの種類(色)を enum で管理する
次に取り組んだのが、
ボールごとに種類(色)を持たせる仕組みです。
▼ 流れは次の3ステップ
GameResources.cs で色の種類を enum として定義
BallGenerator.cs で生成時にランダムで色を割り当て
BallObject.cs の Start() → ChangeColor() で見た目に反映
ここでのポイントは、
enumで種類をまとめて管理できるため、後から色を増やすにも柔軟だということ。
また、色をランダムで選ぶ処理には Linq を使いました。
Enum.GetValues(typeof(GameResources.BallColor))
.Cast<GameResources.BallColor>()
.ToList()[UnityEngine.Random.Range(0,4)];長く見えますが、 「列挙体の一覧 → リスト → ランダムに1つ取り出す」 という流れを一行で書いているだけです。
第7回のまとめ:複雑化するコードと向き合いながら、一歩ずつ前進
今回の作業では、コードの書き写しが中心だったこともあり、処理の大きな流れで迷う場面は少なめでした。一方で、isTouch の入力漏れや条件式の抜けなど、ほんの小さなミスがそのまま動作の異常につながることを強く実感しました。たとえば、わずかな書き忘れで「2つしかなぞってないのに消える」といった意図しない挙動が発生するなど、Unityでコードを書く難しさが見えてきた回でもあります。
また、Raycast、条件分岐、リスト管理、enum、Linq といった新しい概念が次々に登場し、どの処理が何を担当しているのかを把握する難しさも増してきました。ただ、その複雑さの裏側で、ゲームの仕組みは確実に本格的になってきています。
今回、「3つ以上で消える」処理が完成し、ボールの種類管理まで実装できたことで、パズルゲームの“根幹ルール”が形になりました。
次回もがんばります。
#Unity #ゲーム制作 #ゲーム開発 #Unity初心者 #個人ゲーム開発 #ゲームで学んだこと #パズルゲーム #Unityパズルゲーム講座 #Random .Range
