GameObject.FindObjectOfType<>() vs GetComponent<>()
Habe ich nach mehreren tutorial-Reihe und habe gesehen, wie diese zwei verwendet, die auf sehr ähnliche Weise, und hatte gehofft, jemand könnte erklären, wie Sie sich unterscheiden und, wenn möglich, Beispiele von, wenn Sie verwenden würden, anstelle der anderen (vorausgesetzt Sie sind wirklich ähnlich!).
private LevelManager levelManager;
void Start () {
levelManager = GameObject.FindObjectOfType<LevelManager>();
}
und
private LevelManager levelManager;
void Start () {
levelManager = GetComponent<LevelManager>();
}
InformationsquelleAutor JonHerbert | 2015-05-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sie nicht verwenden möchten
oft. Besonders auf
start
Ihre Frage zu beantworten, obwohl diese beiden Funktionen sind eigentlich nicht sehr ähnlich. Die eine ist eine äußere nennen, die anderen eine innere.
Also, was ist der Unterschied?
Den
GameObject.FindObjectOfType
ist eher eine Szene, die große Suche und das ist nicht der optimale Weg, um eine Antwort. Eigentlich ist die Einheit öffentlich erklärte, seine super langsam Unity3D API-Referenz - FindObjectOfTypeDen
GetComponent<LevelManager>();
ist ein lokaler Aufruf. Bedeutung was auch immer-Datei ist, dass dieser Anruf nur die GameObject, dass es angebracht ist. Also im Bereich "Informationen", die Datei, die auf der Suche nach anderen Dinge, die in der gleichen Inspektor-Fenster. Wie der Mesh-Renderer, Mesh-Filter, Etc. Oder, dass Objekte, die Kinder. Ich glaube, es gibt einen separaten Aufruf für diese, obwohl.Auch Sie können dies nutzen, um Zugriff auf andere GameObject Komponenten Hinweis wenn Sie Sie zuerst (Karte unten).
Auflösung:
Ich würde empfehlen, tun ein
tag
Suche imawake
Funktion.Vergessen Sie nicht, tag das GameObject mit dem Skript
LevelManager
auf es durch hinzufügen einer tag. (Klicken Sie auf das GameObject, sich an der Spitze von "Inspektor", und klicken Sie auf Tag->Add TagsKönnen Sie das tun, oder tun
Und ziehen Sie das GameObject in der box im Bereich "Informationen".
Entweder option ist deutlich besser, als bei einem
GameObject.FindObjectOfType
.Hoffe, das hilft
InformationsquelleAutor iSkore
Gibt es zwei Unterschiede:
1.)
GetComponent<T>
findet eine Komponente nur dann, wenn es an die gleichen GameObject.GameObject.FindObjectOfType<T>
auf der anderen Seite sucht der gesamten Hierarchie und gibt das erste Objekt, das passt!2.)
GetComponent<T>
gibt nur ein Objekt,, erbt vonComponent
, währendGameObject.FindObjectOfType<T>
egal.Object
?GetComponent<Object>
? Das wird wieder die erste Komponente, die den meisten wohl ein MonoBehaviour und es ist immer noch Erben vonComponent
.Interessanterweise
GetComponent<Object>
zurückkehren wird, die erste Komponente desGameObject
(das sollte immer derTransform
). Beachten Sie auch, dassFindObjectOfType<T>
ist nicht definiertGameObject
aber inObject
(was ist die root-Klasse für jede andere Klasse in der Unity API), so dass man eigentlich nichts mit ihm.Ich denke
Transform
ist eine spezielle Art von Komponente, da kann man nicht entfernen Sie es, so vielleicht das ist, warum wird es weggelassen, indemGetComponent<T>
. Wohl niemand wird jemals versuchen, eine Referenz zu verwandeln (oder jede andere Komponente, um ehrlich zu sein) von GetComponent<Object> sowieso.InformationsquelleAutor walther