この記事では、プレハブの作り方と作ったプレハブをC#スクリプトから複数生成する方法を解説します。
プレハブ(Prefab)という機能を使うと1度作ったオブジェクトのコピー(UnityではCloneと呼ぶ)を簡単に作ることが出来ます。また、作ったプレハブはC#スクリプトから呼び出して生成することも可能です。
プレハブをランダムな位置に生成したい方は以下をご覧ください。
最終的にこんな感じのものを作ります。

プレハブの作り方
青いCubeが落ちてくるという機能を持つオブジェクトを作ってプレハブ化してみます。
シーンの準備
Unityで3Dテンプレートのプロジェクトを新規作成し、
Hierarchyウインドウで + > 3D Object とたどり Plane と Cube をそれぞれ以下のように配置します。

Cubeはマテリアル(Material)の機能を使って青くしてありますが、何色でも構いません。
Materialの使い方は以下を参照してください。
Cubeが下に落ちてくるようにするためRigidbodyを追加します。
Cubeを選択し、Inspectorウインドウの Add Component ボタンをクリック。

Phisics > Rigidbody を選択し追加します。

一旦、実行確認してCubeが落ちてくることを確認してください。

作ったオブジェクトをプレハブ化する
HierarchyウインドウのCubeをAssetsフォルダにドラッグ&ドロップするとプレハブ化できます。
落ちてくる青いCubeの出来上がりです。

プレハブを使って複製(Clone)を作る
プレハブ化したオブジェクトはAssetsウインドウからシーンにドラッグ&ドロップするだけで同じ機能を持つ複製が生成できます。

実行イメージ

ちなみにプレハブ化した後は、元のオブジェクトを消去してもプレハブは利用できます。

プレハブには自分で名前をつけた方が後々便利に使える
先ほどプレハブ化した時に省略しましたが、作ったプレハブには自由に名前をつけることが出来ます。
ゲームなど作る際はプレハブ化した時の名前をそのまま使うのではなく、自分で分かりやすい名前をつけた方が後々便利に使えます。
先ほど作ったプレハブは元の名前がそのままプレハブ名になっていました。

Cubeでは少し紛らわしい名前です。
Assetsウインドウのプレハブを選択して名前(この場合はCube)部分をクリックするとプレハブ名を変更できます。あるいはプレハブを 右クリック > Rename で名前変更できます。

今回は、FallCubeとしましたが、なるべく自分で分かりやすい名前をつけましょう。
プレハブの作り方に関しては以上です。
プレハブをC#スクリプトから複数生成する方法
プレハブをC#スクリプトから操作できれば応用範囲は広がります。
例えば、一定時間ごとに敵を出現させる、クリックした位置にプレハブを配置するなどです。
ここでは例として、先ほど作った青いCubeを一定時間ごとにシーンに生成することを実践してみます。
シーンは先ほど作ったものをそのまま使います。
スクリプトを作る
Assetsフォルダで 右クリック > Create > C# Script を選択し、名前を CreatePrefab とします。

C#スクリプトの作り方や基本に関しては以下を参考にしてください。
CreatePrefabをダブルクリックしてVisual Studioを起動します。
以下のハイライト部分を入力してスクリプトを完成させてください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CreatePrefab : MonoBehaviour
{
// プレハブ格納用
public GameObject CubePrefab;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
// 一定時間ごとにプレハブを生成
if(Time.frameCount % 60 == 0)
{
// 生成位置
Vector3 pos = new Vector3(0.0f, 10.0f, 0.0f);
// プレハブを指定位置に生成
Instantiate(CubePrefab, pos, Quaternion.identity);
}
}
}
スクリプトの準備は以上です。
スクリプトの設定
スクリプトを実行させるための空のオブジェクトを生成します。
Hierarchyウインドウで + > 3D Object > Create Empty を選択。名前をGameMainとします。

スクリプトCreatePrefabをGameMainにドラッグ&ドロップしてアタッチします。

GameMainをクリックしてInspectorウインドウを表示させます。
Cube Prefabという項目が None(Game Object) となっています。ここにプレハブをドラッグ&ドロップしてスクリプトから生成するプレハブを設定します。

実行確認してみてください。
上からCubeがどんどん落ちてくれば成功です!

スクリプト解説
プレハブをC#スクリプトから生成するには、Instantiate関数を利用します。
Instantiate関数の機能は、指定する引数により変わりますが、一番分かりやすい使用例が以下です。
Instantiate(生成したいプレハブ, 生成するプレハブの位置, Quaternion.identity);
第1引数が、生成したいプレハブでGameObject型を指定します。
第2引数が、生成するプレハブの位置でVector3型で指定します。
第3引数は固定で Quaternion.identity としています。これはプレハブを回転させずに生成するという意味です。生成時の回転などを変更したい場合は第3引数を変更することになります。
今回第1引数には、事前にGameObject型でCubePrefabという名前でpublic宣言してInspectorウインドウから設定できるようにしてあります。
public
GameObject CubePrefab;
第2引数は、Vector3型でY座標だけ10.0fとして少し上方から落ちてくるようにしてあります。
Vector3 pos = new Vector3(0.0f, 10.0f, 0.0f);
今回は固定位置で生成していますが、変数posの引数をランダムにして毎回違う位置に生成したりと応用は利くと思います。
一定間隔での処理部分ですが、Updateメソッドに直接Instantiate関数を入れて実行してしまうと一気に大量のプレハブが生成されてしまい処理が追い付かなくなる可能性があるため、今回はTime.frameCount変数を利用しました。
Time.frameCount変数には、実行してからのフレーム数が保存されています。
if(Time.frameCount % 60 == 0)
{
// 処理
}
とすることで、60フレーム毎の処理を実現できます。
Updateの処理の60回に1回は、プレハブを生成することになります。
以上、Unity:プレハブの作り方とスクリプトからの生成方法でした。
コメント