この記事でのバージョン
Unity 2019.4.14f1
はじめに
今回はタイトル通りGameObjectのシーンの移動方法と、
それに併せて、DontDestroyOnLoadの解除方法の解説です!
MoveGameObjectToScene
さっそくですが、GameObjectのシーンの移動は、
SceneManagerのMoveGameObjectToSceneで行えます。
//SceneManagerを使うのに必要 using UnityEngine.SceneManagement;
//SampleScene1という名前のシーンを取得 Scene sampleScene1 = SceneManager.GetSceneByName("SampleScene1"); //このGameObjectをSampleScene1に移動 SceneManager.MoveGameObjectToScene(gameObject, sampleScene1);
これを使うとDontDestroyOnLoadにあるGameObjectも別のシーンに移せるので、
それでDontDestroyOnLoadを解除する事が可能です。
ただし、DontDestroyOnLoadのシーンにGameObjectを移動しようとすると、
「ArgumentException: Destination scene is not valid」というエラーが出て出来ません。
//DontDestroyOnLoadシーン取得 (取得自体は可能) Scene dontDestroyOnLoadScene = SceneManager.GetSceneByName("DontDestroyOnLoad"); //このGameObjectをDontDestroyOnLoadに移動しようとするとエラー SceneManager.MoveGameObjectToScene(gameObject, dontDestroyOnLoadScene);
なお、SceneManagerを使うの微妙に面倒なので、
拡張メソッド を使って実装してみると以下のような感じに。
using UnityEngine; using UnityEngine.SceneManagement; /// <summary> /// GameObjectの拡張クラス /// </summary> public static class GameObjectExtension{ /// <summary> /// 指定したシーンへ移動(Sceneで選択) /// </summary> public static void MoveScene(this GameObject gameObject, Scene scene) { SceneManager.MoveGameObjectToScene(gameObject, scene); } /// <summary> /// 指定したシーンへ移動(シーン名で選択) /// </summary> public static void MoveScene(this GameObject gameObject, string SceneName) { gameObject.MoveScene(SceneManager.GetSceneByName(SceneName)); } /// <summary> /// アクティブなシーンへ移動 /// </summary> public static void MoveActiveScene(this GameObject gameObject) { gameObject.MoveScene(SceneManager.GetActiveScene()); } /// <summary> /// DontDestroyOnLoadからアクティブなシーンへ移動 /// </summary> public static void DestroyOnLoad(this GameObject gameObject) { gameObject.MoveActiveScene(); } }
//SampleScene1という名前のシーンに移動 gameObject.MoveScene("SampleScene1");
//DontDestroyOnLoadからアクティブなシーンへ移動
gameObject.DestroyOnLoad();