Tenho acompanhado um curso de vídeo do Lynda.com para me familiarizar com o Unity. No momento, estou tentando obter uma referência à transformação do Controlador de primeira pessoa de uma cena da seguinte maneira:
Transform targetObject; // Use this for initialization void Start () { targetObject = gameObject.Find("First Person Controller").transform; }
E isso está dentro de um script / classe que herda de MonoBehaviour
. No entanto, isso dá o erro:
Static member `UnityEngine.GameObject.Find(string)" cannot be accessed with an instance reference, qualify it with a type name instead
Tenho certeza de que há uma maneira de apenas mudar a lógica e obter o efeito desejado com uma abordagem diferente. Mas não entendo por que isso resulta em um erro. É o mesmo código usado pelo instrutor do curso e, na Referência do Unity Script, posso ver que MonoBehaviour
herda um gameObject
membro que possui o método Find()
. Portanto, este erro está dizendo que há apenas uma GameObject
instância para todas as MonoBehaviour
classes, certo? Mas eu ainda não deveria ser capaz de chamá-los de métodos?
Estou usando Unity 4.1 com C # enquanto o instrutor está usando 3.5 (com JS) se isso ajudar.
Comentários
- Sim, como diz Benjamin, é ' é quase o mesmo código que o instrutor usa. Apenas um G maiúsculo deve resolver você. Lembre-se de sempre ler suas mensagens de erro, " não pode ser acessado com uma referência de instância, qualifique-o com um nome de tipo " está dizendo exatamente o que ' está errado e exatamente como corrigi-lo.
Resposta
Na verdade, você acabou de cometer um erro de digitação. gameObject
é o GameObject
atual ao qual seu script está anexado. GameObject
é o tipo. A mensagem de erro está dizendo que a função Find(string)
só funciona quando é chamada no tipo (GameObject
) não uma instância do tipo ( gameObject
).
Simplificando, use GameObject.Find("First Person Controller")
em vez de gameObject.Find("First Person Controller")
.
Comentários
- Ah, sim, na verdade, tentei fazer isso logo após postar e ler a mensagem de erro com mais clareza. Ele corrigiu o erro, mas talvez fosse permitido no 3.5 ou com js, porque definitivamente não ' gerou um erro para ela. Obrigado pela resposta!
- JavaScript pode ser bastante complicado e imprevisível às vezes. Eu acredito que ele permite que você use instâncias para acessar métodos estáticos, o que é um pouco não intuitivo porque a instância não é realmente usada. Eu sugiro trabalhar com C # simplesmente por sua regularidade.
Resposta
Transformar targetObject;
// Use this for initialization void Start () { targetObject = GameObject.Find("First Person Controller").GetComponent<Transform>(); }