【Unity】Prefab(プレハブ)とは?同じものを複製できる効率的な仕組み

UnityのPrefabとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「UnityのPrefabってどういう機能なの?」

「Prefabを使うとどんなことができるようになるの?」

というお悩みの方に向けた内容となっています。

Unityでは、ゲーム作りをしていく際に、オブジェクトをPrefab(プレハブ)という機能でPrefab化していくことが多いです。

このPrefabを使うと、Prefab化したオブジェクトと全く同じオブジェクトを複製することができます。

そして、Prefabで作成したオブジェクトは、全て変更や修正を一括で行うことができます。

また、スクリプトと組み合わせることで、敵を自動的に表示させたり、アイテムを上から落としたり、キーを押したら弾を撃つなど、様々なゲームの要素でこのPrefab機能を使うことができます。

そこで、このページでは、Prefabがどういう機能なのか、また使い方や実際の使用例までを紹介していきます。

なお、このページでは、

Windows11
Unity Hub3.11.0
Unity6

のバージョンで解説しています。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

Prefab(プレハブ)とは?

まずは、Prefab(プレハブ)の機能について、まとめていきます。

同じオブジェクトを複製できる便利な仕組み

Prefabは、オブジェクトを作成するためのテンプレートという役割があります。

オブジェクトをPrefabにすることで、そのオブジェクトのテンプレートが作られることになり、そこから簡単に同じオブジェクトを複製することができます。

なお、オブジェクトをPrefabにすることをPrefab化と言います。

Prefab化されたオブジェクトは一括で編集できる

Prefab化で複製したオブジェクトは、元のテンプレートを変更するだけで、すべてのオブジェクトを一括で編集することができます。

例えば、黄色で作成したオブジェクトをPrefab化していくつか複製して配置していたけど、赤色に変更したいとなった場合、元のテンプレートとなっているオブジェクトの色を変更するだけで、すべてのオブジェクトが赤色に変更されます。

このように、一回の処理ですべてのオブジェクトを変更することができるので、同じオブジェクトを複数配置するなどといった際は、Prefabを使用することをおすすめします。

なお、元のテンプレートでは無い実際に配置したオブジェクトの情報を変えた場合は、他のオブジェクトの変更に影響しないため、このオブジェクトだけはどうしてもこの色にしたいなどの変更ができます。

Prefabを使えるシーンはたくさんある

Prefabは、先ほどの通り、同じオブジェクトを複数配置するといった際に、非常に効率的な仕組みになっています。

例えば、同じ敵をたくさん配置するといった際に、敵の動きなどを作ったスクリプトのアタッチ情報も一緒に複製することが出来るので、とても便利です。

他にも、後ほど例で紹介していますが、ボタンを押したら弾を撃ったり、上からアイテムが落ちてきたりなど、オブジェクトを何度も表示させるといった使い方でも、Prefab機能を使っていくことができます。

Prefab(プレハブ)の使い方

ここからは、Prefabの使い方についてまとめていきます。

オブジェクトをPrefab化する

まずは、元のテンプレートとなるオブジェクトをPrefab化していきます。

Prefab化は、Prefab化したいオブジェクトをヒエラルキーウィンドウからプロジェクトウィンドウのアセットフォルダにドラッグ&ドロップするだけです。

すると、プロジェクトウィンドウのアセットフォルダにPrefabが表示されているので、分かりやすい名前に変更しておきましょう。

これがテンプレートとなるオブジェクトになります。

Prefabで複製したオブジェクトを配置する

Prefab化ができたら、実際にゲーム画面にPrefabから複製したオブジェクトを配置していきます。

通常のオブジェクトの配置と同じく、アセットフォルダ内にあるPrefabをゲームビューにドラッグ&ドロップしていきます。

複製したオブジェクトをインスペクターウィンドウで見てみると、元のPrefabのテンプレートが紐づいていることが分かります。

また、ヒエラルキーウィンドウでも、通常と色が異なりPrefabで複製されていることが分かるようになっています。

Prefabのテンプレートを編集する

複製したオブジェクトの情報を一括で変更する場合は、Prefabの元のテンプレートを変更することになります。

例えば、すべてのオブジェクトの色を変えたい場合は、アセットフォルダ内のPrefabを選択して、インスペクターウィンドウで色の変更を行うと、複製したオブジェクトはすべて変更されます。

他にも、テンプレートのオブジェクトにスクリプトをアタッチしてあげれば、すべてのオブジェクトにスクリプトがアタッチされたり、コンポーネントを一括で付けてあげるといったこともできるようになります。

