Unity_Lesson

1. LoadScene を用いたシーン遷移

SceneManager.LoadSceneは、別のシーンに遷移する際に使います。このメソッドは、指定されたシーンをロードし、現在のシーンを置き換えます。


サンプルコード

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneLoader : MonoBehaviour
{
    // シーンをロードする
    public void LoadNewScene()
    {
        SceneManager.LoadScene("NewSceneName"); // "NewSceneName"はロードしたいシーン名
    }
}

解説:




2. DontDestroyOnLoad を使ってオブジェクトをシーン間で保持する

DontDestroyOnLoadは、シーンが切り替わっても特定のオブジェクトを破棄せずに保持するためのメソッドです。
例えば、ゲームの管理オブジェクトやBGMプレイヤーなど、シーン間で継続的に使いたいオブジェクトに使います。

サンプルコード

using UnityEngine;

public class PersistentObject : MonoBehaviour
{
    void Awake()
    {
        DontDestroyOnLoad(this.gameObject); // このオブジェクトをシーン間で破棄しない
    }
}

解説:




3. プレハブのインスタンス化

シーン遷移後にオブジェクトを動的に生成するには、プレハブ(Prefab)のインスタンス化を行います。

サンプルコード

using UnityEngine;

public class PrefabSpawner : MonoBehaviour
{
    public GameObject prefabToSpawn;

    void Start()
    {
        Instantiate(prefabToSpawn, new Vector3(0, 0, 0), Quaternion.identity); // プレハブをシーンに生成
    }
}

解説:




4. 現在のシーンを残したまま、別のシーンを追加

SceneManager.LoadScene の第2引数にLoadSceneMode.Additiveを指定することで、既存のシーンに新しいシーンを追加でロードすることができます。

サンプルコード

using UnityEngine;
using UnityEngine.SceneManagement;

public class AdditiveSceneLoader : MonoBehaviour
{
    public void LoadAdditionalScene()
    {
        SceneManager.LoadScene("AdditionalScene", LoadSceneMode.Additive); // 現在のシーンを維持したまま別のシーンを追加でロード
    }
}

解説:




5. アンロードとメモリ解放

シーンをアンロードしてメモリを解放するには、SceneManager.UnloadSceneAsyncを使用します。また、不要なアセットを解放するためにResources.UnloadUnusedAssetsを使います。

サンプルコード

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneUnloader : MonoBehaviour
{
    public void UnloadScene()
    {
        SceneManager.UnloadSceneAsync("SceneToUnload"); // シーンをアンロードする
        Resources.UnloadUnusedAssets(); // 不要なアセットをメモリから解放
    }
}

解説:




6. 何らかのManager(管理)シーン

シーン間で共通の管理オブジェクトを使用する場合、Managerクラスを作成し、DontDestroyOnLoadを使って管理オブジェクトを保持します。

サンプルコード

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager instance;

    void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject); // GameManagerをシーン間で保持
        }
        else
        {
            Destroy(gameObject); // 複数生成されないようにする
        }
    }
}

解説:




7. 別シーンのGameObjectへのアクセス

SceneManagerを使って、別のシーン内にあるGameObjectにアクセスすることができます。シーンを追加でロードすることで、そのシーン内のオブジェクトにもアクセス可能です。

サンプルコード

using UnityEngine;
using UnityEngine.SceneManagement;

public class AccessGameObject : MonoBehaviour
{
    void Start()
    {
        SceneManager.sceneLoaded += OnSceneLoaded;
    }

    void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        GameObject obj = GameObject.Find("ObjectInOtherScene"); // 別のシーン内のオブジェクトを取得
        if (obj != null)
        {
            Debug.Log("Found object: " + obj.name);
        }
    }
}

解説:




8. ロード画面の作成

非同期シーンロードを使って、シーン遷移中にロード画面を表示することができます。

サンプルコード

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using System.Collections;

public class LoadingScreen : MonoBehaviour
{
    public GameObject loadingScreen;
    public Slider progressBar;

    public void LoadSceneWithProgress(string sceneName)
    {
        StartCoroutine(LoadSceneAsync(sceneName));
    }

    IEnumerator LoadSceneAsync(string sceneName)
    {
        AsyncOperation operation = SceneManager.LoadSceneAsync(sceneName);

        loadingScreen.SetActive(true); // ロード画面を表示

        while (!operation.isDone)
        {
            float progress = Mathf.Clamp01(operation.progress / 0.9f); // 進行状況を取得
            progressBar.value = progress;
            yield return null;
        }

        loadingScreen.SetActive(false); // シーンロード完了後にロード画面を非表示
    }
}

解説: