次のSceneを読み込む処理をスッキリ書く [Unity]


サンプルコード

/// <summary>
/// シーンを読み込む処理
/// </summary>
/// <param name="levelIndex">シーンのビルドインデックス</param>
private void LoadLevel(int levelIndex)
{
    SceneManager.LoadScene(levelIndex);
}

/// <summary>
/// 次のシーンを読み込む処理
/// </summary>
private void LoadNextLevel()
{
    // 現在のシーンを読み込む
    Scene currentScene = SceneManager.GetActiveScene();
    // 現在のシーンのビルドインデックスを取得
    int currentSceneIndex = currentScene.buildIndex;
    // 次のシーンのビルドインデックスを設定
    int nextSceneIndex = currentSceneIndex + 1;
    // 全シーンの数を取得する
    int totalSceneCount = SceneManager.sceneCountInBuildSettings;
    // ビルドインデックスが全シーンと同じになった時,最初のシーンに戻す
    if (nextSceneIndex == totalSceneCount) nextSceneIndex = 0;
    // シーンを読み込む
    LoadLevel(nextSceneIndex);
}

ビルドインデックスは0から始まっていることに注意.
ですので,次のnextSceneIndex の最大値は totalSceneCount - 1 になるはずです.
この最大値を超えるのはおかしいので,最初のシーンに戻るようにここでは設定しています.

改良版

LoadNextLevel()はmodulo演算の考え方を利用すれば,簡潔に書けます.

/// <summary>
/// シーンを読み込む処理
/// </summary>
/// <param name="levelIndex">シーンのビルドインデックス</param>
private void LoadLevel(int levelIndex)
{
    SceneManager.LoadScene(levelIndex);
}

/// <summary>
/// 次のシーンを読み込む処理
/// </summary>
private void LoadNextLevel()
{
    // 次のシーンのビルドインデックスを設定
    int nextSceneIndex = (SceneManager.GetActiveScene().buildIndex + 1) % SceneManager.sceneCountInBuildSettings;
    // シーンを読み込む
    LoadLevel(nextSceneIndex);
}

SceneManager.GetActiveScene().buildIndex + 1SceneManager.sceneCountInBuildSettingsが同じではない時,
SceneManager.GetActiveScene().buildIndex + 1が設定され,同じになった場合,0が設定されます.

modulo演算の考え方は今回だけでなく他の場面でも結構応用できると思います.

参考記事

docs.unity3d.com

www.urablog.xyz