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

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

次に「UI」→「Legacy」→「Button」を追加。

ボタンの位置とテキスト、フォントサイズを変更して下記の様な感じにします。

ボタンオブジェクトをコピーして複数個作成、位置をずらして下記の様に配置します。

ステージの画面
Stage1と言う名前で新規でシーンを作成します。

タイトルとボタンを追加して下記の様に画面を作成します。

Stageの数だけシーンを複製してタイトルを変えておきます。

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

これで準備完了です。
スクリプトの作成
StageSelectシーンに切り替え、空オブジェクトを追加。

名前を「StageSelectManager」にして、同じ名称でスクリプトをアタッチ。

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


これで、下記の様にボタンクリックで各ステージに移動できます。

ステージの制限
現状では全てのボタンが有効なので、下記の様にスクリプトを変更。
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としています。
インスペクターで変数に各ボタンを割り当てます。

試しに実行すると下記の様にStage1のみ有効になります。

ステージの解放
次にステージ解放を実装していきます。
下記スクリプトを新規作成します。
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と言う名前で新規オブジェクトを追加し、作成したスクリプトをアタッチ。ボタンクリック時に割り当て。

細かくは直すところもありますが、とりあえず「ステージの制限・解放」の簡単な実装は完了。

