unity3d
Trovare e collezionare GameObjects
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
eFind
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 raccoltastatic
. È 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()
restituiscenull
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
restituiscenull
se non viene trovato alcuno
Professionisti | Contro |
---|---|
Ambito di ricerca limitato e ben definito | Le stringhe sono riferimenti deboli |