Physics Puzzle / Unity Project
MergePuzzle
画面上部からバブルを落とし、同じ種類のバブル同士を合体させる2D物理パズルです。 Unityの物理挙動、衝突イベント、入力とゲーム状態のつながりを学ぶために制作しました。
Overview
プロジェクト概要
Unity 6とC#を使用した学習プロジェクトです。 ポインターでバブルの落下位置を決め、クリックまたはタップで投下します。 同じ種類が衝突すると一段階上のバブルへ合体し、その結果をスコアへ反映します。
- Status
- Learning Project
- Engine
- Unity 6(6000.2.13f1)
- Language
- C#
- Tools
- Input System / TextMeshPro / Physics 2D
Implementation
実装した主な機能
ポインター操作
マウスやタッチの画面座標をワールド座標へ変換し、投下前のバブルを横方向へ追従させています。
バブルの投下
クリックまたはタップで重力を有効にしてバブルを落とし、一定時間後に次のバブルを生成します。
同種バブルの合体
2D物理衝突で相手を取得し、種類が同じ場合に2つを削除して、衝突位置の中間へ次のバブルを生成します。
二重合体の防止
合体処理済みの状態を各バブルに記録し、同じ衝突から処理が重複して実行されないようにしています。
スコアと効果音
合体後のバブルの種類に応じて得点を加算し、投下時と合体時にそれぞれ効果音を再生します。
ゲーム終了とリトライ
投下前のバブルに別のバブルが接触すると操作を停止して結果を表示し、ボタンからシーンを再読み込みできます。
Code Structure
処理の分け方
ゲーム全体の進行と、個々のバブルが担当する処理を別のクラスへ分けています。 衝突を検出したバブルから管理クラスへ合体を依頼し、条件判定とゲーム状態の更新を一か所で行う構成です。
- MergePuzzleSceneDirector
- 入力、生成、投下、合体条件、スコア、ゲーム終了、リトライ
- BubbleController
- 種類と合体状態の保持、衝突通知、画面外へ落ちたオブジェクトの破棄
- InputAction
- ポインター位置と押下を取得し、有効化・無効化のライフサイクルを管理
Learning
学んだこと・改善したいこと
Rigidbody2Dを使った重力、衝突イベントから別クラスの処理を呼ぶ方法、コルーチンによる待機、入力アクションの管理を学びました。 今後は生成位置の制限、ゲーム終了条件の調整、UIによる次バブルの案内などを改善したいと考えています。