Jai suivi un cours vidéo Lynda.com pour me familiariser avec Unity. Jessaie actuellement de saisir une référence à la transformation du contrôleur à la première personne dune scène comme suit:
Transform targetObject; // Use this for initialization void Start () { targetObject = gameObject.Find("First Person Controller").transform; }
Et cest dans un script / une classe qui hérite de MonoBehaviour
. Cependant, cela donne lerreur:
Static member `UnityEngine.GameObject.Find(string)" cannot be accessed with an instance reference, qualify it with a type name instead
Je suis sûr quil existe un moyen de simplement changer la logique et dobtenir leffet désiré avec une approche différente. Mais je ne comprends pas pourquoi cela entraîne une erreur. Cest le même code utilisé par linstructeur du cours, et daprès la référence de script Unity, je peux voir que MonoBehaviour
hérite dun gameObject
membre qui a la méthode Find()
. Donc, cette erreur signifie quil ny a quune seule instance GameObject
pour toutes les classes MonoBehaviour
, nest-ce pas? Mais est-ce que je ne devrais pas encore être en mesure de lappeler méthodes?
Jutilise Unity 4.1 avec C # tandis que linstructeur utilise 3.5 (avec JS) si cela aide.
Commentaires
- Oui, comme le dit Benjamin, cest ' presque le même code que linstructeur utilise. Juste un G majuscule devrait vous trier. Noubliez pas de toujours lire vos messages derreur, " nest pas accessible avec une référence dinstance, qualifiez-la avec un nom de type à la place " vous dit exactement ce que ' ne va pas et comment y remédier.
Réponse
En fait, vous venez de faire une simple faute de frappe. gameObject
est le GameObject
actuel auquel votre script est associé. GameObject
est le type. Le message derreur indique que la fonction Find(string)
ne fonctionne que lorsquelle est appelée sur le type (GameObject
) et non sur une instance du type ( gameObject
).
En termes simples, utilisez GameObject.Find("First Person Controller")
au lieu de gameObject.Find("First Person Controller")
.
Commentaires
- Ah, oui, jai en fait essayé cela peu de temps après avoir posté et lu le message derreur plus clairement. Cela a corrigé lerreur, mais peut-être était-ce autorisé dans la version 3.5 ou avec js, car cela ne provoquait certainement pas ' une erreur pour elle. Merci pour la réponse!
- JavaScript peut parfois être assez délicat et imprévisible. Je pense que cela vous permet dutiliser des instances pour accéder à des méthodes statiques, ce qui est un peu peu intuitif car linstance nest pas réellement utilisée. Je suggère fortement de travailler avec C # simplement pour sa régularité.
Réponse
Transformer targetObject;
// Use this for initialization void Start () { targetObject = GameObject.Find("First Person Controller").GetComponent<Transform>(); }