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
を使用してロードの進捗を取得し、進行バーを更新します。