Ich habe zusammen mit einem Lynda.com-Videokurs verfolgt, um mich mit Unity vertraut zu machen. Ich versuche derzeit, einen Verweis auf die Transformation eines First Person Controllers einer Szene wie folgt abzurufen:
Transform targetObject; // Use this for initialization void Start () { targetObject = gameObject.Find("First Person Controller").transform; }
Und dies ist innerhalb eines Skripts / einer Klasse, die erbt von MonoBehaviour
. Dies führt jedoch zu dem Fehler:
Static member `UnityEngine.GameObject.Find(string)" cannot be accessed with an instance reference, qualify it with a type name instead
Ich bin sicher, dass es eine Möglichkeit gibt, einfach die Logik zu ändern und den gewünschten Effekt mit einem anderen Ansatz zu erzielen. Aber ich verstehe nicht, warum dies zu einem Fehler führt. Es ist derselbe Code, der vom Kursleiter verwendet wird, und aus der Unity Script Reference kann ich ersehen, dass MonoBehaviour
eine gameObject
erbt Mitglied mit der Methode Find()
. Dieser Fehler besagt also, dass es nur eine GameObject
-Instanz für alle MonoBehaviour
-Klassen gibt, oder? Aber sollte ich nicht immer noch in der Lage sein, es als Methoden zu bezeichnen?
Ich verwende Unity 4.1 mit C #, während der Kursleiter 3.5 (mit JS) verwendet, wenn dies hilfreich ist.
Kommentare
- a, wie Benjamin sagt, ' ist fast derselbe Code, den der Kursleiter verwendet. Nur ein Großbuchstabe G sollte Sie aussortieren. Denken Sie daran, Ihre Fehlermeldungen immer zu lesen. Auf " kann nicht mit einer Instanzreferenz zugegriffen werden. Qualifizieren Sie sie stattdessen mit einem Typnamen " sagt Ihnen genau, was ' falsch ist und wie Sie es genau beheben können.
Antwort
Sie haben gerade einen einfachen Tippfehler gemacht. gameObject
ist die aktuelle GameObject
, an die Ihr Skript angehängt ist. GameObject
ist der Typ. Die Fehlermeldung besagt, dass die Funktion Find(string)
nur funktioniert, wenn sie für den Typ (GameObject
) aufgerufen wird, der keine Instanz des Typs ist ( gameObject
).
Einfach ausgedrückt, verwenden Sie GameObject.Find("First Person Controller")
anstelle von gameObject.Find("First Person Controller")
.
Kommentare
- Ah, ja, ich habe es tatsächlich versucht, kurz nachdem ich die Fehlermeldung klarer gepostet und gelesen hatte. Es hat den Fehler behoben, aber vielleicht war es in 3.5 oder mit js erlaubt, weil es definitiv keinen Fehler für sie auslöste '. Vielen Dank für die Antwort!
- JavaScript kann manchmal recht knifflig und unvorhersehbar sein. Ich glaube, es erlaubt Ihnen, Instanzen zu verwenden, um auf statische Methoden zuzugreifen, was ein wenig unintuitiv ist, da die Instanz nicht tatsächlich verwendet wird. Ich empfehle dringend, mit C # nur wegen seiner Regelmäßigkeit zu arbeiten.
Antwort
Transformiere targetObject;
// Use this for initialization void Start () { targetObject = GameObject.Find("First Person Controller").GetComponent<Transform>(); }