UnityUnityメモ

【初心者向け】Unityでステージ選択システムを実装!クリア後に次のステージを解放しよう

Unity

1. はじめに

ゲームを作るとき、「ステージクリア後に次のステージを解放する」仕組みは必須ですよね!
例えば、ステージ1をクリアしたらステージ2が遊べるようになる、といった流れです。

この機能があれば、プレイヤーに達成感を与え、ゲームの進行管理もしやすくなります。
でも、どうやって実装すればいいのか悩むことも多いはず。

そこでこの記事では、 「Unityでステージクリア後に次のステージを解放する方法」 を初心者向けにわかりやすく解説します!

この方法でできること

  • ステージクリア後に次のステージを選択可能にする
  • クリア済みのステージデータを保存し、ゲームを再起動しても保持する
  • PlayerPrefs を使って簡単にデータ管理する

コードを書くだけで 簡単にステージ管理ができる方法 なので、Unity初心者でもすぐに実装できます!
それでは、さっそく作っていきましょう! 🎮✨




2. ステージセレクト画面を作成

ゲームでステージを選択する画面を作るには、 解放前と解放後のボタンを用意 し、それぞれの状態を切り替える必要があります。
ここでは、 すべてのステージを選択できるボタンを作成 し、 未解放のステージは非アクティブ にする方法を解説します。


① ステージボタンを作成

まず、Unityの Canvas 内に ステージ選択用のボタン を作成しましょう。

  1. Hierarchy(ヒエラルキー)ウィンドウで右クリック
  2. UIButton を選択
  3. 作成したボタンを StageButton1 などの名前に変更
  4. ボタンのテキストを「ステージ1」などに変更

この手順を繰り返して、 StageButton1 から StageButton10 まで 10個のステージボタン を作成してください。
ボタンの配置は Grid Layout Group を使うと、整列しやすくなります。


② 解放前と解放後のボタンを作成

次に、 解放前のボタンと解放後のボタン をそれぞれ作成します。

解放後のボタン

クリア後に選択できるボタンを準備します。

  1. 作成したボタンを複製(Ctrl + D / Command + D)
  2. 名前を StageButton1_Unlock などに変更
  3. InspectorInteractable(インタラクト可能)をオン
  4. 最初は非表示にするため、チェックを外す

解放前のボタン

未クリアのステージは選択できないようにするため、半透明にします。

  1. 解放後のボタンを コピー
  2. 名前を StageButton1_Locked などに変更
  3. InspectorImage コンポーネントのカラー(Color)を変更
    • アルファ(A)の値を50%程度に設定(半透明にする)
  4. Button コンポーネントを削除(クリックできないようにする)

この手順を すべてのステージボタンに適用 すれば、ステージ選択画面の基本が完成します。




3. ステージ解放のスクリプトを作成

ステージセレクト画面を作成したら、次に ステージ解放を管理するスクリプト を作成していきましょう!
ここでは PlayerPrefs を使って、プレイヤーがクリアしたステージの情報を保存し、次のステージを解放する仕組みを作ります。


ステージ解放スクリプトの作成

まずは スクリプトを作成 して、ステージの解放処理を実装します。

① スクリプトの作成

プロジェクトウィンドウを右クリックして、
「Create」→「C# Script」 を選び、スクリプトを作成します。
名前は 「StageSelect」 にしましょう。

作成したスクリプトを開き、以下のコードを入力してください。

using UnityEngine;

public class StageSelect : MonoBehaviour
{
    public int Save_num; // 進行度を保存する変数
    public GameObject[] stageSelect = default; // ステージ選択ボタンの配列

    void Start()
    {
        // PlayerPrefsから現在のステージ進行度を取得
        Save_num = PlayerPrefs.GetInt("SCORE", 0);

        // ステージの解放状態をチェック
        for (int i = 0; i < stageSelect.Length; i++) 
        {
            if (i < Save_num) 
            {
                stageSelect[i].SetActive(true); // 解放済みのボタンを表示
            }
            else 
            {
                stageSelect[i].SetActive(false); // 未解放のボタンを非表示
            }
        }
    }
}

スクリプトの解説

このスクリプトのポイントは次のとおりです。

  1. PlayerPrefsを使って進行度を保存・取得
    • Save_num = PlayerPrefs.GetInt("SCORE", 0);
      PlayerPrefs から SCORE の値を取得し、プレイヤーの進行度を管理します。
  2. ステージごとのボタンを管理
    • stageSelect[]ステージ選択ボタン をセット
    • for ループを使い、 Save_num の値に応じて解放済みのボタンを SetActive(true) にする

② スクリプトをオブジェクトにアタッチ

次に、作成した StageSelect スクリプトを 空のオブジェクト にアタッチします。

  1. ヒエラルキー(Hierarchy)ウィンドウ で、
    GameObjectCreate Empty を選択(空のオブジェクトを作成)
  2. 作成したオブジェクトの名前を 「StageManager」 に変更
  3. StageManagerStageSelect スクリプトをドラッグ&ドロップしてアタッチ
  4. InspectorウィンドウStageSelect スクリプトの stageSelect[]解放後のボタン をすべてセット

③ ステージ解放の仕組み

PlayerPrefs に保存された SCORE の値を基準に、
解放済みのボタン」だけを表示する仕組みになっています。

例えば、 SCORE = 2 の場合:

  • stageSelect[0] → 表示(ステージ1 解放)
  • stageSelect[1] → 表示(ステージ2 解放)
  • stageSelect[2] → 非表示(ステージ3 以降は未解放)

