Developer

【初心者Unity】Instantiateを具体例付きで解説
2020.12.30
Lv1

【初心者Unity】Instantiateを具体例付きで解説

Instantiate()とは

Instatiate()の「Instantiate」とは日本語に翻訳すると「インスタンス化」という意味です。インスタンス化とは「実体化」と訳されることもあるように、要するにこのメソッドを使うと、ゲームプレイ中に新たなオブジェクトを出現させることができます。
新たにオブジェクトを出現させていったいどうするのか。。。
例えば、画面をタップするとキャラクターが手裏剣を投げたり、キャラクターが通過すると床から針が飛び出してきたりといった、何かしらのイベントをトリガーとして出てくるギミックを出現させることができるのです。

Instantiateメソッドの色々なパターンについての説明はこちら
Instantiateでオブジェクトをクローンする方法(応用編)

インスタンス化とは(ちょいむず・飛ばしておっけー)

インスタンス化とは、設計図(クラス)を基に実体(インスタンス)を生成することです。Unityにおいていえば、「x軸方向に一定速度で走る」というスクリプト(設計図・クラス)をオブジェクト(CubeやSphere)にアタッチする(貼り付ける)ことで、そのオブジェクトは「x軸方向に一定速度で走るオブジェクト」としてインスタンス化されます。

「インスタンス化」についてもっと詳しく知りたい方はこちらの記事を参照
【Unity連載】C#入門


実際に使ってみる

まあ中々イメージはしにくいと思うので、実際にスクリプトを書いて解説していきます。
まず今回の例では登場人物が2人います。1人目は生成される基になるオブジェクトです。2人目は1人目を基に生成されるオブジェクトです。要するに、あるイベントをトリガーにして基にされるオブジェクトのクローンがパッと生成されるスクリプトを書くというわけです。今回はstartメソッドに記述することで、トリガーを「ゲームが始まったこと」にしましょう(つまりプレイヤーからすると実質最初からクローンが存在していることになる)。

「Start」メソッドについてもっと詳しく知りたい方はこちらの記事を参照
【Unity連載】UnityとC#におけるメソッド一覧

1人目のオブジェクトはもう何でもいいです。CubeでもSphereでもお好きなのにしちゃってください。今回私の方では「CubeOriginal」と名付けたCubeにしておきます。こちらのオブジェクトはクローンの基になるというだけで、特にこれ以上いじる必要はありません。今回は生成しておしまいです。
次に2人目のオブジェクトですが、こちらが若干ややこしいです。通常のオブジェクトではなく、「空(から)のオブジェクト」を生成します。生成の仕方は、「Hierarchyタブ」→右クリック→「Create Empty」で生成することができます。こちらの2人目ですが、「空のオブジェクト」というだけあって、コンポーネントはTransformのみ、Scene View、Game View共に実体が映らない、要するに実体のない、まるで幽霊の様なオブジェクトとなっています。
このオブジェクトに「CubeOriginalを基に実体化する!」というスクリプトをアタッチすることで、ゲーム開始時にこの空のオブジェクトは「CubeOriginal」のクローンとして実体化することができます。

以下のスクリプトにおいては6行目に記述されています。
2行目で基となるゲームオブジェクトを「target」として指定しています。そして6行目の第1引数で「target」を基にオブジェクトをインスタンス化しています。このInstantiateメソッドがstartメソッド内に記述してあることでゲーム開始をトリガーにしてクローンがインスタンス化されます。
また、Instantiateメソッドでは、第2、第3引数でクローンのTransformの初期値を指定することができます。第2引数ではVector3型でPositionを、第3引数ではQuaternion型でRotationをそれぞれ指定することができます。今回は第2引数を「Vector3(-1.5f, 0.7f, 0.0f)」としており、xの値のみ基のインスタンスからずらすことで、クローンの位置を基のオブジェクトのすぐ横に指定しています。また、第3引数を「Quaternion.identity」としており、基のオブジェクトと同様に無回転であることを指定しています。

    //取得したオブジェクトを格納する変数を定義
    public GameObject target;
    void Start()
    {
        //オブジェクト「target」を基にクローンを生成する(TransformのPositionとRotationも指定)
        Instantiate(target, new Vector3(-1.5f, 0.7f, 0.0f), Quaternion.identity);
    } 

スクリプト完成後は必ず「空のオブジェクト」にアタッチしてください。
これで完成!かと思いきや、このままでは動きません。
最後に、「空のオブジェクト」のInspectorにあるtargetにCubeOriginalを適用して完成です。
これを

こう

上記全てが完成し、再生すると以下の様になります。
ゲーム開始前

ゲーム開始後


おまけ

因みに、今回のスクリプトでは、変数targetの修飾子をpublicとしたことで、変数の値をInspector上で操作する必要がありました。しかし変数の値をスクリプトで完結させることもできます。そこで使うのが前回の記事で書かせていただいた「GameObject.Find()」です。

「GameObject.Find()」についてもっと詳しく知りたい方はこちらの記事を参照
【Unity連載】GameObject.Findを具体例付きで解説

以下のスクリプトにおいては7行目に記述されています。
まず2行目の変数宣言ですが、先ほどまでの例では修飾子がpublicであったのに対し、今回は記述していません。これはtargetの値はスクリプト上で完結し、Inspector上で操作する必要がなくなったからです。その代わりにFindメソッドでtargetの値を指定しています。また、FindメソッドをStartメソッドではなくAwakeメソッド内に入れている理由としてはStartメソッドでクローンが生成される前に、基となるオブジェクトを指定する必要があるためです。AwakeメソッドはStartメソッドより早く呼び出されます。

    //取得したオブジェクトを格納する変数を定義
    public GameObject target;
//Startメソッドより早く呼び出されるAwakeメソッド
    private void Awake()
    {
        //targetの値をFindメソッドによって取得している
        target = GameObject.Find("CubeOriginal");
    }
    void Start()
    {
        //オブジェクト「target」を基にクローンを生成する(TransformのPositionとRotationも指定)
        Instantiate(target, new Vector3(-1.5f, 0.7f, 0.0f), Quaternion.identity);
    } 
「Awake」メソッドについてもっと詳しく知りたい方はこちらの記事を参照
【Unity連載】UnityとC#におけるメソッド一覧

 

連載目次リンク

「初心者のための」Unityゲーム制作 目次

Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次