Unity のプレハブから動的にオブジェクトを作成する

以前Unityプレハブ化について説明した際に、プレハブをドラッグ&ドロップしてシーン上に数個のインスタンスを作りました。
数個ならばそれでも良いですが、100個くらい適当に置くとなると、プログラムで処理したくなります。

今回は指定されたプレハブからゲームオブジェクトを自動的に作成・配置するプログラムを作ります。
※ Unity は 2021.3.14f1、 OS は Windows 10 です。

たくさんの花びらの管理役を作る

「桜の花びら」プレハブをもとに「桜の花びら」インスタンスを作成します。
作成するタイミングはゲームの開始直後です。
※次回以降で、インスタンス数を増やしたり、花びらが下に消えたあとにインスタンスを再作成する予定です。

今回の役割は、桜の花びら1つの挙動を制御するのではなく、花びらの作成や削除をする役割なので管理役と呼べます。
そこで、空のゲームオブジェクトを作ります。空とは、Transform 以外のコンポーネントを持たない、機能を持たないゲームオブジェクトということです。
Hierarchy ウィンドウのシーンの上で右クリックをして、コンテキストメニュー→[GameObject]→[Create Empty] を選択すると、右クリックした要素の下位に空のゲームオブジェクトが作成できます。

空のゲームオブジェクトを Hierarchy ウィンドウのシーン直下に作成します。

空のゲームオブジェクトを Hierarchy ウィンドウのシーン直下に作成します。

作成した空のゲームオブジェクトの名前は適当で良いですが、わかりやすく、「管理役」とします。

以前「桜の花びら」にコンポーネントとして、新規のプログラムを割り当てたように、「管理役」にも Manager.cs というプログラムを割り当てます。
Hierarchy ウィンドウで「管理役」ゲームオブジェクトを選択し、Inspector ウィンドウで [Add Component] ボタンを押し、 [New Script] カテゴリを選択してからスクリプト名 Manager.cs を入力し [Create and Add] ボタンを押します。

ゲームオブジェクトを選択後、Inspector ウィンドウでスクリプト名を入力してからボタンを押します。

ゲームオブジェクトを選択後、Inspector ウィンドウでスクリプト名を入力してからボタンを押します。

作成した Manager.cs ファイルは、Project ウィンドウで確認できます。ファイルアイコンをダブルクリックするなどして編集ソフトを開きましょう。

複製元のプレハブをエディタで指定する

Unity エディタの Inspector ウィンドウ内で、複製元のプレハブを指定できるようにしましょう。
以前にメンバ変数を public 指定にすることで、float Speed などをエディタ上で編集できるようにしましたが、同じく GameObject 型もエディタ上で指定できます。

public class Manager : MonoBehaviour
{
    // 複製元のプレハブです。エディタから指定して下さい。
    public GameObject Prefab;
}

Manager クラスのメンバ変数に public 指定の GameObject Prefab を宣言しました。
保存して Unity エディタの Inspector ウィンドウの Manager コンポーネントの部分を確認すると Prefab という項目が表示されていて、Project ウィンドウからのドラッグ&ドロップで「桜の花びら」プレハブを指定できます。

「桜の花びら」プレハブを Manager クラスの public GameObject Prefab にドラッグ&ドロップで指定します。

「桜の花びら」プレハブを Manager クラスの public GameObject Prefab にドラッグ&ドロップで指定します。

花びらの絵のアイコンが二つあるので、画像ファイルとプレハブファイルと勘違いしないように注意しましょう(間違って画像ファイルをD&Dしても指定ができず焦りました;)。

プレハブからゲームオブジェクトを作る

先ほど Inspector ウィンドウで指定したプレハブをもとに、ゲームオブジェクトを作成して、シーンに配置します。
まずはプレハブから1つのインスタンスを決められた位置に配置するプログラムを作ります。

    // 有効なゲームオブジェクトの最初の Update イベント関数の前に呼び出されます。
    void Start()
    {
        Instantiate(Prefab, new Vector3(5f, 5f, 0f), Quaternion.identity);
    }

Instantiate 関数は、第一引数の Prefab をもとに新しいゲームオブジェクトを作成します。
第二引数は配置する位置、第三引数は向きです。
Quarternion.identity は向きを変えない場合に指定します。
他にも上位のオブジェクトを指定することで、親子関係を設定することもできます。

Start イベント関数内で、 Instantiate 関数を呼ぶことで、ゲーム開始時に 1 つの「桜の花びら」ゲームオブジェクトが座標(5, 5, 0)の位置に作成・配置されます。

テストプレイ直後にプレハブから生成された「桜の花びら」が配置され、その後舞い落ちる動作をしました。

テストプレイ直後にプレハブから生成された「桜の花びら」が配置され、その後舞い落ちる動作をしました。

Hierarychy ウィンドウを見ていると、テストプレイ前は存在しなかった「桜の花びら(Clone)」という Instantiate 関数で動的に作成されたゲームオブジェクトがあることがわかります。

Instantiate 関数で指定されたプレハブから動的にゲームオブジェクトが作成されました。

Instantiate 関数で指定されたプレハブから動的にゲームオブジェクトが作成されました。

以降では、花びらをたくさん生成しランダムに配置できるようにしていきます。

 

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました