Cooooding!!

Unity(C#)を使ったゲーム開発関連Tipsなど

ActiveではないシーンにGameObjectを生成する【Unity】

概要

マルチシーン機能を使ってシーンをAdditiveでロードしたときに、遷移先のシーンではなく遷移前のシーンにGameObjectが生成されてしまうことがありました。これは遷移中はまだ遷移前のシーンがActiveであることが原因のようでした。そこでActiveではないシーンにGameObjectを生成する方法を調べてみました。

方法1: MoveGameObjectToSceneを使う

以下のようにMoveGameObjectToSceneを使えば生成したGameObjectを別のシーンに移動させることができます。

var obj = new GameObject();  // InstantiateされたGameObjectも同様
var scene = UnityEngine.SceneManagement.SceneManager.GetSceneByName("SampleScene");
UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(obj, scene);

ただし、この関数はシーンのルートにあるオブジェクトにしか使うことができません。
使うと以下のエラーが出ます。

ArgumentException: Gameobject is not a root in a scene

ルート以外のGameObjectも一旦ルートに変えれば別のシーンに移動させることができるため以下のような関数を用意すると便利かもしれません。

void MoveGameObjectToScene(GameObject obj, UnityEngine.SceneManagement.Scene scene)
{
    obj.transform.SetParent(null);
    UnityEngine.SceneManagement.SceneManager.MoveGameObjectToScene(obj, scene);
}

方法2: 遷移先のシーンにあるGameObjectの子にする

MoveGameObjectToSceneを使わなくても遷移先のシーンにあるGameObject(Transform)の子にすれば別のシーンに移動させることができます。

var obj = new GameObject();
obj.transform.SetParent(targetSceneTransform);

その後にSetParent(null)をしたらルートオブジェクトにすることもできます。

var obj = new GameObject();
obj.transform.SetParent(targetSceneTransform);
obj.transform.SetParent(null);

環境

  • Unity 2018.4.0f1
  • VisualStudio 2019