ねのぷろ! ~げーむ・ぷろぐらみんぐ・ぶろぐ〜

プログラミングやゲームについてだらだら書きます。https://twitter.com/nenowawon

Unity 自作シーン遷移クラス

こんにちは。ネノワヲンです。 今回は、私が使っている自作シーン管理クラスを晒していこうと思います。

コード

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneController
{
    /// <summary>
    /// 指定したシーンに飛ぶ
    /// </summary>
    /// <param name="sceneName"></param>
    public static void JumpScene(string sceneName)
    {
        SceneManager.LoadScene(sceneName);
    }

    /// <summary>
    /// 指定したシーンに飛ぶ
    /// </summary>
    /// <param name="sceneIndex"></param>
    public static void JumpScene(int sceneIndex)
    {
        SceneManager.LoadScene(sceneIndex);
    }

    /// <summary>
    /// 指定したシーンを追加で生成
    /// </summary>
    /// <param name="sceneName"></param>
    public static void AddScene(string sceneName)
    {
        if (IsSceneLoaded(sceneName)) { return; }

        SceneManager.LoadScene(sceneName, LoadSceneMode.Additive);
    }

    /// <summary>
    /// 指定したシーンに飛ぶ(非同期)
    /// </summary>
    /// <param name="sceneName"></param>
    public static AsyncOperation JumpSceneAsync(string sceneName)
    {
        return SceneManager.LoadSceneAsync(sceneName);
    }

    /// <summary>
    /// 指定したシーンを追加で生成(非同期)
    /// </summary>
    /// <param name="sceneName"></param>
    public static AsyncOperation AddSceneAsync(string sceneName)
    {

        if (IsSceneLoaded(sceneName)) { return null; }

        return SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
    }

    /// <summary>
    /// 現在のシーンを読み直す(リトライ)
    /// </summary>
    public static void ReloadSceneAsync()
    {
        JumpScene(SceneManager.GetActiveScene().buildIndex);
    }

    /// <summary>
    /// そのシーンが読み込み済みかどうか調べる
    /// </summary>
    /// <param name="sceneName"></param>
    /// <returns></returns>
    public static bool IsSceneLoaded(string sceneName)
    {
        // 現在読み込まれているシーン数だけループ
        for (int i = 0; i < SceneManager.sceneCount; i++)
        {
            // 読み込み済みかどうか調べる
            if (SceneManager.GetSceneAt(i).name.Equals(sceneName))
            {
                Debug.LogWarning($"シーン名:{sceneName}は既に読み込まれています");
                return true;
            }
        }
        return false;
    }
}

機能

通常のシーン遷移、シーン追加があります。

また、非同期版ではこのように↓

// サブシーンを読み込む
foreach (var sceneName in subSceneNames)
{
        await SceneController.AddSceneAsync(sceneName);
}

// ステージを読み込む
await SceneController.AddSceneAsync(StageSceneName);

// ステージのマップを読み込む
await SceneController.AddSceneAsync(StageMapSceneName);

awaitでシーン読み込みを待機できます。