【Unity入門】オブジェクトを大量生成する方法!

 皆さんこんにちは。ロクと申します。

 いきなり本題ですが、あなたはUnityを使ってゲームを作っていくうちに、銃やビームなどの武器を作ってみたくなったことはあるでしょうか?

 実際に銃を作ってみようとすると、肝心な要素として、銃弾を実装する必要があります。

 銃弾は同じ形、大きさ、見た目のものをいくつも用意する必要があるので、この場合同じオブジェクトを大量に生成する方法を知っておかなければなりません。

 そこで今回の記事では、どのようにすれば銃弾(に限らず様々なオブジェクト)を生成することができるのかについて解説していこうと思います。

今回の記事の内容を覚えておけばこれからゲームを作っていく中で応用できる幅が広くなります。
また、Unityの基礎の部分ともいえるのでぜひ覚えましょう!

 重要な割には簡単なのでさっさと覚えてしまいましょう。

1:プレハブを作ろう

 まずは、オブジェクトを生成するためのテンプレートとなるものを作る必要があります。

 このテンプレートのことをUnityではプレハブと呼んでいます。

 プレハブを作る方法は、ヒエラルキーにあるオブジェクトを画面下の方にあるAssetsフォルダまでドラッグして持っていくだけです。

 今回僕は、球体をオブジェクトとして使おう思います。

 もちろんプレハブを作るときは、自分が大量に複製したいと思っているオブジェクトを使いましょう。

 これで、大量に生成するためのテンプレートを作ることができました。

2:スクリプトを作ろう

 上の項で作ったプレハブですが、このプレハブをドラッグしてシーンビューのところに置いてみると、そっくりそのままのオブジェクトが出てくると思います。

 これが複製になります。

 実は、この複製はスクリプトによって動的に行うことができます。

 早速スクリプトを作成していきましょう。

・publicでゲームオブジェクトを宣言する

 スクリプトの書き方にもある程度手順があります。

 まずは、右クリック→「Create」→「C# スクリプト」を選択し、スクリプトを作ってください。名前はなんでもいいです。

 作ったら、スクリプトをダブルクリックして開きましょう。

 開いたら、複製したいゲームオブジェクトをスクリプトにセットする必要があるので、そのための変数を宣言します。↓

public GameObject obj;

 宣言する場所は、スタート関数よりも一つ上にあるスペースにしましょう。日常的に変数の宣言を行っている場所で大丈夫です。

・複製する関数を使う

 Unityには便利なことに、ゲームオブジェクトを複製するための関数が備わっています。

 ですので、上の項で宣言したゲームオブジェクトをスクリプトから自由に複製することができるようになっています。

 この関数は下のように書きます。

Instantiate(オブジェクト名,座標,回転);

 ()の中に指定したオブジェクトが複製されるようになっています。

  また、座標を第2引数に、回転を第3引数に指定することでこれらの値も同時に設定することができます。

 あとは、この関数を自分の好きなタイミングで実行させればオブジェクトの複製ができるというわけです。

試しにスクリプトを作ってみよう

 何かしら例となるスクリプトがあったほうがいいと思いますので、僕が試しにスクリプトを作ります。

 今回は、「スペースキーを押すと、球体が複製される」というものを作ろうと思います。

 そのスクリプトの内容が以下になります。スクリプト名は複製という意味で「copy」にしています。

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

public class copy : MonoBehaviour
{
    public GameObject obj;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            Instantiate(obj,new Vector3(0,0,0),Quaternion.identity);
        }
    }
}

 大事な部分は7行目20行目です。

 それぞれ、ゲームオブジェクト変数の宣言と、そのオブジェクトの複製を行うためのコードです。

 20行目のコードの3つ目の引数については、回転の指定の方法がいろいろあるので、ぜひ調べてみてください。ちなみにQuaternion.identityは、無回転を意味し、回転自体をリセットするためのものです。

 スクリプトを作ったら、何かしらのヒエラルキー上のオブジェクトにアタッチする必要があるので、とりあえず空(から)のオブジェクトを作り、スクリプトをそいつにアタッチしておきます。↓

 まだこの状態ではオブジェクトの生成はできませんので、もう一つしなければならない作業があります。それが次の項にもつながっていきます。

3:オブジェクトを割り当てよう

 最後にしなければならない作業は、public修飾子をつけて宣言した変数に、外側からゲームオブジェクトをアタッチするという作業です。

 もちろん、この時アタッチするオブジェクトは、自分が複製したいと思っているオブジェクトになります。

 方法はとても簡単で、まずはヒエラルキー上にある空のオブジェクトを選択し、インスペクター上のスクリプトの項目中でNone…となっているところを探します。

 そして、そこへAssetsフォルダの中にあるつくったプレハブをドラッグしてもっていけばOKです。

 下の画像にならってやっていけば大丈夫だと思います。

 ここまでできれば完了です!

 一度実行して確かめてみてください。

 下の動画をあくまで参考として置いておきます。

 ※この動画では、オブジェクトにRigidbodyをつけているため、重力の影響を受けるようになっています。

おわりに

 今回説明していったことに関しては、ゲームを作っていく中でかなりの頻度で使う重要技術になります。

 ご自身の作るゲームの幅を広げるためにも、この記事の内容はしっかりと押さえておきたいところですね。

 ぜひ今のうちに覚えきっておきましょう。

 それではまた~。

Unity

Posted by ロク