unity3d
GameObjects finden und sammeln
Suche…
Syntax
- public static GameObject Find (Name der Zeichenfolge);
- public static GameObject FindGameObjectWithTag (String-Tag);
- public static GameObject [] FindGameObjectsWithTag (String-Tag);
- public static Object FindObjectOfType (Type-Typ);
- public static Object [] FindObjectsOfType (Type-Typ);
Bemerkungen
Welche Methode ist zu verwenden?
Seien Sie vorsichtig, wenn Sie zur Laufzeit nach GameObjects suchen, da dies Ressourcen verbrauchen kann. Insbesondere: Führen Sie FindObjectOfType oder Find in Update, FixedUpdate oder allgemeiner nicht in einer Methode aus, die einmal oder mehrmals pro Frame aufgerufen wird.
- Rufen Sie die Laufzeitmethoden
FindObjectOfType
undFind
nur bei Bedarf auf -
FindGameObjectWithTag
hat im Vergleich zu anderen string-basierten Methoden eine sehr gute Leistung. Unity führt getrennte Registerkarten für markierte Objekte und fragt diese anstelle der gesamten Szene ab. - Für "statische" GameObjects (z. B. UI-Elemente und Prefabs), die im Editor erstellt wurden, verwenden Sie die serialisierbare GameObject-Referenz im Editor
- Behalten Sie Ihre Listen von GameObjects in Listen oder Arrays, die Sie selbst verwalten
- Wenn Sie viele GameObjects desselben Typs instanziieren, werfen Sie einen Blick auf Object Pooling
- Zwischenspeichern Sie Ihre Suchergebnisse, um zu vermeiden, dass die teuren Suchmethoden immer wieder ausgeführt werden.
Tiefer gehen
Abgesehen von den mit Unity gelieferten Methoden ist es relativ einfach, eigene Such- und Erfassungsmethoden zu erstellen.
Im Falle von
FindObjectsOfType()
können Sie Ihre Skripte in einerstatic
Auflistung eine Liste von sich selbstFindObjectsOfType()
. Das Durchlaufen einer fertigen Objektliste ist viel schneller als das Durchsuchen und Untersuchen von Objekten in der Szene.Oder erstellen Sie ein Skript, das ihre Instanzen in einem auf Zeichenfolgen basierenden
Dictionary
speichert, und Sie verfügen über ein einfaches Tagging-System, das Sie erweitern können.
Suche nach dem Namen von GameObject
var go = GameObject.Find("NameOfTheObject");
Pros | Cons |
---|---|
Einfach zu verwenden | Die Leistung nimmt mit der Anzahl der Spielobjekte in der Szene ab |
Zeichenfolgen sind schwache Referenzen und verdächtigen Benutzerfehler |
Suche nach den Tags von GameObject
var go = GameObject.FindGameObjectWithTag("Player");
Pros | Cons |
---|---|
Es können sowohl einzelne Objekte als auch ganze Gruppen durchsucht werden | Zeichenfolgen sind schwache Referenzen und verdächtigen Benutzerfehler. |
Relativ schnell und effizient | Code ist nicht portierbar, da Tags in Skripts hart codiert sind. |
Im Bearbeitungsmodus in Skripts eingefügt
[SerializeField]
GameObject[] gameObjects;
Pros | Cons |
---|---|
Gute Leistung | Die Objektauflistung ist statisch |
Tragbarer Code | Kann sich nur auf GameObjects aus derselben Szene beziehen |
Finden von GameObjects anhand von MonoBehaviour-Skripts
ExampleScript script = GameObject.FindObjectOfType<ExampleScript>();
GameObject go = script.gameObject;
FindObjectOfType()
gibtnull
wenn keiner gefunden wird.
Pros | Cons |
---|---|
Stark getippt | Die Leistung nimmt mit der Anzahl der für die Bewertung benötigten Spielobjekte ab |
Es können sowohl einzelne Objekte als auch ganze Gruppen durchsucht werden |
Finden Sie GameObjects nach Namen aus untergeordneten Objekten
Transform tr = GetComponent<Transform>().Find("NameOfTheObject");
GameObject go = tr.gameObject;
Find
gibtnull
wenn keiner gefunden wird
Pros | Cons |
---|---|
Begrenzter, klar definierter Suchumfang | Strings sind schwache Referenzen |