Menu
CoddyTech

次のレベル

CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 19/60。

ビルドのシーンリスト内の各シーンには番号が付いており、これをビルドインデックスと呼びます。最初のシーンは0、次は1というように続きます。LoadSceneは名前だけでなくその番号も受け取り、SceneManager.sceneCountInBuildSettingsはリストに含まれるシーンの数を示します。リスト内でレベルが順番に並んでいれば、次のレベルはアクティブなシーンのインデックスに1を足したものです。この出口は次のレベルを読み込み、最後のレベルの後は停止します。

void OnTriggerEnter(Collider other)
{
    if (!other.CompareTag("Player")) return;
    int next = SceneManager.GetActiveScene().buildIndex + 1;
    if (next < SceneManager.sceneCountInBuildSettings)
    {
        SceneManager.LoadScene(next);
    }
    else
    {
        Debug.Log("You finished the game!");
    }
}

シーンが4つある場合、インデックスは0から3で、sceneCountInBuildSettingsは4です。そのため、最後のレベルではnextは4となり、末尾の1つ先になります。だからテスト条件はnext < sceneCountInBuildSettingsです。LoadScene(4)は何も読み込まず、UnityのエラーCannot load scene: Invalid scene name (empty string) and invalid build index 4をログに出力します。

これで、1つの出口スクリプトがすべてのレベルで使え、どのスクリプトもシーン名を指定しません。レベルを追加するには、そのシーンをリストに追加します。順番を変更するには、リスト内でシーンをドラッグして並べ替えます。

challenge icon

チャレンジ

簡単

各ゴールで次のレベルを開くようにしましょう。

  1. Start()で、"Level " + level + " of " + levelsをlevelTextに表示します。levelはアクティブなシーンのbuildIndex、levelsはSceneManager.sceneCountInBuildSettings - 1です。
  2. OnTriggerEnterで、Playerに対してbuildIndex + 1を読み込みます。ただし、それがsceneCountInBuildSettings未満でない場合は、0(メニュー)を読み込みます。

「プレイ」を押して3つのレベルをすべてクリアすると、メニューに戻ります。その後、「確認」を押してください。

自分で試してみよう

using UnityEngine;
using UnityEngine.SceneManagement;
using TMPro;

public class Goal : MonoBehaviour
{
    public TMP_Text levelText;

    void Start()
    {
        // "Level 2 of 3" を表示する:現在のレベル番号と、レベルの総数を示す
    }

    void OnTriggerEnter(Collider other)
    {
        // プレイヤーがゴールに到達したら、次のレベルを読み込む。最後のレベルならメニューを読み込む
    }
}

本格的なゲームを作るのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド