次のレベル
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つの出口スクリプトがすべてのレベルで使え、どのスクリプトもシーン名を指定しません。レベルを追加するには、そのシーンをリストに追加します。順番を変更するには、リスト内でシーンをドラッグして並べ替えます。
チャレンジ
簡単各ゴールで次のレベルを開くようにしましょう。
Start()で、"Level " + level + " of " + levelsをlevelTextに表示します。levelはアクティブなシーンのbuildIndex、levelsはSceneManager.sceneCountInBuildSettings - 1です。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プレイグラウンド