unity3d
Prefabs
Suche…
Syntax
- public static Object PrefabUtility.InstantiatePrefab (Objektziel);
- public static Object AssetDatabase.LoadAssetAtPath (Zeichenfolge assetPath, Typ type);
- public static Object Object.Instantiate (Objektvorlage);
- public static Object Resources.Load (Zeichenfolgenpfad);
Einführung
Prefabs sind ein Asset-Typ, der die Speicherung eines kompletten GameObjects mit seinen Komponenten, Eigenschaften, angehängten Komponenten und serialisierten Eigenschaftswerten ermöglicht. Es gibt viele Szenarien, in denen dies nützlich ist, darunter:
- Objekte in einer Szene duplizieren
- Gemeinsames Objekt für mehrere Szenen freigeben
- Einmaliges Ändern eines Fertigteils und Änderung der Änderungen auf mehrere Objekte / Szenen
- Erstellen Sie doppelte Objekte mit geringfügigen Änderungen, während die allgemeinen Elemente von einem Basis-Prefab bearbeitet werden können
- GameObjects zur Laufzeit instanziieren
In Unity gibt es eine Art Faustregel: "Alles sollte Prefabs sein". Während dies wahrscheinlich übertrieben ist, fördert dies die Wiederverwendung von Code und das Erstellen von GameObjects auf wiederverwendbare Weise, was sowohl speichereffizient als auch gut gestaltet ist.
Prefabs erstellen
Um ein Prefab zu erstellen, ziehen Sie ein Spielobjekt aus der Szenenhierarchie in den Ordner oder Unterordner Assets :
Der Spielobjektname wird blau und zeigt damit an, dass er mit einem Prefab verbunden ist .
Dieses Objekt ist jetzt eine Prefab-Instanz , genau wie eine Objektinstanz einer Klasse.
Ein Prefab kann nach der Instantiierung gelöscht werden. In diesem Fall wird der Name des zuvor verbundenen Spielobjekts rot angezeigt:
Prefab-Inspektor
Wenn Sie in der Hierarchieansicht ein Prefab auswählen, werden Sie feststellen, dass sich der Inspektor leicht von einem normalen Spielobjekt unterscheidet:
vs
Fettgedruckte Eigenschaften bedeuten, dass ihre Werte von den Fertigwerten abweichen. Sie können jede Eigenschaft eines instantiierten Prefab ändern, ohne die ursprünglichen Prefab-Werte zu beeinflussen. Wenn ein Wert in einer Prefab-Instanz geändert wird, wird er fett dargestellt, und alle nachfolgenden Änderungen desselben Werts im Prefab werden nicht in der geänderten Instanz angezeigt.
Sie können die ursprünglichen Werte wiederherstellen, indem Sie auf die Schaltfläche Wiederherstellen klicken. In diesem Fall werden auch Wertänderungen in der Instanz angezeigt. Um einen einzelnen Wert zurückzusetzen, können Sie außerdem mit der rechten Maustaste auf den Wert klicken und die Option Wert auf Voreinstellung zurücksetzen drücken. Um eine Komponente rückgängig zu machen , klicken Sie mit der rechten Maustaste darauf und drücken Sie Auf Voreinstellung wiederherstellen .
Wenn Sie auf die Schaltfläche Übernehmen klicken, werden die vorgefertigten Eigenschaftswerte mit den aktuellen Eigenschaften der Spielobjekteigenschaft überschrieben. Es gibt keine Schaltfläche "Rückgängig" oder Bestätigungsdialogfeld, behandeln Sie diese Schaltfläche daher sorgfältig.
Die Schaltfläche Auswählen markiert das verbundene Prefab in der Ordnerstruktur des Projekts.
Prefabs instanziieren
Es gibt zwei Möglichkeiten, Prefabs zu instanziieren: während der Entwurfszeit oder der Laufzeit .
Design-Zeitinstanziierung
Das Instantiieren von Prefabs zur Entwurfszeit ist nützlich, um mehrere Instanzen desselben Objekts visuell zu platzieren (z. B. Platzieren von Bäumen beim Entwerfen einer Spielebene ).
Um ein Prefab visuell zu instanziieren, ziehen Sie es aus der Projektansicht in die Szenenhierarchie.
Wenn Sie eine schreiben Editor Erweiterung , können Sie instanziiert auch eine Fertig programmatisch Aufruf
PrefabUtility.InstantiatePrefab()
Methode:GameObject gameObject = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath("Assets/MainCamera.prefab", typeof(GameObject)));
Laufzeit-Instantiierung
Das Instantiieren von Prefabs zur Laufzeit ist nützlich, um Instanzen eines Objekts gemäß einer bestimmten Logik zu erstellen (z. B. alle 5 Sekunden einen Feind auftauchen ).
Um ein Prefab zu instanziieren, benötigen Sie einen Verweis auf das Prefab-Objekt. Dazu können Sie ein public GameObject
Feld in Ihrem MonoBehaviour
Skript verwenden (und dessen Wert mithilfe des Inspektors im Unity-Editor MonoBehaviour
):
public class SomeScript : MonoBehaviour {
public GameObject prefab;
}
Oder indem Sie das Prefab im Ressourcenordner ablegen und Resources.Load
:
GameObject prefab = Resources.Load("Assets/Resources/MainCamera");
Sobald Sie einen Verweis auf das Fertigobjekt haben, können Sie es mit der Funktion Instantiate
beliebiger Stelle in Ihrem Code instanziieren (z. B. innerhalb einer Schleife, um mehrere Objekte zu erstellen ):
GameObject gameObject = Instantiate<GameObject>(prefab, new Vector3(0,0,0), Quaternion.identity);
Hinweis: Der vorgefertigte Begriff ist zur Laufzeit nicht vorhanden.
Verschachtelte Prefabs
Geschachtelte Prefabs sind derzeit in Unity nicht verfügbar. Sie können ein Prefab in ein anderes ziehen und anwenden, aber Änderungen an dem untergeordneten Prefab werden nicht auf das verschachtelte angewendet.
Es gibt jedoch eine einfache Problemumgehung: Sie müssen dem übergeordneten Prefab ein einfaches Skript hinzufügen, das ein untergeordnetes Skript instanziiert.
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
);
}
}
Elternteil vorgefertigt:
Kind Fertigteil:
Szene vor und nach dem Start: