学習記事一覧 · Unity基礎

【学習】落ち物キャッチゲーム(ミニゲーム実践①)

これまでの学習では、

  • プレイヤーを動かした
  • プレハブでオブジェクトを生成した
  • 当たり判定を設定した
  • UI でスコアを表示した

という形でゲームの要素を学んできました。

しかし、それらを1つのゲームにまとめる実践をしていません。

落ち物キャッチゲーム

を作って、学んだことを総合的に使います。

今回は 上から落ちるオブジェクトをプレイヤーでキャッチする ゲームを作ります。

今日作るもの

  • プレイヤーが左右に動く
  • 上からアイテムが落ちてくる
  • プレイヤーがアイテムに触れるとスコアが増える
  • スコアを UI に表示する

必要なオブジェクト

オブジェクト 役割
Player 左右キーで動く。Collider2D(Trigger)、Rigidbody2D
Item(プレハブ) 上から落ちる。Collider2D(Trigger)、Rigidbody2D
Spawner 一定間隔で Item を生成する空オブジェクト
Canvas / Text スコア表示
Main Camera ゲーム画面を写す

手順1:プレイヤーを作る

  1. 2D Object → Sprite で Player を作成
  2. Rigidbody2D を追加(Gravity Scale = 0)
  3. Box Collider 2D を追加、Is Trigger をオン
  4. Tag を "Player" に設定
  5. PlayerController スクリプトと PlayerInput をアタッチ(Actions に InputSystem_Actions、Default Map を Player に設定)

手順2:アイテムのプレハブを作る

  1. 2D Object → Sprite で Item を作成
  2. Rigidbody2D を追加(Gravity Scale = 1 で落下)
  3. Box Collider 2D を追加、Is Trigger をオン
  4. Tag を "Item" に設定
  5. ItemController スクリプトをアタッチ(下に落ちたら Destroy)
  6. Project にドラッグしてプレハブ化。Hierarchy からは削除

手順3:スポナーを作る

  1. 空の GameObject を作成し、ItemSpawner と名付ける
  2. ItemSpawner スクリプトをアタッチ
  3. Inspector で itemPrefab に Item プレハブを割り当て

手順4:スコアを表示する

  1. Canvas → UI → Text でスコア表示用の Text を作成
  2. 空の GameObject に ScoreManager をアタッチ
  3. 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 が上書きされるため落ち物キャッチは再現できません)。