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

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と言う名前で新規オブジェクトを追加、スクリプトをアタッチ。

ボタン押した時にステージクリアとしているのでボタンに割り当て。

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

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