Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
15
respostas

o codigo nao encontra a definição de direcao e velocidade

depois de assistir a aula fui textar como no video mas um puoco depois de ter ligado o jogo apareceu um erro que nao consigo solucionar. O erro é esse abaixo:

NullReferenceException: referência de objeto não definida para uma instância de um objeto MovimentoPersonagem.Rotacionar (UnityEngine.Vector3 direcao) (em Assets/codigos/MovimentoPersonagem.cs:19) ControlaInimigo.FixedUpdate() (em Assets/codigos/ControlaInimigo.cs:24)

15 respostas

Olá, Edison! Parece que você está enfrentando um problema comum em programação, que é a exceção NullReferenceException. Isso geralmente ocorre quando tentamos acessar um objeto ou uma de suas propriedades/métodos que ainda não foi instanciado.

No seu caso, o erro está acontecendo na linha 19 do script MovimentoPersonagem.cs e na linha 24 do script ControlaInimigo.cs. Parece que o objeto direcao não está sendo corretamente instanciado antes de ser usado.

Confere se o MovimentoPersonagem na linha 19 tem algo que não existe no zumbi, lembra de aplicar o prefab

Espero ter ajudado e bons estudos!

ola henrique, na linha 19 do "MovimentoPersonagem" tem novaRotacao que o "Controla inimigo" não tem. E sobre a direcao, como eu resolvo esse problema?

Pode colar como está seus dois scripts aqui?

public class MovimentoPersonagem : MonoBehaviour{
private Rigidbody meuRigidbody;
void AwaKe(){
    meuRigidbody = GetComponent<Rigidbody>();
}


    public void Movimentar (Vector3 direcao, float velocidade)
    {
       meuRigidbody.MovePosition (meuRigidbody.position + (direcao.normalized * velocidade * Time.deltaTime));
    }
    public void Rotacionar (Vector3 direcao)
    {
        Quaternion novaRotacao = Quaternion.LookRotation(direcao);
     meuRigidbody.MoveRotation(novaRotacao);
    }
}
public class ControlaInimigo : MonoBehaviour {
public GameObject Jogador;
public Quaternion novaRotacao;
public float Velocidade;
private MovimentoPersonagem meuMovimentoInimigo;
    // Start is called before the first frame update
    void Start() {
     Jogador = GameObject.FindWithTag("Jogador"); 
     int geraTipoZumbi = Random.Range(1, 28);
     transform.GetChild(geraTipoZumbi).gameObject.SetActive(true);
     meuMovimentoInimigo = GetComponent<MovimentoPersonagem>(); 
    }

    void FixedUpdate() 
    {
    
        Vector3 direcao = Jogador.transform.position - transform.position;

       float distancia = Vector3.Distance( Jogador.transform.position, transform.position);
       
       meuMovimentoInimigo.Rotacionar(direcao);

       if( distancia > 2.5)
       {
       meuMovimentoInimigo.Movimentar(direcao, Velocidade);
       
       GetComponent<Animator>().SetBool("Atacando", false);
       }
       else
       {
        GetComponent<Animator>().SetBool("Atacando", true);
       }
    }
    void AtacaJogador ()
    {
      int dano = Random.Range(20, 30);
    Jogador.GetComponent<ControlaPersonagem>().TomarDano(dano);
    }    
}
public class ControlaInimigo : MonoBehaviour {
public GameObject Jogador;
public Quaternion novaRotacao;
public float Velocidade;
private MovimentoPersonagem meuMovimentoInimigo;
   
    void Start() {
   
     Jogador = GameObject.FindWithTag("Jogador"); 
     
     int geraTipoZumbi = Random.Range(1, 28);
     
     transform.GetChild(geraTipoZumbi).gameObject.SetActive(true);
     
     meuMovimentoInimigo = GetComponent<MovimentoPersonagem>(); 
    }

o primeiro e do movimentoPersonagem e o segundo e terceiro são do controlaInimigo.

Ok e o inimigo tem o script ControlaInimigo e MovimentoPersonagem anexados a ele, certo?

sim, esta.

Faz o seguinte, faz um .zip de toda a pasta do projeto e coloca em algum lugar tipo Dropbox, Google Drive, etc. aí eu baixo aqui e dou uma olhada :)

Olá! Pode colocar o compartilhamento como publico? É só clicar com o botão direito no arquivo e editar nas opções, assim consigo acessar.

mudei aqui

solução!

Confere o método Awake do MovimentaPersonagem, lembra que o nome tem que ser certinho está AwaKe fazendo com que a variável do rigidbody não seja preenchido e tudo falhe.

Acho que resolvendo isso os problemas desaparecem.

Bons estudos!

obrigado cara, funcionou certinho.