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
FindObjectOfTypeeFindsolo quando necessario -
FindGameObjectWithTagha 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
Dictionarybasato 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()restituiscenullse 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;
Findrestituiscenullse non viene trovato alcuno
| Professionisti | Contro |
|---|---|
| Ambito di ricerca limitato e ben definito | Le stringhe sono riferimenti deboli |