Ricerca…


Sintassi

  • public static GameObject Find (nome stringa);
  • public static GameObject FindGameObjectWithTag (tag stringa);
  • public static GameObject [] FindGameObjectsWithTag (tag stringa);
  • oggetto statico pubblico FindObjectOfType (Tipo tipo);
  • oggetto statico pubblico [] FindObjectsOfType (Type type);

Osservazioni

Quale metodo usare

Prestare attenzione durante la ricerca di GameObjects in fase di esecuzione, in quanto ciò può essere il consumo di risorse. In particolare: non eseguire FindObjectOfType o Trova in Update, FixedUpdate o più in generale in un metodo chiamato una o più volte per frame.

  • Chiama i metodi di runtime FindObjectOfType e Find solo quando necessario
  • FindGameObjectWithTag ha prestazioni molto buone rispetto ad altri metodi basati su stringhe. Unity mantiene schede separate su oggetti taggati e interroga quelle invece dell'intera scena.
  • Per GameObjects "statici" (come elementi dell'interfaccia utente e prefabbricati) creati nell'editor, utilizzare il riferimento serializzabile GameObject nell'editor
  • Mantieni i tuoi elenchi di GameObjects in List o Array che gestisci tu stesso
  • In generale, se istanziate molti GameObjects dello stesso tipo date un'occhiata a Pooling degli oggetti
  • Memorizza i risultati della ricerca nella cache per evitare di eseguire ripetutamente i costosi metodi di ricerca.

Andando più a fondo

Oltre ai metodi forniti con Unity, è relativamente facile progettare i propri metodi di ricerca e raccolta.

  • In caso di FindObjectsOfType() , è possibile che gli script mantengano un elenco di se stessi in una raccolta static . È molto più rapido iterare un elenco di oggetti pronto piuttosto che cercare e ispezionare oggetti dalla scena.

  • Oppure crea uno script che memorizza le loro istanze in un Dictionary basato su stringhe e disponi di un semplice sistema di codifica che puoi espandere.

Ricerca per nome di GameObject

var go = GameObject.Find("NameOfTheObject");
Professionisti Contro
Facile da usare Le prestazioni si degradano lungo il numero di oggetti di gioco in scena
Le stringhe sono riferimenti deboli e sospetti di errori dell'utente

Ricerca per tag di GameObject

var go = GameObject.FindGameObjectWithTag("Player");
Professionisti Contro
È possibile cercare sia singoli oggetti che interi gruppi Le stringhe sono riferimenti deboli e sospetti di errori dell'utente.
Relativamente veloce ed efficiente Il codice non è portatile in quanto i tag sono codificati in modo sicuro negli script.

Inserito negli script in modalità Modifica

[SerializeField]
GameObject[] gameObjects;
Professionisti Contro
Grande esibizione La raccolta di oggetti è statica
Codice portatile Può solo riferirsi a GameObjects dalla stessa scena

Trovare gli oggetti GameObjects tramite MonoBehaviour

ExampleScript script = GameObject.FindObjectOfType<ExampleScript>();
GameObject go = script.gameObject;

FindObjectOfType() restituisce null se non viene trovato alcuno.

Professionisti Contro
Fortemente tipizzato Le prestazioni si degradano lungo il numero di oggetti di gioco necessari per la valutazione
È possibile cercare sia singoli oggetti che interi gruppi

Trova GameObjects per nome dagli oggetti figlio

Transform tr = GetComponent<Transform>().Find("NameOfTheObject");
GameObject go = tr.gameObject;

Find restituisce null se non viene trovato alcuno

Professionisti Contro
Ambito di ricerca limitato e ben definito Le stringhe sono riferimenti deboli


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow