[unity] Instantiate しなくても GameObject は作れる

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");

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA