1. はじめに
ゲームを作るとき、「ステージクリア後に次のステージを解放する」仕組みは必須ですよね!
例えば、ステージ1をクリアしたらステージ2が遊べるようになる、といった流れです。
この機能があれば、プレイヤーに達成感を与え、ゲームの進行管理もしやすくなります。
でも、どうやって実装すればいいのか悩むことも多いはず。
そこでこの記事では、 「Unityでステージクリア後に次のステージを解放する方法」 を初心者向けにわかりやすく解説します!
この方法でできること
- ステージクリア後に次のステージを選択可能にする
- クリア済みのステージデータを保存し、ゲームを再起動しても保持する
PlayerPrefs
を使って簡単にデータ管理する
コードを書くだけで 簡単にステージ管理ができる方法 なので、Unity初心者でもすぐに実装できます!
それでは、さっそく作っていきましょう! 🎮✨
2. ステージセレクト画面を作成
ゲームでステージを選択する画面を作るには、 解放前と解放後のボタンを用意 し、それぞれの状態を切り替える必要があります。
ここでは、 すべてのステージを選択できるボタンを作成 し、 未解放のステージは非アクティブ にする方法を解説します。
① ステージボタンを作成
まず、Unityの Canvas
内に ステージ選択用のボタン を作成しましょう。
- Hierarchy(ヒエラルキー)ウィンドウで右クリック
UI
→Button
を選択- 作成したボタンを
StageButton1
などの名前に変更 - ボタンのテキストを「ステージ1」などに変更
この手順を繰り返して、 StageButton1
から StageButton10
まで 10個のステージボタン を作成してください。
ボタンの配置は Grid Layout Group を使うと、整列しやすくなります。
② 解放前と解放後のボタンを作成
次に、 解放前のボタンと解放後のボタン をそれぞれ作成します。
解放後のボタン
クリア後に選択できるボタンを準備します。
- 作成したボタンを複製(Ctrl + D / Command + D)
- 名前を
StageButton1_Unlock
などに変更 Inspector
の Interactable(インタラクト可能)をオン- 最初は非表示にするため、チェックを外す

解放前のボタン
未クリアのステージは選択できないようにするため、半透明にします。
- 解放後のボタンを コピー
- 名前を
StageButton1_Locked
などに変更 Inspector
の Image コンポーネントのカラー(Color)を変更- アルファ(A)の値を50%程度に設定(半透明にする)
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); // 未解放のボタンを非表示
}
}
}
}
スクリプトの解説
このスクリプトのポイントは次のとおりです。
- PlayerPrefsを使って進行度を保存・取得
Save_num = PlayerPrefs.GetInt("SCORE", 0);
→ PlayerPrefs からSCORE
の値を取得し、プレイヤーの進行度を管理します。
- ステージごとのボタンを管理
stageSelect[]
に ステージ選択ボタン をセットfor
ループを使い、Save_num
の値に応じて解放済みのボタンをSetActive(true)
にする
② スクリプトをオブジェクトにアタッチ
次に、作成した StageSelect
スクリプトを 空のオブジェクト にアタッチします。
- ヒエラルキー(Hierarchy)ウィンドウ で、
GameObject
→Create Empty
を選択(空のオブジェクトを作成) - 作成したオブジェクトの名前を 「StageManager」 に変更
- StageManager に
StageSelect
スクリプトをドラッグ&ドロップしてアタッチ - 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(); // データを保存
}
}
処理のポイント
- 現在の進行状況を取得
PlayerPrefs.GetInt("SCORE", 0);
で、すでに保存されているクリアデータを取得します。 - 新しい進行状況を更新するか判断
クリアしたステージ(stageNumber
)がSCORE
より大きい場合のみ、データを更新します。
→ これにより、すでにクリア済みのステージを何度クリアしてもSCORE
が下がることはありません。 - 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でステージクリア後に次のステージを解放し、ステージセレクト画面で選択可能にする方法 を解説しました。
このシステムの流れをおさらいすると、以下のようになります。
- ステージ選択画面を作成
- すべてのステージボタンを用意し、クリア前とクリア後の状態を分ける。
- 解放前のボタンは半透明にし、解放後のボタンは非表示に設定。
- スクリプトでステージ解放を管理
PlayerPrefs
を使ってクリアしたステージの情報を保存。Save_num
の値を基に、解放されるステージをSetActive(true)
で表示。
- ステージクリア時にデータを保存
StageClear()
関数を実行してPlayerPrefs.SetInt("SCORE", クリアステージ番号)
で保存。PlayerPrefs.Save()
を実行し、ゲームを終了してもデータが残るようにする。
この方法を使えば、プレイヤーがクリアしたステージに応じて、次のステージを順番に解放していく仕組み を簡単に作ることができます。
次のステップ
このステージ解放システムをさらに発展させるには、次のような機能を追加してみるのもおすすめです。
✅ ステージごとにクリアデータを保存
→ 各ステージごとの進行状況を PlayerPrefs
に保存し、星の獲得数やスコアを表示する機能を追加!
✅ UIエフェクトの追加
→ ステージが解放されたときにアニメーションやサウンドを追加すると、より魅力的な演出に!
✅ ゲーム全体の進行度を管理
→ ステージ1〜10
だけでなく、複数のワールドや章ごとの進行を管理するシステムを作ると本格的なゲームに!

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