GameObject.FindObjectOfType<>() vs GetComponent<>()

GameObject.FindObjectOfType<>() vs GetComponent<>()

Non vuoi usare

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

così spesso. In particolare su start

Per rispondere alla tua domanda, però, queste due funzioni non sono in realtà molto simili. Uno è una chiamata esteriore, l'altro interiore.
Allora qual è la differenza?

  1. Il GameObject.FindObjectOfType è più una ricerca a livello di scena e non è il modo ottimale per ottenere una risposta. In realtà, Unity ha dichiarato pubblicamente il suo riferimento API Unity3D super lento - FindObjectOfType

  2. Il GetComponent<LevelManager>(); è una chiamata locale. Ciò significa che qualsiasi file stia effettuando questa chiamata cercherà solo il GameObject a cui è allegato. Quindi nell'ispettore, il file cercherà solo altre cose nella stessa finestra dell'ispettore. Come Mesh Renderer, Mesh Filter, ecc. O che obiettano i bambini. Credo che ci sia una chiamata separata per questo, però.
    Inoltre, puoi usarlo per accedere ad altri componenti di GameObject se prima li fai riferimento (mostra sotto).

Risoluzione:

Consiglierei di fare un tag cerca nel awake funzione.

private LevelManager levelManager;

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

Non dimenticare di taggare il GameObject con lo script LevelManager su di esso aggiungendo un tag. (Fai clic su GameObject, guarda nella parte superiore dell'ispettore e fai clic su Tag->Aggiungi tag

Puoi farlo o farlo

public LevelManager levelManager;

E trascina GameObject nella casella nell'ispettore.

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

Spero che questo aiuti


Ci sono due differenze:

1.) GetComponent<T> trova un componente solo se è collegato allo stesso 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 GameObject.FindObjectOfType<T> non importa davvero.