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();で進行状況をリセットすることも可能。

これで、ゲームを終了してもクリアデータが保持され、次回プレイ時に 解放されたステージがそのまま選択可能 になります!
🔐 ステージアンロックやセーブ機能を一気に解決したいなら…
ゲームの進行状況をしっかり保存したい、でも複雑なセーブ処理はちょっと不安…そんな方にぴったりなのがこちら!
👉 Easy Save – The Complete Save & Load System
このアセットを使えば、プレイヤーのステージクリア状況やアンロックデータもわずか数行のコードで簡単に保存&読み込みできちゃいます!
PlayerPrefsの限界を感じた方にもおすすめ。暗号化や自動バックアップなど、商用ゲームでも安心して使える本格仕様です!
あわせて読みたい
ステージ選択や進行管理に関連する仕組みをさらに学びたい方には、以下の記事もおすすめです!
- 🔄 初心者向け!Unityでシーンを切り替える簡単な方法
➡ ステージ切り替えの基本をしっかり学べます! - 💾 Unity初心者必見!Easy Save 3でスムーズなデータ管理を実現する方法
➡ ステージのクリア状態を保存するならこのツール! - 🎮 Unity初心者でもできる!簡単インベントリシステムの作り方
➡ ステージ報酬やアイテム管理にも役立つ知識が満載! - 🎥 Unityで背景を無限スクロールさせる方法【初心者向け】
➡ ステージの演出や没入感アップにぴったり! - 🔊 初心者必見!Unityでのオーディオソース設定と音の切り替え方法
➡ ステージ開始・クリア時の効果音演出に応用できます。
5. まとめ
今回の記事では、Unityでステージクリア後に次のステージを解放し、ステージセレクト画面で選択可能にする方法 を解説しました。
このシステムの流れをおさらいすると、以下のようになります。
- ステージ選択画面を作成
- すべてのステージボタンを用意し、クリア前とクリア後の状態を分ける。
- 解放前のボタンは半透明にし、解放後のボタンは非表示に設定。
- スクリプトでステージ解放を管理
PlayerPrefsを使ってクリアしたステージの情報を保存。Save_numの値を基に、解放されるステージをSetActive(true)で表示。
- ステージクリア時にデータを保存
StageClear()関数を実行してPlayerPrefs.SetInt("SCORE", クリアステージ番号)で保存。PlayerPrefs.Save()を実行し、ゲームを終了してもデータが残るようにする。
この方法を使えば、プレイヤーがクリアしたステージに応じて、次のステージを順番に解放していく仕組み を簡単に作ることができます。
次のステップ
このステージ解放システムをさらに発展させるには、次のような機能を追加してみるのもおすすめです。
✅ ステージごとにクリアデータを保存
→ 各ステージごとの進行状況を PlayerPrefs に保存し、星の獲得数やスコアを表示する機能を追加!
✅ UIエフェクトの追加
→ ステージが解放されたときにアニメーションやサウンドを追加すると、より魅力的な演出に!
✅ ゲーム全体の進行度を管理
→ ステージ1〜10 だけでなく、複数のワールドや章ごとの進行を管理するシステムを作ると本格的なゲームに!

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







※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。
※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。