【学習】落ち物キャッチゲーム(ミニゲーム実践①)
これまでの学習では、
- プレイヤーを動かした
- プレハブでオブジェクトを生成した
- 当たり判定を設定した
- UI でスコアを表示した
という形でゲームの要素を学んできました。
しかし、それらを1つのゲームにまとめる実践をしていません。
落ち物キャッチゲーム
を作って、学んだことを総合的に使います。
今回は 上から落ちるオブジェクトをプレイヤーでキャッチする ゲームを作ります。
今日作るもの
- プレイヤーが左右に動く
- 上からアイテムが落ちてくる
- プレイヤーがアイテムに触れるとスコアが増える
- スコアを UI に表示する
必要なオブジェクト
| オブジェクト | 役割 |
|---|---|
| Player | 左右キーで動く。Collider2D(Trigger)、Rigidbody2D |
| Item(プレハブ) | 上から落ちる。Collider2D(Trigger)、Rigidbody2D |
| Spawner | 一定間隔で Item を生成する空オブジェクト |
| Canvas / Text | スコア表示 |
| Main Camera | ゲーム画面を写す |
手順1:プレイヤーを作る
- 2D Object → Sprite で Player を作成
- Rigidbody2D を追加(Gravity Scale = 0)
- Box Collider 2D を追加、Is Trigger をオン
- Tag を "Player" に設定
- PlayerController スクリプトと PlayerInput をアタッチ(Actions に InputSystem_Actions、Default Map を Player に設定)
手順2:アイテムのプレハブを作る
- 2D Object → Sprite で Item を作成
- Rigidbody2D を追加(Gravity Scale = 1 で落下)
- Box Collider 2D を追加、Is Trigger をオン
- Tag を "Item" に設定
- ItemController スクリプトをアタッチ(下に落ちたら Destroy)
- Project にドラッグしてプレハブ化。Hierarchy からは削除
手順3:スポナーを作る
- 空の GameObject を作成し、ItemSpawner と名付ける
- ItemSpawner スクリプトをアタッチ
- Inspector で itemPrefab に Item プレハブを割り当て
手順4:スコアを表示する
- Canvas → UI → Text でスコア表示用の Text を作成
- 空の GameObject に ScoreManager をアタッチ
- ScoreManager の scoreText に Text を割り当て
完成コード例
PlayerController.cs
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerController : MonoBehaviour
{
[SerializeField] private float speed = 5f;
private Vector2 moveInput;
void OnMove(InputValue value)
{
moveInput = value.Get<Vector2>();
}
void Update()
{
float moveX = moveInput.x * speed * Time.deltaTime;
transform.Translate(moveX, 0, 0);
}
}※プレイヤーに PlayerInput をアタッチし、Actions に InputSystem_Actions、Default Map を Player に設定してください。
ItemController.cs
using UnityEngine;
public class ItemController : MonoBehaviour
{
void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
FindObjectOfType<ScoreManager>().AddScore(10);
Destroy(gameObject);
}
}
void Update()
{
if (transform.position.y < -6f)
Destroy(gameObject); // 画面外で削除
}
}ItemSpawner.cs
using UnityEngine;
public class ItemSpawner : MonoBehaviour
{
[SerializeField] private GameObject itemPrefab;
[SerializeField] private float interval = 1.5f;
void Start()
{
InvokeRepeating("Spawn", 1f, interval);
}
void Spawn()
{
float x = Random.Range(-4f, 4f);
Instantiate(itemPrefab, new Vector3(x, 6, 0), Quaternion.identity);
}
}ScoreManager.cs
using UnityEngine;
using UnityEngine.UI;
public class ScoreManager : MonoBehaviour
{
[SerializeField] private Text scoreText;
private int score = 0;
public void AddScore(int points)
{
score += points;
scoreText.text = "スコア: " + score;
}
}プログラムの流れ
ゲーム開始
↓
ItemSpawner が一定間隔で Item を生成
↓
Item が落下、Player に触れると OnTriggerEnter2D
↓
ScoreManager.AddScore でスコア加算、Item を Destroy
↓
スコアが UI に表示される重要ポイント
落ち物キャッチゲームは、これまで学んだ要素の集大成です。
- プレイヤー … 入力で左右移動
- プレハブ … Item を Instantiate で生成
- 当たり判定 … OnTriggerEnter2D でキャッチを検知
- UI … スコアを Text で表示
- Destroy … キャッチした Item と画面外の Item を削除
発展アイデア
- ゲームオーバー … 一定時間で終了、または落ちたアイテムが一定数超えたら終了
- 複数種類のアイテム … 得点が違う、悪いアイテム(マイナス)など
- 効果音 … キャッチ時に SE を再生
- ハイスコア … PlayerPrefs で保存
補足:次の第16回について
第16回では、このシーンを横スクロールアクション用に作り替えていきます。PlayerController やオブジェクト構成が変わるため、落ち物キャッチの内容は上書きされます。落ち物パズルシリーズに進みたい場合は、プロジェクトをコピーしておくとよいです(シーンを別名で保存するだけでは、PlayerController が上書きされるため落ち物キャッチは再現できません)。