2015-05-18 32 views
5

Ich habe mehrere Tutorial-Serien verfolgt und habe diese beiden auf sehr ähnliche Weise verwendet, und hoffte, jemand könnte erklären, wie sie sich unterscheiden und, wenn möglich, Beispiele dafür wenn Sie eine anstelle der anderen verwenden würden (vorausgesetzt, dass sie tatsächlich ähnlich sind!).GameObject.FindObjectOfType <>() vs GetComponent <>()

private LevelManager levelManager; 

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

und

private LevelManager levelManager; 

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

Antwort

10

Sie wollen nicht

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

, die häufig verwendet werden. Besonders auf start

Um Ihre Frage zu beantworten, sind diese beiden Funktionen eigentlich nicht sehr ähnlich. Der eine ist ein äußerer Ruf, der andere ein Inneres.
Was ist der Unterschied?

  1. Die GameObject.FindObjectOfType ist eher eine Szene weiten Suche und ist nicht der optimale Weg, um eine Antwort zu bekommen. Eigentlich Einheit öffentlich gesagt, seine super langsam Unity3D API Reference - FindObjectOfType

  2. Die GetComponent<LevelManager>(); ist ein lokaler Anruf. Das bedeutet, dass jede Datei, die diesen Aufruf ausführt, nur das GameObject durchsucht, an das sie angehängt ist. Im Inspektor sucht die Datei nur nach anderen Objekten im selben Inspektorfenster. Wie Mesh Renderer, Mesh Filter, etc. Oder das Objekte untergeordnete Objekte. Ich glaube, dafür gibt es einen separaten Aufruf.
    Sie können dies auch verwenden, um auf andere GameObject-Komponenten zuzugreifen, wenn Sie zuerst darauf verweisen (siehe unten).

Auflösung:

Ich würde empfehlen, in der awake Funktion eine tag-Suche.

private LevelManager levelManager; 

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

Vergessen Sie nicht, das Gameobject mit dem Skript LevelManager auf sie zu markieren, durch einen Tag hinzuzufügen. (Klicken Sie auf die Gameobject, Blick auf die Spitze des Inspektors, und klicken Sie auf Tag-> Add Tag

Sie das tun können, oder tun

public LevelManager levelManager; 

und ziehen Sie das Gameobject in die Box in der Inspektor.

Jede Option ist deutlich besser als eine GameObject.FindObjectOfType.

Hoffe, das hilft

5

Es gibt zwei Unterschiede:

1.) GetComponent<T> findet eine Komponente nur dann, wenn es auf den gleichen Gameobject angebracht ist. GameObject.FindObjectOfType<T> auf der anderen Seite sucht ganze Hierarchie und gibt das erste Objekt zurück, das übereinstimmt!

2.) GetComponent<T> gibt nur ein Objekt, das von Component erbt, während GameObject.FindObjectOfType<T> nicht wirklich interessieren.

+1

@Kryptos, was meinst du mit 'Objekt'? 'GetComponent '? Das wird die erste Komponente zurückgeben, die höchstwahrscheinlich ein MonoBehaviour ist und immer noch von "Component" erbt. – walther

+1

Interessanterweise wird 'GetComponent 'die erste Komponente des' GameObject' zurückgeben (was immer die 'Transform' sein sollte). Beachten Sie auch, dass 'FindObjectOfType ' nicht in 'GameObject' definiert ist, sondern in' Object' (welches die Wurzelklasse für jede andere Klasse in Unity API ist), so dass Sie tatsächlich alles damit finden können. – Kryptos

+1

@Kryptos, Ich denke, 'Transform 'ist eine spezielle Art von Komponente, weil Sie es nicht entfernen können, deshalb wird es deshalb von' GetComponent ' weggelassen. Wahrscheinlich wird niemand jemals versuchen, durch GetComponent auf eine Transformation (oder eine andere Komponente um ehrlich zu sein) zu verweisen. – walther