メインコンテンツまでスキップ

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

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



サンプルコード

using UnityEngine;
using UnityEngine.SceneManagement;

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

解説:

  • このコードでは、SceneManager.LoadSceneメソッドを使って新しいシーンをロードします。
  • "NewSceneName" の部分には、ロードしたいシーンの名前かビルドインデックスを指定します。
  • 現在のシーンは、新しいシーンに置き換わります。





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

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

サンプルコード

using UnityEngine;

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

解説:

  • DontDestroyOnLoadは、AwakeまたはStartメソッドで呼び出され、オブジェクトがシーン遷移時に破棄されるのを防ぎます。
  • this.gameObjectは、現在のゲームオブジェクトを指し、シーンが切り替わっても生き続けます。





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

シーン遷移後にオブジェクトを動的に生成するには、プレハブ(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)で生成します。





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

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

サンプルコード

using UnityEngine;
using UnityEngine.SceneManagement;

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

解説:

  • LoadSceneMode.Additiveは、シーンを追加でロードし、既存のシーンに新しいシーンを重ねます。
  • 現在のシーンはそのまま残り、新しいシーンが追加されてロードされます。





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

シーンをアンロードしてメモリを解放するには、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は、使用されていないアセットを解放してメモリを節約します。





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); // 複数生成されないようにする
}
}
}

解説:

  • GameManagerクラスは、シングルトンパターンを使って1つのインスタンスだけを保持します。
  • DontDestroyOnLoadによってシーンをまたいでオブジェクトが保持され、ゲーム全体を管理します。





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);
}
}
}

解説:

  • SceneManager.sceneLoadedイベントを使って、シーンがロードされた際に特定のオブジェクトを探し出します。
  • GameObject.Findを使って、シーン内のGameObjectにアクセスします。





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); // シーンロード完了後にロード画面を非表示
}
}

解説:

  • SceneManager.LoadSceneAsyncを使ってシーンを非同期でロードし、進行状況を取得します。
  • ロード中は、SliderLoading ScreenのUIを表示してユーザーに進行状況を知らせます。
  • operation.progressを使用してロードの進捗を取得し、進行バーを更新します。