Unityにおいて超重要なPrefabとInstantiateについて学ぼう。

床の作成

createからcubeを作成し、scaleをxとzに25を入れて以下のように配置する。
(alt+ドラッグで見下ろすアングルにする。その際x軸が右を向くように調整する)

雪だるまの作成

雪だるまは2つの球の組み合わせで作る。こういった場合は空のオブジェクトを作ってその中に作成していく。まずはCreateからCreateEmptyする。

SnowmanにリネームしてTransformがリセットリセットされていることを確認する。

floorを非表示

作業の邪魔になるので地面を一旦非表示にしておこう。

1つ目の球の作成

Snowmanを右クリックして3D ObjectからSphereを選択する。

headにリネームし、Transformがリセットしてあることを確認する。

headを複製する(ctr+dでもOK)

bodyにリネームしTransformを以下のように設定する。

以下のようになっていればOK

Rigidbodyを付与

この雪だるまにRigidbodyを付与したい。こういった場合は親要素のsnowmanのみに付与する。

snowmanのy座標を10に設定する。

床を有効化させて実行してみよう。

雪だるまがストンと落ちれば成功だ。

プレファブ化

いい感じに雪だるまが出来たのでこれをプレファブにしよう。
SnowmanをドラッグしてProjectビューにドロップする。

プレファブ化したのでヒエラルキーからは削除してしまおう。

確認

実行して、プレファブをヒエラルキーに複数回ドラッグ&ドロップしてみよう。
どんどん雪だるまが出てくるはずだ。

このようにUnityでは複数登場してもらいたいものはプレファブとして登録しておく。プレファブはUnityをやる上で必ず覚えなければならないキーワードだ。

雪だるまの動的生成

再生を止めると雪だるまがいなくなってしまう。
今度はスクリプトからこの雪だるまを生成してみよう。
SnowmanBox.csを以下のように作成する。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SnowmanBox : MonoBehaviour
{
    public GameObject snowman;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Instantiate(snowman);
        }
    }
}

Create->Create Emptyで空のオブジェクトを生成してSnowmanBoxとリネーム

SnowmanBoxにSnowmanBox.csをアタッチ

プレファブをドラッグ&ドロップで登録する

確認

実行してマウス左クリックをしてみよう。雪だるまが出てくるはずだ。

解説

このようにInstantiateメソッドを用いることでオブジェクトを複数生成できる。
シューティングゲームの弾丸などInstantiateで生成するものは多い、Unity開発における心臓部と言っても過言ではないだろう。

ランダム位置に登場させる

以下のようにSnowmanBox.csを変更する。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SnowmanBox : MonoBehaviour
{
    public GameObject snowman;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Instantiate(
                snowman,
                new Vector3(
                    Random.Range(-10f,10f),
                    10f,
                    Random.Range(-10f,10f)
                    ),
                Quaternion.identity
             );
        }
    }
}

実行してみよう。ランダムな位置に登場する。

解説

Instantiateメソッドは引数を3つ与えると
何を、どこに、どの向きで
を指定することができる。
今回はこの「どこに」の部分のxとzに乱数を与えた(高さは10f)

どの向きに関してはQuaternionで与える必要がある。
idntitiyは無回転を意味する。

もし、x軸に対して90度回転させた状態で登場させたければ
Quaternion.Euler(90f,0,0))
と指定してあげればよい。Quaternion.Eulerメソッドを使えば回転をお馴染みのオイラー角で与えることができる。