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?
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
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
@Kryptos, was meinst du mit 'Objekt'? 'GetComponent
Interessanterweise wird 'GetComponent
@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