マルチシーンを使った開発
Unity 5 系のいつからから、シーンを複数呼ぶことができるようになりました。
現在のプロジェクトで初めてマルチシーンを使用しています。
そのときにハマった罠を紹介できればと思います。
Instantiate を呼ぶと、どのシーンに配置される?
Unity を使ってる人ならみんな大好き(?) Instantiate。
GameObject を hierarchy 上で生成するときに使いますよね。
マルチシーンがないときには何も意識せずに Instantiate したら、シーン上に GameObject が生成されました。
さて、マルチシーンで Instantiate したら、どのシーンに GameObject が作られるのでしょうか?
Instantiate シーンを単独で開いて GameObject の作成
Instantiate シーンを開いて、適当な Prefab(Cube) を Instantiate しました。
ボタンの Addlistener に Instantiate するだけですね。
[SerializeField] private Button _instantiatePrefabButton;
[SerializeField] private GameObject _prefab;
// Use this for initialization
private void Start()
{
_instantiatePrefabButton.onClick.AddListener(() => { Instantiate(_prefab); });
}
![SimpleInstantiate.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F151719%2F63ffa910-1dce-d44c-94ac-3bae2d4f8850.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=1492f90ab4d12cfc3c0561c4f1ebe56d)
まぁ、シーンは一つしかないので、そのシーンに配置されますね。
Instantiate シーンを Additive で追加する形で開いて GameObject を作成
最初に適当なシーン(ここでは Main)を開いて、そのあとに Instantiate シーンを Additive で開いてみます。
[SerializeField] private Button _addSceneButton;
private void Start()
{
addSceneButton.onClick.AddListener(() =>
SceneManager.LoadScene("Instantiate", LoadSceneMode.Additive));
}
さて、Instantiate シーンで Instantiate する GameObject は、一体どのシーンに作られるのでしょうか
![PreFix.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F151719%2Fba37f20f-55e0-234d-20bc-e5e563781281.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=58329b0f925ec06626d9a1f65eceeb55)
Instantiate シーンに作られなくて、Main シーンに作られてしまいました。
対策(?)
Instantiate シーンに、適当な空の GameObject を作成し、それを親にして GameObject を作成しましょう。
private void Start()
{
_instantiatePrefabButton.onClick.AddListener(() => { Instantiate(_prefab, _transform); });
}
![Fix.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F151719%2F8830052e-744a-dcb5-d731-38614fc2d1ed.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a1ead23c3983255d02fc331c3aff2b06)
Instantiate シーンに GameObject が作成されましたね。
まとめ
マルチシーンを使用するときには、Instantiate される Hierarchy 上の場所にも気をつけましょう。
たとえば上記の例で Instantiate シーンを Unload しても、本来 Instantiate シーンで作成した GameObject が消されないで残ってしまいます。(実際それでバグを産んだ)