ステージクリア時に SCORE の値を増やして、次のステージを解放する処理を追加します!
詳しくは 「4. ステージクリア時にデータを保存」 で解説します。




4. ステージクリア時にデータを保存

ステージをクリアしたら、次のステージが解放されるようにするためには、クリアしたステージのデータを保存 する必要があります。そのために、PlayerPrefs を使って進行状況を記録し、ゲームを再起動しても解放されたステージが保持されるようにしましょう。


ステージクリア時に PlayerPrefs にデータを保存する

ステージクリア時に PlayerPrefs を使って「どこまでクリアしたか」を保存します。
例えば、ステージ2をクリアしたら、次のステージ(ステージ3)が解放されるようにします。

以下のような関数を作成し、ステージをクリアしたタイミングで実行すると、進行度を更新できます。

public void StageClear(int stageNumber)
{
// 現在のSCOREを取得
int currentScore = PlayerPrefs.GetInt("SCORE", 0);

// クリアしたステージが現在のセーブデータよりも進んでいる場合、更新
if (stageNumber > currentScore)
{
PlayerPrefs.SetInt("SCORE", stageNumber);
PlayerPrefs.Save(); // データを保存
}
}

処理のポイント

  1. 現在の進行状況を取得
    PlayerPrefs.GetInt("SCORE", 0); で、すでに保存されているクリアデータを取得します。
  2. 新しい進行状況を更新するか判断
    クリアしたステージ(stageNumber)が SCORE より大きい場合のみ、データを更新します。
    → これにより、すでにクリア済みのステージを何度クリアしても SCORE が下がることはありません。
  3. PlayerPrefs にデータを保存
    PlayerPrefs.SetInt("SCORE", stageNumber); で進行状況を上書きし、
    PlayerPrefs.Save(); でデータを確実に保存します。

スクリプトをステージクリア時に呼び出す

この StageClear() 関数を、ステージをクリアしたタイミングで実行するようにしましょう。
例えば、ボスを倒した後やゴール地点に到達したときに、以下のように呼び出します。

void OnStageCleared()
{
StageClear(3); // ステージ3をクリアしたことを保存
}

保存データの動作確認

保存したデータは、ゲームを再起動しても保持される ため、しっかり動作するか確認しましょう。

動作確認には、以下のコードを実行すると SCORE の値がコンソールに表示されます。

void Start()
{
Debug.Log("現在のステージ進行度:" + PlayerPrefs.GetInt("SCORE", 0));
}

これを Unity の Console に表示して、正しく保存・更新されているかチェックできます。


データリセット(テスト用)

もし クリアデータをリセット したい場合は、以下のコードを実行すれば PlayerPrefs のデータを削除できます。

public void ResetProgress()
{
PlayerPrefs.DeleteAll(); // すべての保存データを削除
PlayerPrefs.Save();
}

これを実行すると、ゲーム開始時の状態に戻るので、テストの際に便利です。


まとめ

  • PlayerPrefs を使って、クリアしたステージの進行度を保存する。
  • PlayerPrefs.GetInt("SCORE", 0); で現在の進行度を取得する。
  • PlayerPrefs.SetInt("SCORE", stageNumber); でクリアしたステージを記録。
  • PlayerPrefs.Save(); を呼び出してデータを確実に保存。
  • PlayerPrefs.DeleteAll(); で進行状況をリセットすることも可能。

これで、ゲームを終了してもクリアデータが保持され、次回プレイ時に 解放されたステージがそのまま選択可能 になります!




5. まとめ

今回の記事では、Unityでステージクリア後に次のステージを解放し、ステージセレクト画面で選択可能にする方法 を解説しました。

このシステムの流れをおさらいすると、以下のようになります。

  1. ステージ選択画面を作成
    • すべてのステージボタンを用意し、クリア前とクリア後の状態を分ける。
    • 解放前のボタンは半透明にし、解放後のボタンは非表示に設定。
  2. スクリプトでステージ解放を管理
    • PlayerPrefs を使ってクリアしたステージの情報を保存。
    • Save_num の値を基に、解放されるステージを SetActive(true) で表示。
  3. ステージクリア時にデータを保存
    • StageClear() 関数を実行して PlayerPrefs.SetInt("SCORE", クリアステージ番号) で保存。
    • PlayerPrefs.Save() を実行し、ゲームを終了してもデータが残るようにする。

この方法を使えば、プレイヤーがクリアしたステージに応じて、次のステージを順番に解放していく仕組み を簡単に作ることができます。


次のステップ

このステージ解放システムをさらに発展させるには、次のような機能を追加してみるのもおすすめです。

ステージごとにクリアデータを保存
 → 各ステージごとの進行状況を PlayerPrefs に保存し、星の獲得数やスコアを表示する機能を追加!

UIエフェクトの追加
 → ステージが解放されたときにアニメーションやサウンドを追加すると、より魅力的な演出に!

ゲーム全体の進行度を管理
 → ステージ1〜10 だけでなく、複数のワールドや章ごとの進行を管理するシステムを作ると本格的なゲームに!

Unityのゲーム開発では、「ゲームの進行を管理する仕組み」 はとても重要です。
今回の方法を活用して、ステージ解放システムを作り、自分のゲームをさらにレベルアップさせてみてください!🎮✨


タイトルとURLをコピーしました