Unityでステージ制のゲームを作るとき、
「ステージ選択画面をどう作ればいいのか」
「クリアしたステージに応じて、次のステージを解放するにはどうするのか」
「ステージの解放状況を保存するにはどうすればいいのか」
で迷うことがあります。
ステージ選択画面を作るときは、ボタンを並べるだけでなく、クリア状況に応じたステージ解放、PlayerPrefsを使った保存処理、選択したステージへのシーン遷移も考える必要があります。
この記事では、Unityでステージ選択画面を作る方法を初心者向けに解説します。
ステージ選択画面の基本構成、ステージボタンの作り方、クリア状況に応じたステージ解放、PlayerPrefsを使った保存方法まで順番に紹介します。
この記事で分かること:
・Unityでステージ選択画面を作る流れ
・ステージボタンを配置して選択できるようにする方法
・クリア状況に応じて次のステージを解放する方法
・PlayerPrefsでステージ解放状況を保存する方法
・SceneManagerで選択したステージへシーン遷移する方法
バージョン
Unity:2021.3.22f1

Unityでステージ選択画面に使うシーンを準備する
最初に、ゲーム内の各ステージをシーンとして設計します。例えば、メインメニュー、レベル1、レベル2などの各ステージごとにシーンを作成します。Projectウィンドウで右クリックし、Create > Scene を選択して、各ステージ用のシーンを作成します。
今回は、例として「Stage1」~「Stage4」を作成しています。
実際にゲームで実装する際は、ステージ1のシーンを作成後に複製することがおすすめです。
ステージ1内容がコピーされるため、ゲーム作成後の方が手間が少なくなります。

Unityでステージ選択画面のUIを作成する
ここでは、以下のようなステージ選択画面のUIを作成します。
・各ステージ選択できる
・ステージは1つクリアすると次のステージが解放される

ステージ選択用のシーンを作成したら、次にステージを選ぶためのボタンを配置します。
Hierarchyウィンドウで右クリックし、UI > Button を選択してボタンを作成します。
作成したボタンの名前を「Stage1」に変更し、ボタン内のTextも「Stage1」に変更します。
同じ手順で「Stage1」〜「Stage4」までのボタンを作成します。
※画面上部の「Stage Select」という文字は、UI > Text を選択して配置しています。

ステージ選択ボタンを制御するスクリプトを作成する
PlayerPrefsでステージ解放状況を取得する
ここでは、ステージ選択ボタンを制御するスクリプトを作成します。
このスクリプトでは、PlayerPrefsに保存されたステージ解放状況を取得し、解放済みのステージだけボタンを押せるようにします。
また、ボタンを押したときに選択したステージへ移動する処理も行います。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class StageSelectManager : MonoBehaviour
{
// ボタンを配列として定義
[SerializeField] private Button[] _stageButton;
void Start()
{
// ステージのクリア数を取得
int stageUnlock = PlayerPrefs.GetInt("StageUnlock", 1);
// ステージボタンの表示・非表示の設定
for (int i = 0; i < _stageButton.Length; i++)
{
if (i < stageUnlock)
_stageButton[i].interactable = true;
else
_stageButton[i].interactable = false;
}
}
public void StageSelect(int stage)
{
// 受け取った引数(stage)のステージをロードする
SceneManager.LoadScene(stage);
}
}
SceneManagerで選択したステージへ移動する
ここでは、ステージボタンを押したときに、選択したステージへ移動できるように設定します。
ボタンのOnClick()にスクリプトを登録することで、クリック時にStageSelect()を実行できるようになります。
・Hierarchyウィンドウで右クリックし、”Create Empty” を選択して、「StageSelectManager」を作成します。
・作成したScriptをドラッグして、追加します。
・StageButtonの中にStage1~Stage4のボタンを追加します。
ステージ選択ボタンを押したあとに別のステージへ移動する処理は、シーン遷移の仕組みを使います。
SceneManager.LoadSceneを使った基本的なシーン遷移の方法は、以下の記事で解説しています。
Unityでシーン遷移を実装する方法

次に、各ボタンのInspectorを展開し、設定をします。
・先ほど作成した「StageSelectManager」をOnClick()にドラッグで追加します。
・右上のFunctionには「StageSelectManager.StageSelect」を選択します。
・右下は各ステージのステージ数の番号を格納します。
上記をステージ1~ステージ4までのボタンで設定を行います。

PlayerPrefsでクリア状況を保存し、次のステージを解放する
ステージをクリアした際に次のステージをアンロックする処理を実装します。
また、クリアできなかった場合はステージ選択画面に戻る処理も記載しています。
・クリアしたステージ数を取得
・クリアしたステージ数を加算
・次のステージをロードする
・クリアしていない場合は、ステージ選択画面に戻る
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class StageManager : MonoBehaviour
{
public void nextStage()
{
// ステージのクリア数を取得
int StageUnlock = PlayerPrefs.GetInt("StageUnlock", 1);
int NextScene = SceneManager.GetActiveScene().buildIndex + 1;
if (NextScene < 5)
{
if (StageUnlock < NextScene)
{
PlayerPrefs.SetInt("StageUnlock", NextScene);
}
SceneManager.LoadScene(NextScene);
}
else
//ステージ選択画面に戻る(0:build時の1番上のシーンを読み込みます)
SceneManager.LoadScene(0);
}
}
上記のスクリプトは、ステージをクリアしたタイミングで実行するように設定します。
例えば、ゴールに到達したときやクリアボタンを押したときに nextStage() を呼び出すことで、次のステージ解放とシーン遷移を行えます。
ステージの解放状況を保存したい場合は、セーブ機能の考え方もあわせて理解しておくと便利です。
PlayerPrefsを使ったデータ保存の基本は、以下の記事でも解説しています。
Unityでセーブ機能を作る方法
ステージ選択で使うシーンをBuild Settingsに追加する
ゲームをプレイする前にビルドを行います。
・”File”-“build settings”を開きます。
・作成したStage1のシーンをドラッグで追加します。
上記の操作をStage1~Stage4まで行います。

まとめ:Unityの簡単なセーブ機能はPlayerPrefsから始めよう
今回は、UnityでPlayerPrefsを使ってセーブ機能を作る方法を解説しました。
PlayerPrefsを使えば、ハイスコア、クリアタイム、プレイヤー名、ステージ解放状況など、ちょっとしたデータを簡単に保存できます。
特にUnity初心者のうちは、まず「保存する」「取得する」「削除する」という基本の流れを理解することが大切です。
ステージ管理やシーン遷移と組み合わせることで、ゲームを終了しても進行状況を残したり、クリア済みステージを次回起動時に反映したりできるようになります。
まずはハイスコア保存のような小さな機能から試して、少しずつ実際のゲームに必要なセーブ処理へ応用していきましょう。
次に読むおすすめ記事
Unityの基本操作や学習環境を整えたい方は、Unity Learnを日本語で使う方法もあわせて確認してみてください。
ステージ選択画面を作ったら、次は以下の機能もあわせて実装しておくと便利です。
- ステージボタンを押して別シーンへ移動する方法
- ステージのクリア状況や解放状況を保存する方法
関連記事:
📚 関連書籍のおすすめ
本記事の内容をさらに深く学びたい方には、以下の書籍がおすすめです:
不明点や指摘等がありましたら、コメントいただけると助かり
ます。
コメントまたはtwitterで連絡をお待ちしています。
twitterアカウント~otakutomo~


コメント