Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

NullReferenceException: Object reference not set to an instance of an object

Ao duplicar o prefab Zumbi e apagar o prefab original, por ter excluído o personagem errado, deu erro no script Controla Inimigo, no console aparece:

"NullReferenceException: Object reference not set to an instance of an object ControlaInimigo.Vagar () (at Assets/Scripts/ControlaInimigo.cs:70) ControlaInimigo.FixedUpdate () (at Assets/Scripts/ControlaInimigo.cs:43)"

Script Controla Inimigo:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ControlaInimigo : MonoBehaviour, IMatavel
{
    public GameObject Jogadora;
    private MovimentoPersonagem movimentaInimigo;
    private AnimacaoPersonagem animacaoInimigo;
    private Status statusInimigo;
    public AudioClip SomDeMorte;
    private Vector3 posicaoAleatoria;
    private Vector3 direcao;
    private float contadorVagar;
    public float tempoEntrePosicoesAleatorias = 4;
    public float raioPosicao = 10;
    private float porcentagemGerarKitMedico = 0.15f;
    public GameObject KitMedicoPrefab;
    private ControlaInterface scriptControlaInterface;
    [HideInInspector]
    public GeradorZumbis meuGerador;

    // Start is called before the first frame update
    void Start()
    {
        Jogadora = GameObject.FindWithTag(Tags.Jogador);
    animacaoInimigo = GetComponent<AnimacaoPersonagem>();
    movimentaInimigo = GetComponent<MovimentoPersonagem>();
    AleatorizarZumbi();
    statusInimigo = GetComponent<Status>();
    scriptControlaInterface = GameObject.FindObjectOfType(typeof(ControlaInterface)) as ControlaInterface;
    }

    void FixedUpdate()
    {
    float distancia = Vector3.Distance(transform.position, Jogadora.transform.position);

    movimentaInimigo.Rotacionar(direcao);
    animacaoInimigo.Movimentar(direcao.magnitude);

    if(distancia > 15)
    {
        Vagar ();
    }
    else if(distancia > 2.5)
    {
        CorrerParaJogadora ();
    }
    else
    {
       direcao = Jogadora.transform.position - transform.position;
       animacaoInimigo.Atacar(true);
    }
    }

    void Vagar ()
    {
    contadorVagar -= Time.deltaTime;
    if (contadorVagar <= 0)
    {
        posicaoAleatoria = AleatorizarPosicao();
        contadorVagar += tempoEntrePosicoesAleatorias + Random.Range(-1f, 1f);
    }

    bool ficouPertoOSuficiente = Vector3.Distance(transform.position, posicaoAleatoria) <= 0.05;

    if (ficouPertoOSuficiente == false)
    {
        direcao = posicaoAleatoria - transform.position;
        movimentaInimigo.Movimentar(direcao, statusInimigo.Velocidade);
    }
    }

    void CorrerParaJogadora ()
    {
    direcao = Jogadora.transform.position - transform.position;
    movimentaInimigo.Movimentar(direcao, statusInimigo.Velocidade);
    animacaoInimigo.Atacar(false);
    }

    Vector3 AleatorizarPosicao ()
    {
    Vector3 posicao = Random.insideUnitSphere * raioPosicao;
    posicao += transform.position;
    posicao.y = transform.position.y;

    return posicao;
    }

    void AtacaJogadora()
    {
    int dano = Random.Range(20, 30);
    Jogadora.GetComponent<ControlaJogadora>().TomarDano(dano);
    }

    void AleatorizarZumbi ()
    {
    int geraTipoZumbi = Random.Range(1, 28);
    transform.GetChild(geraTipoZumbi).gameObject.SetActive(true);
    }

    public void TomarDano (int dano)
    {
    statusInimigo.Vida -= dano;
    if (statusInimigo.Vida <= 0)
    {
        Morrer();
    }
    }

    public void Morrer ()
    {
    Destroy(gameObject, 2);
    animacaoInimigo.Morrer();
    this.enabled = false;
    movimentaInimigo.Morrer();
    ControlaAudio.instancia.PlayOneShot(SomDeMorte);
    VerificarGeracaoKitMedico(porcentagemGerarKitMedico);
    scriptControlaInterface.AtualizarQuantidadeDeZumbisMortos();
    meuGerador.DiminuirQuantidadeDeZumbisVivos();
    }

    void VerificarGeracaoKitMedico (float porcentagemGeracao)
    {
    if (Random.value <= porcentagemGeracao)
    {
        Instantiate(KitMedicoPrefab, transform.position, Quaternion.identity);
    }
    }
}
6 respostas

Oi, Ana, tudo bem?

O Inimigo tem um script de MovimentoPersonagem nele? Talvez essa referencia esteja faltando por isso o erro.

Tem sim, professor. O script MovimentoPersonagem está no prefab Zumbi.

O erro aparece várias vezes quando tento jogar; no jogo, não demonstra nenhuma falha de execução, no jogador ou no inimigo, e quando tiro do play, consigo apagar esses erros do console.

Segue script MovimentoPersonagem:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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 void Morrer ()
    {
    meuRigidbody.constraints = RigidbodyConstraints.None;
    meuRigidbody.velocity = Vector3.zero;
    GetComponent<Collider>().enabled = false;
    }
}

Oi, Ana, tudo bom?

Você pode fazer um .zip do seu projeto subir num Dropbox, Google Drive, ou alguma coisa assim?

Só lembra de tornar o acesso ao arquivo público. Assim podemos olhar se é alguma coisa no Editor :)

Link do .zip do meu projeto no Google Drive: https://drive.google.com/file/d/1tTHXta0q7ebCF0R4TluUqUQwW3uPZAdY/view?usp=sharing

solução!

Oi, Ana, tudo bem?

Acho que eu toco nesse tópico um pouco a frente no curso, mas seu problema parece referente a ordem os scripts porque se o ControlaInimigo logo de cara precisa do status do Zumbi.

Move a linha do GetComponent<Status>() do Start pra antes das outras coisas porque o status estava sendo utilizado e talvez ele ainda não estivesse sido preenchido.

Pode dar uma olhada se isso sana o problema?

Era isso mesmo! Obrigada, professor!