サーチ…


構文

  • public static Object PrefabUtility.InstantiatePrefab(オブジェクトターゲット)。
  • public static Object AssetDatabase.LoadAssetAtPath(文字列assetPath、タイプのタイプ)。
  • public static Object Object.Instantiate(オブジェクトオリジナル)。
  • public static Object Resources.Load(文字列パス);

前書き

プレハブは、コンポーネント、プロパティ、アタッチされたコンポーネント、およびシリアル化されたプロパティ値とともに完全なGameObjectの格納を可能にするアセットタイプです。これが役に立つ便利なシナリオはたくさんあります。

  • シーン内のオブジェクトを複製する
  • 複数のシーンで共通のオブジェクトを共有する
  • プレハブを一度修正し、その変更を複数のオブジェクト/シーンに適用できること
  • 共通の要素を1つの基本プレハブから編集可能にしながら、わずかな変更で複製オブジェクトを作成する
  • 実行時にゲームオブジェクトをインスタンス化する

Unityには、「すべてがPrefabsでなければならない」という種類の経験則があります。これはおそらく過言ではありますが、コードの再利用とGameObjectsの再利用を可能にします。

プレハブの作成

プレハブを作成するには、シーン階層からAssetsフォルダまたはサブフォルダにゲームオブジェクトをドラッグします。

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

ゲームオブジェクト名は青色に変わり、プレハブに接続されていることを示します。
このオブジェクトは、クラスのオブジェクトインスタンスと同様に、 プレハブインスタンスです。

プレハブは、インスタンス化後に削除することができます。その場合、以前に接続されたゲームオブジェクトの名前が赤色に変わります。

ここに画像の説明を入力

プレハブ検査官

階層ビューでプレハブを選択すると、そのインスペクタが通常のゲームオブジェクトと少し違うことに気づくでしょう:

ここに画像の説明を入力

ここに画像の説明を入力

太字のプロパティは、値がプレハブ値と異なること意味します。元のプレハブ値に影響を与えずに、インスタンス化されたプレハブのプロパティを変更することができます。プレハブインスタンスで値が変更されると、太字で表示され、プレハブ内の同じ値のその後の変更は、変更されたインスタンスに反映されません。

[ 元に戻す ]ボタンをクリックすると元のプレハブ値に戻すことができます。また、インスタンスに値の変更が反映されます。さらに、個々の値を元に戻すには、その値を右クリックして、 値を「Prefabに戻す」を押します。コンポーネントを元に戻すには、コンポーネントを右クリックし、[ Prefabに戻す ]を押します。

[ 適用 ]ボタンをクリックすると、プレハブのプロパティ値が現在のゲームオブジェクトのプロパティ値で上書きされます。 「元に戻す」ボタンや確認のダイアログはありませんので、このボタンは慎重に扱ってください。

選択ボタンは、プロジェクトのフォルダ構造内の接続されたプレハブを強調表示します。

プレハブのインスタンス化

プレハブをインスタンス化するには、 設計時または実行時の 2つの方法があります

設計時のインスタンス化

デザイン時にプレハブをインスタンス化すると、同じオブジェクトの複数のインスタンスを視覚的に配置することができます(たとえば、ゲームのレベルを設計するときにツリーを配置するなど )。

  • プレハブを視覚的にインスタンス化するには、プロジェクトビューからシーン階層にドラッグします。

    ここに画像の説明を入力

  • エディタ拡張機能を記述している場合、 PrefabUtility.InstantiatePrefab()メソッドをプログラムで呼び出すプレハブをインスタンス化することもできます。

    GameObject gameObject = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath("Assets/MainCamera.prefab", typeof(GameObject)));
    

ランタイムインスタンス生成

実行時にプレハブをインスタンシエートすると、ロジックに応じてオブジェクトのインスタンスを作成するのに便利です(たとえば、5秒ごとに敵を生成するなど )。

プレハブをインスタンス化するには、プレハブオブジェクトへの参照が必要です。これは持っていることによって行うことができるpublic GameObjectあなたのフィールドをMonoBehaviourスクリプト(ユニティ・エディタでインスペクタを使用してその値を設定します):

public class SomeScript : MonoBehaviour {
   public GameObject prefab; 
}

またはでプレハブを置くことによって、リソースのフォルダや使用Resources.Load

GameObject prefab = Resources.Load("Assets/Resources/MainCamera");

プレハブオブジェクトへの参照を取得したら、コード内の任意の場所にInstantiate関数を使用してInstantiate化することができます(たとえば、ループ内で複数のオブジェクトを作成する )。

GameObject gameObject = Instantiate<GameObject>(prefab, new Vector3(0,0,0), Quaternion.identity);

注: プレハブ用語は実行時に存在しません。

ネストされたプレハブ

入れ子になったプレハブは、現時点でUnityでは利用できません。あるプレハブを別のプレハブにドラッグして適用することはできますが、その子プレハブの変更はネストされたプレハブには適用されません。

しかし、簡単な回避策があります - あなたは親のプレハブに単純なスクリプトを追加しなければなりません。それは子供のインスタンスを生成します。

using UnityEngine;

public class ParentPrefab : MonoBehaviour {

    [SerializeField] GameObject childPrefab;
    [SerializeField] Transform childPrefabPositionReference;

    // Use this for initialization
    void Start () {
        print("Hello, I'm a parent prefab!");
        Instantiate(
            childPrefab, 
            childPrefabPositionReference.position, 
            childPrefabPositionReference.rotation, 
            gameObject.transform
        );
    }
}

親プレハブ:

親プレハブ

子供のプレハブ:

子供のプレハブ

開始前後のシーン:

開始前 ここに画像の説明を入力



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow