(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



GameObjectのシーンの移動方法とDontDestroyOnLoadの解除方法【Unity】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2019.4.14f1


はじめに

今回はタイトル通りGameObjectのシーンの移動方法と、

それに併せて、DontDestroyOnLoadの解除方法の解説です!

f:id:kan_kikuchi:20201201070943j:plain



MoveGameObjectToScene

さっそくですが、GameObjectのシーンの移動は、

SceneManagerのMoveGameObjectToSceneで行えます。

//SceneManagerを使うのに必要
using UnityEngine.SceneManagement;
//SampleScene1という名前のシーンを取得
Scene sampleScene1 = SceneManager.GetSceneByName("SampleScene1");

//このGameObjectをSampleScene1に移動
SceneManager.MoveGameObjectToScene(gameObject, sampleScene1);
f:id:kan_kikuchi:20201201071001j:plain


これを使うとDontDestroyOnLoadにあるGameObjectも別のシーンに移せるので、

それでDontDestroyOnLoadを解除する事が可能です。

f:id:kan_kikuchi:20201201070943j:plain


ただし、DontDestroyOnLoadのシーンにGameObjectを移動しようとすると、

「ArgumentException: Destination scene is not valid」というエラーが出て出来ません。

//DontDestroyOnLoadシーン取得 (取得自体は可能)
Scene dontDestroyOnLoadScene = SceneManager.GetSceneByName("DontDestroyOnLoad");

//このGameObjectをDontDestroyOnLoadに移動しようとするとエラー
SceneManager.MoveGameObjectToScene(gameObject, dontDestroyOnLoadScene);
f:id:kan_kikuchi:20201201071330j:plain


なお、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();