U
タブ 01基礎11 レッスン — タップで開く
07 / 11 · 8 分
基礎

ブロックのプレハブ

ここまでのプロジェクト

Assets/

Scenes/

Arena.unity

Floor

Prefabs/

P_CubeP_SphereP_CapsuleP_Cylinder

Materials/

M_FloorM_Block

すでにあるものこのレッスンで追加

prefab は、保存しておいた GameObject のことです。いくつでも複製できます。元を編集すれば、あらゆるシーンにあるすべてのコピーが自動的に変わります。

アニメーション図

Project ウィンドウに prefab が一つ、シーンにインスタンスがたくさん。

ブロックの prefab を作る

  1. 1

    GameObject▸3D Object▸Cube。Transform をリセットし、Position を 0、0.5、0 に設定します。

  2. 2

    なぜ 0.5 なのか?既定の Cube は高さ 1 メートルでピボットが中心にあるため、床の上に半分出る位置になります。

  3. 3

    M_Block という material を作って色を付け、cube にドラッグします。

  4. 4

    cube を Hierarchy から、レッスン 05 で作った Assets/Prefabs フォルダへドラッグします。名前が青に変わったら、それが prefab になった合図です。

  5. 5

    Sphere、Capsule、Cylinder も同じようにします。ブロックの prefab は 4 つあれば十分です。

prefab を編集する

✓ Edit the prefab asset

prefab をダブルクリックすると prefab モードに入ります。そこでの編集は、場所を問わずすべてのインスタンスに適用されます。

✖ Edit one instance

シーン内のインスタンスを変更すると override(太字で表示)が発生し、その項目は prefab に追随しなくなります。
  • Inspector の Overrides ドロップダウンを見れば、何を変えたか分かります。Apply で prefab 側へ反映し、Revert で変更を破棄します。

  • 基底を継承しつつ少し変えたい(グレーの cube から赤の cube を作りたい)ときは、prefab を右クリック → Create → Prefab Variant を使います。

配置时使用スナップ

  • ドラッグ中に Ctrl(Windows)/ Cmd(Mac)を押すと、決まった刻み単位でスナップ移動します。

  • 刻みは Edit▸Grid and Snap Settings で設定します——ブロック積みなら 1 メートルがちょうど良いです。

  • V を長押しすると頂点をつかめるようになり、他のオブジェクトの頂点にピタッと合わせられます。

コードから prefab を参照する

Spawner.cs
using UnityEngine;

public class Spawner : MonoBehaviour
{
    [SerializeField] private GameObject blockPrefab;   // drag P_Cube here

    void Start()
    {
        // (prefab, position, rotation)
        Instantiate(blockPrefab, new Vector3(2f, 0.5f, 3f), Quaternion.identity);
    }
}
  • Quaternion.identity は回転なしを意味します。Unity が角度 0、0、0 を表す書き方です。

  • prefab は Project から(Hierarchy からはドラッグしないでください)Inspector のスロットへドロップします。

よくあるミス

  • 名前が青くならない:Assets/Prefabs にドラッグする代わりに Ctrl+D で cube を複製しています。複製はシーン上のもう一つのオブジェクトであって、アセットではありません。Project ウィンドウへドラッグしたときだけ prefab ができます。

  • シーン上の cube を赤にしたのに残りの 99 個が灰色のまま:その変更は一つのインスタンスの override です。Overrides ドロップダウンを開いて Apply All するか、prefab モードでアセット自体を編集してください。

  • アセットではなくシーン上のコピーを Inspector のスロットにドラッグしても、しばらくは動きます。しかし Instantiate はそのインスタンスを override ごと複製し、別のシーンでは参照が null になります。必ず Project ウィンドウからドラッグしてください。