Ik heb een Lynda.com-videocursus gevolgd om vertrouwd te raken met Unity. Ik probeer momenteel als volgt een verwijzing te krijgen naar de transformatie van de First Person Controller van een scène:
Transform targetObject; // Use this for initialization void Start () { targetObject = gameObject.Find("First Person Controller").transform; }
En dit is in een script / klasse die erft van MonoBehaviour
. Dit geeft echter de fout:
Static member `UnityEngine.GameObject.Find(string)" cannot be accessed with an instance reference, qualify it with a type name instead
Ik weet zeker dat er een manier is om gewoon de logica te veranderen en het gewenste effect te krijgen met een andere benadering. Maar ik begrijp niet waarom dit een fout oplevert. Het is dezelfde code die wordt gebruikt door de docent van de cursus en uit de Unity Script Reference kan ik zien dat MonoBehaviour
een gameObject
erft lid met de Find()
methode. Dus deze fout zegt dat er maar één GameObject
instantie is voor alle MonoBehaviour
klassen, toch? Maar zou ik het niet nog steeds de methoden moeten kunnen noemen?
Ik gebruik Unity 4.1 met C # terwijl de instructeur 3.5 (met JS) gebruikt als dat helpt.
Reacties
- Ja, zoals Benjamin zegt, het ' s bijna dezelfde code die de instructeur gebruikt. Alleen een hoofdletter G zou je moeten uitzoeken. Denk eraan om altijd uw foutmeldingen te lezen, " is niet toegankelijk met een instantiereferentie, kwalificeer deze met een typenaam " vertelt je precies wat ' fout is en hoe je dit kunt oplossen.
Antwoord
Je hebt eigenlijk gewoon een simpele typefout gemaakt. gameObject
is de huidige GameObject
waaraan uw script is gekoppeld. GameObject
is het type. Het foutbericht zegt dat de Find(string)
-functie alleen werkt wanneer deze wordt aangeroepen op het type (GameObject
) en niet een instantie van het type ( gameObject
).
Simpel gezegd, gebruik GameObject.Find("First Person Controller")
in plaats van gameObject.Find("First Person Controller")
.
Opmerkingen
- Ah, ja, ik heb dit eigenlijk kort na het plaatsen geprobeerd en het foutbericht duidelijker gelezen. Het loste de fout op, maar misschien was het toegestaan in 3.5 of met js, omdat het zeker ' geen fout voor haar veroorzaakte. Bedankt voor het antwoord!
- JavaScript kan soms behoorlijk lastig en onvoorspelbaar zijn. Ik geloof dat je hiermee instanties kunt gebruiken om toegang te krijgen tot statische methoden, wat een beetje niet intuïtief is omdat de instantie niet echt wordt gebruikt. Ik raad ten zeerste aan om met C # te werken alleen vanwege de regelmaat ervan.
Answer
Transform targetObject;
// Use this for initialization void Start () { targetObject = GameObject.Find("First Person Controller").GetComponent<Transform>(); }