【Unity/2D】スイカゲーム風の落ち物ゲームを作ってみる話 #10 ゲームのリトライ機能を作る

記事をご覧いただき、誠にありがとうございます。

投稿主の無能です。

前回は、次の果物の色を表示する機能を実装しました。

今回はゲームをリトライする機能を作りたいと思います。

ゲームのリトライ

ゲームのリトライ機能と言っても、同じシーンを再読み込みしてやればゲームは開始時に戻ります。

ということで、UIにリトライボタンを追加しましょう。

リトライボタンの追加

UI_GameOverをアクティブにして、メニュー > UI > Button - TextMeshProで「Retry」というボタンを追加してUI_GameOverの子オブジェクトにします。

UI_GameOverをアクティブにする

メニュー > UI > Button - TextMeshProで「Retry」というボタンを追加する

「Retry」というボタンを追加してUI_GameOverの子オブジェクトにする

そしてRetryの子オブジェクトの表示テキストを編集して、ボタンを配置します。

表示テキストを編集する

ボタンを配置

Gameビュー

そしてUI_GameOverを非アクティブに戻します。

UI_GameOverを非アクティブにする

これで下準備が整ったので、スクリプトを編集を編集します。

スクリプトを編集

今回はスクリプトを追加せずGameManagerに追記していきます。

GameManager.cs

using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    #region Var-GameOverUI
    [Header("ゲームオーバーのUI")]
    [SerializeField] GameObject UI_GameOver;
    #endregion

    #region Var-ScoreUI
    [Header("得点の数字部分のオブジェクト")]
    [SerializeField] TMP_Text UI_ScoreText;
    #endregion

    #region Var-Internal
    public static bool isGameOver = false;                                      // ゲームオーバーのフラグ
    int currentScore = 0;                                                       // 現在のスコア
    #endregion

    #region Start
    void Start()
    {
        // スコアの更新
        ScoreUpdate();
    }
    #endregion

    #region Update
    void Update()
    {
        // ゲームオーバーのフラグがtrueだった場合
        if (isGameOver)
        {
            // ゲームオーバーのUIが非アクティブの場合
            if(!UI_GameOver.activeInHierarchy)
            {
                // ゲームオーバー処理
                GameOver();
            }
        }
    }
    #endregion

    #region GameOver
    // ゲームオーバー
    void GameOver()
    {
        // ゲームオーバーのUIをアクティブ
        UI_GameOver.SetActive(true);
    }
    #endregion

    #region GameRetry
    // ゲームのリトライ
    public void GameRetry()
    {
        // ゲームオーバーのフラグをfalse
        isGameOver = false;
        // ゲームオーバーのUIを非アクティブ
        UI_GameOver.SetActive(false);
        // 現在のシーンを再読み込み
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
    #endregion

    #region AddScore
    // スコアの加算
    public void AddScore(int score)
    {
        // スコアを加算
        currentScore += score;
        // スコアの更新
        ScoreUpdate();
    }
    #endregion

    #region ScoreUpdate
    // スコアの更新
    void ScoreUpdate()
    {
        // 現在のスコアをUIに反映
        UI_ScoreText.SetText(currentScore.ToString());
    }
    #endregion
}

今回は追加したメンバ変数はありませんが、usingにSceneManagementを追加しています。
では処理を見ていきます。

GameRetry関数

GameRetry関数は、スクリプト外のボタンからアクセスされるので、アクセス範囲をpublicにしています。

まずゲームオーバーのフラグをfalseにして、UI_GameOverを非アクティブにします。

そして現在のシーン名を取得して、その名前のシーンを再読み込みします。

ではスクリプトが編集できたので、Unityでの作業をします。

Unityでの作業

RetryボタンのButtonコンポーネントに、OnClick()というボタンが押し下げられた時に呼び出す関数を設定します。

OnClick()にGameManagerのGameRetry関数を設定する

この時の注意なのですが、左下のGameManagerを設定する際に、オブジェクト選択画面を開くとデフォルトではAssetタブが選択されています。

そのタブをSceneタブに切り替え、GameManagerを設定します。

オブジェクト選択画面はSceneタブに切り替えてGameManagerを設定

すると右側のアクセス可能な一覧が表示されるので、GameManager > GameRetry関数を設定します。

アクセス可能な一覧が表示されるのでGameManager > GameRetry関数を設定

これで準備ができたので動作確認をします。

動作確認

今回の確認事項は
  • ゲームオーバーになったらリトライのボタンが表示されるか
  • リトライボタンを押してゲーム開始時の状態で遊べるか
  • ゲーム再開時はUI_GameOverは非アクティブになっているか
になります。

では確認しましょう。

ゲームオーバーになったらリトライボタンが表示された

リトライボタンを押して再度遊べるようになった

ゲームオーバーの表示も消えて、再び遊べるようになりました。

まとめ

今回は
  • ゲームオーバーの表示の際にリトライボタンを追加した
  • ゲームを繰り返し遊べるようにリトライ機能を実装した
という事をやりました。

ここまでお疲れ様でした。

これでスイカゲームの基本的な機能は実装出来たと思うので、後は見た目を整えたりBGMや効果音を付けたり、またはオリジナルの要素を足したりして、ゲームの肉付けをして面白いゲームに仕上げてみてください。

それではまた、何時か何処かで!

コメント