[Unity][prefabs]プレハブで簡単オブジェクト複製

Unity
https://amzn.to/3bd8XOX

 同じオブジェクトを複数作りたいとき、ヒエラルキーWindowのオブジェクトをコピーペーストしていました。静的に(最初から決められた数だけ)配置できるオブジェクトであれば、それでいいかもしれませんが、動的に(アプリを動かしながら状況に応じて追加)配置したい場合は、そのまま追加するのに不便です。
 今回はプレハブ(prefabs)という概念を用いて、オブジェクトのプレハブ化と動的生成方法(例えば初期化の時に配置するなど)について説明したいと思います。ちなみに、プレハブとはよく、建物でプレハブ小屋とか言いますが、それと同じ意味で、枠組みだけというような意味だそうです。

Goal

プレハブを定義して、動的に3Dオブジェクトを生成する!




オブジェクトのプレハブ生成

 今回もそろばん珠を使って説明していきます。まずプレハブ化していない状態でそろばん珠を並べた状態を以下に示します。単純にコピーしてオブジェクトを配置して位置を整えただけです。GameObjectの文字が黒になっていることがわかります。これはそれぞれが単純にコピーされて独立して存在している、そんな状態です。

 続いて、そろばん珠をプレハブ化していきます。プレハブ化は簡単で、そろばん珠オブジェクトを下にあるAssetsフォルダにドラッグするだけです。ドラッグすると新たにSorobanが追加されているかと思います。

 また、同時にヒエラルキーWindowのオブジェクト名も青色に変化します。これはあるprehabにから生成されたインスタンスであることを示します。Assetsに格納されたのがプレハブ小屋の設計図で、その設計図を用いて作成されたプレハブ小屋本体がヒエラルキーWindowにある青字のオブジェクトといったイメージでしょうか。(伝わらなかったらすいません。。)

 ついでにここで、先ほど作成したプレハブをAssetsから削除してみます。すると、ヒエラルキーWindowの文字は赤色に変化します。これはプレハブが見つからないが、オブジェクトとしては存在している、そういう状態です。

 解消するためにはオブジェクトを右クリックしてunpack prefabを選択してください。

プレハブの配置(静的な配置)

 プレハブを配置していきます。プレハブの配置はAssetsに登録されているプレハブを登録したい場所にドラッグすればよいです。まったく同じものが追加されます。この時、追加したプレハブはすべて青文字になっています。これは全てプレハブから生成されたオブジェクトであることを示します。試しに、プレハブから一つそろばんの珠を増やしてみます。

 まったく同じ場所に同じオブジェクトが生成されました。これは同じプレハブから生成されたものなので、プレハブのMaterialを変更すると、全てのインスタンスに反映されます。試しにプレハブのマテリアルの色を変更してみました。

プレハブの配置(動的な配置)

 動的な配置とはアプリを実行して実行中に配置するやり方です。例えば、ゲーム進行中に状況によって配置したり、実行する端末の条件などによって配置数を変えるなどといった配置方法になります。スクリプトに記述してオブジェクトを生成、配置します。

Resourcesフォルダにプレハブ格納

 スクリプトから動的生成するためにまず、Resourcesフォルダに作成したプレハブを格納します。Project WindowのAssets下にResourcesフォルダを作成して、その中にプレハブを格納します。

スクリプトを記述

 ここではボタンを押されたタイミングでプレハブからインスタンスを生成する例を示します。ボタンが押された時の処理をOnClick()に記述しています。

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

public class ButtonScr : MonoBehaviour
{
    // Start() Update()は省略


    public void OnClick()
    {
        // SorobanプレハブをResourceフォルダからロード
        GameObject obj = (GameObject)Resources.Load("Soroban");

        // Sorobanプレハブをからインスタンスを生成、
        Instantiate(obj, new Vector3(0.0f, 0.0f, 0.0f), Quaternion.Euler(90.0f, 0.0f, 0.0f));
    }
}

 Instantiate()の第一引数はプレハブのオブジェクトになります。第二引数は生成表示する座標、第三引数は回転角度になります。SorobanプレハブはもともとX軸方向に90度回転している状態なので、配置のタイミングで正しい向きに変更しています。

実行結果

 コードを実行した結果は以下のようになります。ボタンを押すとプレハブから生成したそろばん珠が表示されます。

まとめ

 今回はプレハブがどういったものか、どのようにして使用するのかの基本的なところを開設しました。ゲームの主人公が投げるナイフであったり、飛行機が発射するミサイルであったりはプレハブを用いてスクリプトで動的に同じものを生成することができます。
 プレハブ化するのもAssetsフォルダにドラッグするだけなので非常に簡単ですし、今後も色々応用していければと思っています。

https://amzn.to/3bd8XOX

 

 

コメント