Unityゲームの作り方メモフラッピーバード

【Unity】フラッピーバード風ゲームの作り方③~ゲームオーバーを実装する

Unity

1. はじめに

Unityでゲームを作っていると、プレイヤーがゲームオーバーになる場面をどのように実装するか悩むことがありますよね。特に初心者にとって、ゲームオーバー後に再挑戦できる機能を追加するのは少し難しそうに感じるかもしれません。

この記事では、フラッピーバード風ゲームにおいて、簡単に「ゲームオーバー」を実装する方法をステップバイステップで解説します。具体的には、プレイヤーが障害物にぶつかったり、画面外に出たりしたときにゲームオーバーと判定し、再挑戦できる仕組みを作ります。

これを実装することで、プレイヤーの体験をより本格的にし、完成度の高いゲームを作れるようになります。初心者でもわかりやすいように、実際のコード例やUnityエディターでの設定手順も丁寧に説明するので、安心して取り組んでくださいね!



2. GameManagerスクリプトの作成

ゲームの進行や状態を管理する「GameManagerスクリプト」を作成しましょう。このスクリプトは、ゲームオーバー時のパネル表示やリトライ機能をコントロールする重要な役割を担います。

スクリプトの作成手順

  1. スクリプトを作成する
    • プロジェクトウィンドウで右クリックして「Create」→「C# Script」を選択します。
    • スクリプト名を「GameManager」と入力して作成します。
  2. GameManagerオブジェクトを作成する
    • ヒエラルキーウィンドウで右クリックし、「Create Empty」を選択します。
    • 作成した空のオブジェクトを「GameManager」と名前を変更します。
    • 先ほど作成した「GameManager」スクリプトをこのオブジェクトにドラッグ&ドロップしてアタッチします。
  3. GameManagerスクリプトを編集する
    • 作成したスクリプトをダブルクリックして開き、以下のコードを入力してください。
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    [SerializeField] GameObject gameOverPanel;

    // ゲームオーバー時にパネルを表示する
    public void GameOver() 
    {
        gameOverPanel.SetActive(true);
    }

    // リトライ機能の実装
    public void Retry() 
    {
        // ""の間にシーン名を入力する
        SceneManager.LoadScene("SampleScene");
    }
}

コードのポイント解説

  1. [SerializeField]を使ったフィールド
    • gameOverPanelは、ゲームオーバー時に表示するUIパネルを操作するためのフィールドです。
    • インスペクター上で設定できるように[SerializeField]を付けています。
  2. GameOver()メソッド
    • このメソッドは、ゲームオーバー時に呼び出され、指定したgameOverPanelを表示します。
  3. Retry()メソッド
    • リトライボタンが押されたときに現在のシーンを再読み込みします。
    • "SampleScene"部分には、実際に使用するシーン名を記入してください。

これでGameManagerスクリプトの準備は完了です!次はゲームオーバーを通知するUIの作成に進みましょう。



3. ゲームオーバー用UIの作成

ゲームオーバー時にプレイヤーにわかりやすく通知するためのUIを作成します。ここでは、「ゲームオーバー」と表示するパネルと、リトライボタンを設置する手順を解説します。


