ステージやレベルの制限・解放を簡単に作成【Unityゲーム制作】

今回は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と言う名前で新規オブジェクトを追加し、作成したスクリプトをアタッチ。ボタンクリック時に割り当て。

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

タイトルとURLをコピーしました