LoadScene を用いたシーン遷移SceneManager.LoadSceneは、別のシーンに遷移する際に使います。このメソッドは、指定されたシーンをロードし、現在のシーンを置き換えます。
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneLoader : MonoBehaviour
{
// シーンをロードする
public void LoadNewScene()
{
SceneManager.LoadScene("NewSceneName"); // "NewSceneName"はロードしたいシーン名
}
}
SceneManager.LoadSceneメソッドを使って新しいシーンをロードします。DontDestroyOnLoad を使ってオブジェクトをシーン間で保持するDontDestroyOnLoadは、シーンが切り替わっても特定のオブジェクトを破棄せずに保持するためのメソッドです。
例えば、ゲームの管理オブジェクトやBGMプレイヤーなど、シーン間で継続的に使いたいオブジェクトに使います。
using UnityEngine;
public class PersistentObject : MonoBehaviour
{
void Awake()
{
DontDestroyOnLoad(this.gameObject); // このオブジェクトをシーン間で破棄しない
}
}
DontDestroyOnLoadは、AwakeまたはStartメソッドで呼び出され、オブジェクトがシーン遷移時に破棄されるのを防ぎます。this.gameObjectは、現在のゲームオブジェクトを指し、シーンが切り替わっても生き続けます。シーン遷移後にオブジェクトを動的に生成するには、プレハブ(Prefab)のインスタンス化を行います。
using UnityEngine;
public class PrefabSpawner : MonoBehaviour
{
public GameObject prefabToSpawn;
void Start()
{
Instantiate(prefabToSpawn, new Vector3(0, 0, 0), Quaternion.identity); // プレハブをシーンに生成
}
}
Instantiateメソッドを使って、シーンにプレハブを生成します。prefabToSpawnは、Inspectorウィンドウから割り当てるプレハブです。Vector3(0, 0, 0)) と回転(Quaternion.identity)で生成します。SceneManager.LoadScene の第2引数にLoadSceneMode.Additiveを指定することで、既存のシーンに新しいシーンを追加でロードすることができます。
using UnityEngine;
using UnityEngine.SceneManagement;
public class AdditiveSceneLoader : MonoBehaviour
{
public void LoadAdditionalScene()
{
SceneManager.LoadScene("AdditionalScene", LoadSceneMode.Additive); // 現在のシーンを維持したまま別のシーンを追加でロード
}
}
LoadSceneMode.Additiveは、シーンを追加でロードし、既存のシーンに新しいシーンを重ねます。シーンをアンロードしてメモリを解放するには、SceneManager.UnloadSceneAsyncを使用します。また、不要なアセットを解放するためにResources.UnloadUnusedAssetsを使います。
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneUnloader : MonoBehaviour
{
public void UnloadScene()
{
SceneManager.UnloadSceneAsync("SceneToUnload"); // シーンをアンロードする
Resources.UnloadUnusedAssets(); // 不要なアセットをメモリから解放
}
}
SceneManager.UnloadSceneAsyncは指定したシーンを非同期でアンロードします。Resources.UnloadUnusedAssetsは、使用されていないアセットを解放してメモリを節約します。シーン間で共通の管理オブジェクトを使用する場合、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); // 複数生成されないようにする
}
}
}
GameManagerクラスは、シングルトンパターンを使って1つのインスタンスだけを保持します。DontDestroyOnLoadによってシーンをまたいでオブジェクトが保持され、ゲーム全体を管理します。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);
}
}
}
SceneManager.sceneLoadedイベントを使って、シーンがロードされた際に特定のオブジェクトを探し出します。GameObject.Findを使って、シーン内のGameObjectにアクセスします。非同期シーンロードを使って、シーン遷移中にロード画面を表示することができます。
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); // シーンロード完了後にロード画面を非表示
}
}
SceneManager.LoadSceneAsyncを使ってシーンを非同期でロードし、進行状況を取得します。SliderやLoading ScreenのUIを表示してユーザーに進行状況を知らせます。operation.progressを使用してロードの進捗を取得し、進行バーを更新します。