GameObject は必ず Instantiate して作るものだ。と、ほとんど宗教のように信じ込んでいたんですが、実はそんなことなかった。
new GameObject()
var obj = new GameObject("オブジェクト名");
これだけで、ヒエラルキー上に GameObject が作られます。
予め特定のコンポーネントを含む GameObject を作りたい場合は、次のように書きます。
var obj = new GameObject("オブジェクト名", typeof(Image)); // 複数ある場合、列挙も出来る var obj = new GameObject("オブジェクト名", typeof(Image), typeof(RigidBody2D), typeof(BoxCollider2D));
中途半端に instantiate 教にハマっていると……
こんな風にコードを書きたくなりますが、GameObject が複数作られてしまうので、やめましょう。
// new と Instantiate で都合2回の GameObject が生成される var obj = Instantiate(new GameObject());
シーンが複数ある場合、GameObject はどこに作られるのか
LoadSceneMode.Additive でサブシーンを含んでいる場合、new GameObject() はどちらのシーンに作られるのでしょうか? 実験してみます。
メインシーンを1つ、サブシーンを1つ、計2つのシーンがあり、new GameObject() はサブシーンのスクリプトから実行しています。
このように、サブシーンからコールされた new GameObject() であっても、メインシーンに GameObject は作成されるようです。
SubScene に作りたい場合は、メインシーンに作成 > サブシーンに移動させる
、という2段階のステップを踏む必要があります。
var obj = new GameObject("0"); SceneManager.MoveGameObjectToScene(obj, SceneManager.GetSceneByName("SubScene"));
処理の重さは計測してませんが、ちょっとまどろっこしくて多用する気になれませんね。
利便性だけ上げたければ、拡張メソッドを定義しておくといいかもしれません。
public static class SampleExtensions { public static void MoveScene(this GameObject obj, string sceneName) { SceneManager.MoveGameObjectToScene(obj, SceneManager.GetSceneByName(sceneName)); } } var obj = new GameObject(count.ToString()); obj.MoveScene("SubScene");