2015-05-18 20 views
5

Ho seguito diverse serie di tutorial e ho visto questi due utilizzati in modi molto simili, e speravo che qualcuno potesse spiegare come differivano e, se possibile, esempi di quando useresti uno invece dell'altro (presumendo che siano effettivamente simili!).GameObject.FindObjectOfType <>() vs GetComponent <>()

private LevelManager levelManager; 

void Start() { 
    levelManager = GameObject.FindObjectOfType<LevelManager>(); 
} 

e

private LevelManager levelManager; 

void Start() { 
    levelManager = GetComponent<LevelManager>(); 
} 

risposta

10

Se non si desidera utilizzare

void Start() { 
    levelManager = GameObject.FindObjectOfType<LevelManager>(); 
} 

che spesso. In particolare su start

Per rispondere alla domanda, queste due funzioni in realtà non sono molto simili. Uno è un richiamo esterno, l'altro un interno.
Quindi qual è la differenza?

  1. Il GameObject.FindObjectOfType è più di una ricerca estesa scena e non è il modo ottimale di ottenere una risposta. In realtà, Unity ha dichiarato pubblicamente il suo super slow

  2. Il GetComponent<LevelManager>(); è una chiamata locale. Il significato di qualsiasi file sta effettuando questa chiamata cercherà solo il GameObject a cui è collegato. Quindi nell'ispettore, il file cercherà solo altre cose nella stessa finestra di ispezione. Come Mesh Renderer, Mesh Filter, Etc. O che oggetti bambini. Credo che ci sia una chiamata separata per questo, però.
    Inoltre, è possibile utilizzarlo per accedere ad altri componenti di GameObject se li si fa riferimento per primi (vedi sotto).

Risoluzione:

mi sento di raccomandare facendo una ricerca tag nella funzione awake.

private LevelManager levelManager; 

void Awake() { 
    levelManager = GameObject.FindGameObjectWithTag ("manager").GetComponent<LevelManager>(); 
} 

Non dimenticare di contrassegnare il GameObject con lo script LevelManager su di esso con l'aggiunta di un tag. (Fare clic GameObject, guardare la parte superiore della finestra di ispezione, e fare clic su Tag-> Aggiungi comando

Si può fare, o fare

public LevelManager levelManager; 

e trascinare il GameObject nella casella della finestra di ispezione.

Entrambe le opzioni sono decisamente migliori rispetto a un GameObject.FindObjectOfType.

Spero che questo aiuti

5

Ci sono due differenze:

1.) GetComponent<T> trova un componente solo se è attaccato alla stessa GameObject. GameObject.FindObjectOfType<T> d'altra parte cerca l'intera gerarchia e restituisce il primo oggetto che corrisponde!

2.) GetComponent<T> restituisce solo un oggetto che eredita da Component, mentre lo GameObject.FindObjectOfType<T> non interessa molto.

+1

@Kryptos, cosa si intende per 'Object'? 'GetComponent '? Ciò restituirà il primo componente, che è probabilmente un MonoBehaviour e ancora eredita da 'Component'. – walther

+1

È interessante notare che 'GetComponent ' restituirà il primo componente di 'GameObject' (che dovrebbe sempre essere il' Transform'). Si noti inoltre che 'FindObjectOfType ' non è definito in 'GameObject' ma in' Object' (che è la classe radice per qualsiasi altra classe in Unity API), quindi è possibile trovare qualsiasi cosa con esso. – Kryptos

+1

@Kryptos, suppongo che 'Transform' sia un tipo speciale di componente, perché non è possibile rimuoverlo, quindi forse è per questo che viene omesso da' GetComponent '. Probabilmente nessuno tenterà mai di fare riferimento a una trasformazione (o qualsiasi altro componente per essere onesti) da GetComponent . – walther