Ho seguito un corso video su Lynda.com per familiarizzare con Unity. Attualmente sto tentando di ottenere un riferimento alla trasformazione del controller in prima persona di una scena come segue:
Transform targetObject; // Use this for initialization void Start () { targetObject = gameObject.Find("First Person Controller").transform; }
E questo è allinterno di uno script / classe che eredita da MonoBehaviour
. Tuttavia, questo dà lerrore:
Static member `UnityEngine.GameObject.Find(string)" cannot be accessed with an instance reference, qualify it with a type name instead
Sono sicuro che ci sia un modo per cambiare semplicemente la logica e ottenere leffetto desiderato con un approccio diverso. Ma non capisco perché questo si traduca in un errore. È lo stesso codice utilizzato dallistruttore del corso e da Unity Script Reference, posso vedere che MonoBehaviour
eredita un gameObject
membro che ha il metodo Find()
. Quindi questo errore sta dicendo che esiste solo unistanza GameObject
per tutte le classi MonoBehaviour
, giusto? Ma non dovrei ancora essere in grado di chiamarlo metodi?
Sto usando Unity 4.1 con C # mentre linsegnante usa 3.5 (con JS) se questo aiuta.
Commenti
- Sì, come dice Benjamin, ' è quasi lo stesso codice usato dallistruttore. Solo una G maiuscola dovrebbe risolverti. Ricorda di leggere sempre i tuoi messaggi di errore, " non è accessibile con un riferimento allistanza, qualificalo con un nome di tipo " ti sta dicendo esattamente cosa ' è sbagliato ed esattamente come risolverlo.
Risposta
In realtà hai appena fatto un semplice errore di battitura. gameObject
è lattuale GameObject
a cui è allegato lo script. GameObject
è il tipo. Il messaggio di errore dice che la funzione Find(string)
funziona solo quando viene chiamata sul tipo (GameObject
) non è unistanza del tipo ( gameObject
).
In poche parole, utilizza GameObject.Find("First Person Controller")
invece di gameObject.Find("First Person Controller")
.
Commenti
- Ah, sì, ho provato a farlo subito dopo aver postato e letto il messaggio di errore in modo più chiaro. Ha corretto lerrore, ma forse era consentito in 3.5 o con js, perché ' non sollevava alcun errore per lei. Grazie per la risposta!
- JavaScript può essere abbastanza complicato e imprevedibile, a volte. Credo che ti consenta di utilizzare istanze per accedere a metodi statici, il che non è intuitivo perché listanza non viene effettivamente utilizzata. Consiglio vivamente di lavorare con C # semplicemente per la sua regolarità.
Answer
Transform targetObject;
// Use this for initialization void Start () { targetObject = GameObject.Find("First Person Controller").GetComponent<Transform>(); }