また、Prefabで複製したオブジェクトの情報を直接変えた場合は、他のオブジェクトには影響せずそのオブジェクトのみが変更されます。

なお、Prefabから複製したオブジェクトに対して、上記のように情報を変更した際、元のPrefabにもその変更を加えることができます。これについては、今後別の記事で解説していく予定です。

Prefab(プレハブ)を使った実用例:キー入力で弾を撃つ

Prefab化してオブジェクトを複製することが分かってきたところで、ここからは実際にゲーム内でPrefabを使った実用例を紹介していきます。

シューティングゲームやアクションゲームなどで多いキーを押したら弾を撃つという仕組みも、Prefabを使うことで簡単に作ることができます。

ここでは、

スペースキーを押す度に弾が発射される

という仕組みを作っていきます。

弾のオブジェクト配置とスクリプト作成

まずPrefabは考えずに、弾を配置して左から右に移動するスクリプトを作りアタッチします。

using UnityEngine;

public class BulletController : MonoBehaviour
{
    float bulletSpeed = 0.03f;  // 弾のスピード用の変数

    void Update()
    {
        transform.Translate(bulletSpeed, 0, 0); // 弾を移動させる処理

        if (transform.position.x > 10)  // 弾の座標が10より大きくなった場合
        {
            Destroy(gameObject);    // オブジェクトを破壊する
        }
    }
}

移動する処理は、9行目でtransform.Translateメソッドを使って弾を移動させていきます。

移動した後は、画面外で弾が消えるように、11~14行目でif文の条件指定とDestroyメソッドで、オブジェクトを破壊しています。

現状は、ゲームを実行すると、弾が移動して消えるという処理がされています。

Prefab化してスペースキーで複製するスクリプト作成

弾の動きができたので、このオブジェクトをアセットフォルダ内にドラッグ&ドロップして、Prefab化していきます。

Prefab化できたら、次に、元の弾のオブジェクトを消して、空のオブジェクトを作成します。

空のオブジェクトは、ヒエラルキーウィンドウの左上の+ボタンを押して「Create Empty」で作成出来るので、分かりやすい名称を付けて、発射したい場所に座標を移動しておきます。

この空のオブジェクトから弾を出すという処理をしたいので、オブジェクトにスペースキーを押したらPrefabから弾を複製する、というスクリプトをアタッチしていきます。

using UnityEngine;

public class ShootBullet : MonoBehaviour
{
    public GameObject Bullet;  // GameObject型の変数をpublic修飾子で作成

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))    // スペースキーを押した瞬間
        {
            Instantiate(Bullet);    // Bulletのオブジェクトを複製する
            Bullet.transform.position = this.transform.position;    // 座標をスクリプトがアタッチしている座標で代入する
        }
        
    }
}

Prefabから新たに複製するときは、Instantiateメソッドを使うことで実現できます。

ここでは、5行目でGameObject型の変数を作り、11行目でInstantiateメソッドでその変数にあるオブジェクトを新しく複製する処理をしています。

そして、9~13行目でif文を使いスペースキーを押す条件を作り、transform.positionでそのオブジェクトが空のオブジェクトで指定した座標に移動するという処理を行っています。

発射するスクリプトにPrefabを渡す(アウトレット接続)

先ほどのスクリプトで、GameObject型の変数を作りましたが、そのままだとデータが空っぽなのでPrefabを渡してあげる必要があります。

変数を宣言した際にpublic修飾子で宣言してあるため、空のオブジェクトを選択してヒエラルキーウィンドウからスクリプトの項目をみると、先ほどの変数のオブジェクトが表示されています。

この変数の右側に、アセットフォルダ内のPrefabをドラッグ&ドロップしてくることで、スクリプトにPrefabを渡すことができます。

これをアウトレット接続と呼び、変数にPrefabの実体を入れることができます。

これで作業は完了し、実際にゲームを実行してみると、スペースキーを押すと弾が発射されているのが分かります。

まとめ

このページでは、Unityでよく使うPrefabについて、どんな機能なのか、使い方や実際の使用例を紹介していきましたが、いかがでしたでしょうか?

Prefabとは、オブジェクトのテンプレートを作って、同じものを複製することができる機能です。

Prefabで複製してあげることで、それぞれのオブジェクトを一つ一つ修正しなくても、一括で変更を行うことが出来るので、便利です。

また、スクリプトを使うと、Prefab化されたオブジェクトを自動的に複製していくことが出来るので、ゲームを効率的に作っていくことができます。

Unityでゲーム制作を行っていくのであれば、Prefabは使えるようになっておくと良いです。

最後までお読みいただきまして、ありがとうございました!

コメント