Unityでステージやレベルの制限・開放を実装していきます。
スマホゲームとかでよく見る、ステージをクリアするとロックされていた次のステージが解放される感じです。
はじめに
「Unity 2020.3.26f1」ヴァージョンで作成しています。
実装方法は色々ありますが、簡単にできるplayerprefsを利用していきます。
作成開始
簡単に画面を作成してスクリプトで実装していきます。
UI作成
StageSelectと言う名前で新規シーンを作成。UI→テキスト追加。

名前をTitleにして、位置とテキストサイズ、色などを変更。ここは好きなようでOK。

次にUI→ボタンを追加。

位置とテキストを変更。

コピーして位置をずらして複数個作成します。

新規でシーンを作成。Stage1と言う名前で、タイトルとボタン一つだけを追加。

Stage分、シーンを複製してタイトルを変えておきます。

左上のファイルから、ビルド設定を選択して、下記の様にシーンを追加。

これで準備完了です。
スクリプト作成
StageSelectシーンに空のオブジェクトを追加。
名前を「StageSelectManager」にして、同じ名称でスクリプトをアタッチ。

スクリプトの中身は下記に。指定したシーンに移動する簡単なものです。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class StageSelectManager : MonoBehaviour { public void StageSelect(int stage) { SceneManager.LoadScene(stage); } }
ボタンクリック時に下記の様に追加。

これで、ボタンクリックで各ステージに移動できます。
ステージの制限
現状では全てのボタンが有効なので、下記の様にスクリプトを変更。
StageUnlockをキーにしてステージ数を読み込みボタンの有効/無効を切り替え。該当キーが無い場合の初期値は1。
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) { SceneManager.LoadScene(stage); } }
インスペクターで、各ボタンを割り当て。試しに実行するとStage1のみ有効に。

ステージの解放
次にステージ解放を実装。下記スクリプトを作成。
保存してあるStageUnlockの値を取得し、次のシーン番号(次ステージ)と比較。値が大きい場合、保存しています。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class StageManager : MonoBehaviour { public void nextStage() { int StageUnlock = PlayerPrefs.GetInt("StageUnlock"); int NextScene = SceneManager.GetActiveScene().buildIndex + 1; if (NextScene < 5) { if (StageUnlock < NextScene) { PlayerPrefs.SetInt("StageUnlock", NextScene); } SceneManager.LoadScene(NextScene); } else SceneManager.LoadScene(0); } }
各ステージに、StageManagerと言う名前で新規オブジェクトを追加、スクリプトをアタッチ。
ボタン押した時にステージクリアとしているのでボタンに割り当て。

細かくは直すところもありますが、これでとりあえずの実装は完了。