ゲームオーバーパネルを作成する

  1. パネルの作成
    • ヒエラルキーウィンドウで右クリックして、UIPanel を選択します。
    • 作成したパネルに「GameOverPanel」という名前を付けます。
  2. パネルのデザイン設定
    • インスペクターウィンドウでパネルを選択し、次のように設定を変更します:
      • サイズ:W: 1920, H: 1080(画面全体を覆うサイズ)
      • 色:背景色を半透明の黒(#00000080)に設定します。
  3. テキストを追加する
    • GameOverPanelを右クリックして、UILegacyText を選択します。
    • 作成したテキストに「GameOverText」という名前を付け、内容を「Game Over」と入力します。
    • インスペクターウィンドウで以下の設定を変更します:
      • フォントサイズ:140
      • サイズ:W: 1600, H: 300
      • 配置:中央揃え(Align Centerを設定)
      • 色:赤(例:#FF0000

リトライボタンを作成する

  1. ボタンの追加
    • GameOverPanelを右クリックして、UILegacyButton を選択します。
    • 作成したボタンに「RetryButton」という名前を付けます。
  2. ボタンのデザイン設定
    • インスペクターウィンドウで以下のように設定を変更します:
      • サイズ:W: 400, H: 100
      • 配置:中央下部に移動(例:Position Y: -100
      • ボタンのテキストを「Retry」に変更します。
  3. OnClickイベントを設定
    • RetryButtonの**Button (Script)**セクションを展開し、OnClick()イベントを設定します。
    • ヒエラルキーウィンドウGameManagerをドラッグして、OnClick()のフィールドにドロップします。
    • 関数を選択で、GameManager → Retry()を指定します。

GameManagerとの連携

  • GameOverPanelを非表示に設定します:
    • インスペクターでGameOverPanelを選択し、Activeチェックボックスをオフにします。
  • GameManagerスクリプトgameOverPanelフィールドに、作成したGameOverPanelを割り当てます。

これで、ゲームオーバー用のUIは完成です!次は、プレイヤーが障害物に衝突したり、画面外に出た場合にこのUIを表示する機能を実装していきます。



4. PlayerControllerスクリプトの修正

ゲームオーバーを適切に機能させるには、PlayerControllerスクリプトにコードを追加し、以下の二つの条件でゲームオーバーを判定します。

  1. プレイヤーが障害物にぶつかった場合
  2. プレイヤーが画面外に出た場合

PlayerControllerスクリプトの編集手順

  1. スクリプトを開く
    Unityエディターの「Project」ウィンドウから、前回作成した PlayerController スクリプトをダブルクリックして開きます。
  2. コードを追加する
    以下のコードを PlayerController スクリプトに追加してください。
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // 上昇する速度
    [SerializeField] float upSpeed = 5f;
    // ゲームオーバーかどうかの判定
    bool isDead = false;
    
    [SerializeField] GameManager gameManager; // GameManagerへの参照
    Rigidbody2D rb;

    private void Start()
    {
        // Rigidbodyを取得
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // 毎フレームの処理
        Jump();
        OffScreen();
    }

    void Jump()
    {
        // スペースキーで上昇する処理
        if (!isDead && Input.GetKeyDown(KeyCode.Space))
        {
            rb.velocity = new Vector2(0, upSpeed);
        }
    }

    void GameOver()
    {
        // GameManagerのGameOverメソッドを呼び出す
        gameManager.GameOver();
        isDead = true; // ゲームオーバー状態にする
    }

    void OffScreen()
    {
        // 画面外に出た場合のゲームオーバー判定
        if (transform.position.y < -6 || transform.position.y > 6)
        {
            GameOver();
        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        // 障害物にぶつかった場合のゲームオーバー処理
        if (isDead)
        {
            return; // ゲームオーバーなら処理を行わない
        }
        GameOver();
    }
}

コードの解説

  1. GameOver() メソッド
    • GameManager に用意した GameOver() メソッドを呼び出し、ゲームオーバーパネルを表示します。
    • 同時に isDead フラグを true にして、プレイヤーの操作を無効化します。
  2. OffScreen() メソッド
    • プレイヤーの y 座標が特定範囲(-6~6)を超えた場合、ゲームオーバーを発生させます。
    • ゲーム画面の高さに応じて範囲を調整してください。
  3. OnCollisionEnter2D() メソッド
    • プレイヤーが障害物(例: PipeやGroundなど)に衝突した場合、ゲームオーバーを発生させます。
    • すでに isDeadtrue の場合は処理をスキップします。

必要な設定

コードを書き終えたら、Unityエディターで以下の設定を行いましょう:

  1. GameManagerの参照を設定する
    「Hierarchy」ウィンドウで Bird(プレイヤーオブジェクト)を選択し、インスペクターで PlayerController スクリプト内の GameManager 欄に、GameManager オブジェクトをドラッグ&ドロップします。

この修正により、プレイヤーの操作とゲームオーバー判定が適切に機能するようになります!次は、テストプレイで最終確認を行いましょう。



5. ゲームオーバー機能のテストプレイ

ここまで設定が完了したら、実際にゲームをプレイしてゲームオーバー機能が正しく動作しているかをテストしてみましょう!

1. テストプレイを開始する

Unityエディターの上部にある「▶(再生)」ボタンをクリックして、ゲームを実行します。鳥が動き出し、障害物や地面などと接触した場合にゲームオーバーパネルが表示されるか確認しましょう。

2. 動作チェックリスト

以下のチェックポイントを確認してください:

  • 障害物と衝突した場合にゲームオーバーパネルが表示されるか?
  • 画面の上下に出た場合にゲームオーバーパネルが表示されるか?
  • 「Retry」ボタンをクリックしたとき、ゲームがリスタートされるか?

3. よくあるミスと対処法

テスト中に何か問題が起きた場合は、以下を参考にトラブルシューティングを行いましょう。

  • ゲームオーバーパネルが表示されない
    • GameManagerスクリプトの gameOverPanel に正しいパネルオブジェクトが割り当てられているか確認してください。
    • GameOverPanel がインスペクターで「非表示」に設定されているか確認しましょう。
  • リトライボタンが動作しない
    • ボタンの OnClick イベントに GameManager スクリプトの Retry メソッドが設定されているか確認してください。
    • SceneManager.LoadScene に指定するシーン名が正しいか、シーンがビルド設定に追加されているかを確認します。
  • 鳥が正しく動作しない
    • PlayerController スクリプト内の gameManager フィールドに GameManager オブジェクトが割り当てられているか確認してください。

4. テスト結果の確認と修正

テストプレイで確認した問題点を修正したら、再度「再生」ボタンをクリックして動作を確認しましょう。すべてが正しく動作するまで、コードや設定を調整してください。


これでゲームオーバー機能の実装とテストプレイは完了です!しっかり動作を確認して、次の機能追加に進みましょう。



よくある質問(FAQ)

Q
シーンが読み込まれない場合はどうすればいいですか?
A

シーンが読み込まれない場合、以下の点を確認してください:

  1. シーンがビルドセッティングに追加されているか確認
    Unityのメニューバーから「File」→「Build Settings」を選択し、「Scenes in Build」にシーンがリストアップされているか確認してください。リストにない場合は「Add Open Scenes」をクリックして追加しましょう。
  2. シーン名のスペルミスを確認
    SceneManager.LoadScene("SampleScene")の”SampleScene”が正しいシーン名になっているか確認してください。
  3. エラーが発生していないか確認
    コンソールウィンドウにエラーメッセージが表示されている場合は、コードの記述ミスや依存関係をチェックしてください。
Q
ボタンが機能しない場合の対処法は?
A

ボタンが動作しない場合、以下を確認してください:

  1. OnClickに正しい関数が設定されているか確認
    ボタンの「OnClick」に「GameManager」の「Retry」関数が設定されているか確認してください。設定が漏れている場合、インスペクターで対象の関数を追加してください。
  2. GameManagerスクリプトが正しくアタッチされているか確認
    ヒエラルキー内の空のオブジェクト「GameManager」にスクリプトがアタッチされているか確認してください。
  3. ボタンのUI設定
    ボタンが正しく配置されているか、クリックできる状態(他のUIに隠れていないなど)を確認してください。Canvasの「Order in Layer」や「Raycast Target」を調整する必要がある場合があります。
Q
ゲームオーバーパネルが表示されない場合の確認事項は?
A

ゲームオーバーパネルが表示されない場合は以下をチェックしてください:

  1. GameManagerの「gameOverPanel」に正しいオブジェクトが設定されているか
    「GameManager」スクリプトのインスペクターで「gameOverPanel」フィールドに、作成した「GameOverPanel」オブジェクトが設定されているか確認してください。
  2. GameOverPanelの初期設定が非表示になっているか
    ゲーム開始時にパネルが非表示になっているか確認してください。インスペクターで「GameOverPanel」のチェックを外しておく必要があります。
  3. コードの記述が正しいか
    gameOverPanel.SetActive(true);が正しく記述されているか確認してください。また、GameManagerがPlayerControllerから正しく呼び出されているかもチェックしましょう。

おすすめのアセット

「Playmaker Floppy Template」は、Unityの「フラッピーバード」スタイルのゲームを簡単に作成できるテンプレートです。このアセットは、Playmakerを使用して視覚的にプログラムできるので、コードを書かずにゲームロジックを構築できます。キャラクターの動きや障害物の生成、スコア管理など、基本的な機能がすべて含まれており、短時間でプロトタイプを作成可能です。