今回はUnity2Dでステージやレベルの制限・開放を実装していきます。
スマホゲームとかでよく見るステージをクリアするとロックされていた次のステージが解放される感じです。
はじめに
Unityのバージョンは2021.3.14f1です。
実装方法は色々ありますが、簡単にできるplayerprefsを利用していきます。
実装開始
簡単に画面を作成してスクリプトで実装していきます。
ステージ選択画面の作成
StageSelectと言う名前で新規シーンを作成、「UI」→「Legacy」→「Text」を追加します
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905001.png)
名前をTitleにして、位置とテキストサイズ・色などを変更。ここは好きなようでOK。
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905002.png)
次に「UI」→「Legacy」→「Button」を追加。
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905003.png)
ボタンの位置とテキスト、フォントサイズを変更して下記の様な感じにします。
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905004.png)
ボタンオブジェクトをコピーして複数個作成、位置をずらして下記の様に配置します。
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905005.png)
ステージの画面
Stage1と言う名前で新規でシーンを作成します。
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905006.png)
タイトルとボタンを追加して下記の様に画面を作成します。
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905007.png)
Stageの数だけシーンを複製してタイトルを変えておきます。
![](https://nosystemnolife.com/wp-content/uploads/2022/05/20220529007.jpg)
左上のファイルから、ビルド設定を選択して、下記の様にシーンを追加。
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905008.png)
これで準備完了です。
スクリプトの作成
StageSelectシーンに切り替え、空オブジェクトを追加。
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905009.png)
名前を「StageSelectManager」にして、同じ名称でスクリプトをアタッチ。
![](https://nosystemnolife.com/wp-content/uploads/2022/05/20220529009.jpg)
スクリプトの中身は下記に。指定したシーンに移動する簡単なものです。
using UnityEngine; using UnityEngine.SceneManagement; public class StageSelectManager : MonoBehaviour { public void StageSelect(int stage) { SceneManager.LoadScene(stage); } }
ボタンクリック時の動作を下記の様に追加。
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905010.png)
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905011.png)
これで、下記の様にボタンクリックで各ステージに移動できます。
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905015.gif)
ステージの制限
現状では全てのボタンが有効なので、下記の様にスクリプトを変更。
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); } }
StageUnlockをキーにしてステージ数を読み込み、ボタンの有効/無効を切り替え。該当キーが無い場合の初期値は1としています。
インスペクターで変数に各ボタンを割り当てます。
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905012.png)
試しに実行すると下記の様にStage1のみ有効になります。
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905013.png)
ステージの解放
次にステージ解放を実装していきます。
下記スクリプトを新規作成します。
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 < SceneManager.sceneCountInBuildSettings) { if (StageUnlock < NextScene) PlayerPrefs.SetInt("StageUnlock", NextScene); SceneManager.LoadScene(NextScene); } else SceneManager.LoadScene(0); } }
保存してあるStageUnlockの値を取得、次のシーン番号(次ステージ)と比較し値が大きい場合は、値を保存。次のステージに遷移しています。
ステージ
各ステージ(Stage1,Stage2…)に、StageManagerと言う名前で新規オブジェクトを追加し、作成したスクリプトをアタッチ。ボタンクリック時に割り当て。
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905014.png)
細かくは直すところもありますが、とりあえず「ステージの制限・解放」の簡単な実装は完了。
![](https://nosystemnolife.com/wp-content/uploads/2023/09/20230905016.gif)