1
resposta

[Bug] MissingReferenceException

Quando o Obstaculo é destruido, uma mensagem de erro acontece. Nenhum topico aborda esse tipo de erro. Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Esse é o código que destroi o Obstaculo, teóricamente esta igual ao do github.

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

public class Obstaculo : MonoBehaviour {
    [SerializeField]
    private float velocidade = 0.5f;
    [SerializeField]
    private float variacaoDaPosicaoY;
    private Vector3 posicaoAviao;
    private bool pontuei;
    private Pontuacao pontuacao;

    private void Awake()
    {
        this.transform.Translate(Vector3.up * UnityEngine.Random.Range(-variacaoDaPosicaoY, variacaoDaPosicaoY));
    }

    private void Start()
    {
        this.posicaoAviao = GameObject.FindObjectOfType<Aviao>().transform.position;
        this.pontuacao = GameObject.FindAnyObjectByType<Pontuacao>();
    }

    private void Update() {
        this.transform.Translate(Vector3.left * this.velocidade * Time.deltaTime);

        if(!this.pontuei && this.transform.position.x < this.posicaoAviao.x)
        {
            Debug.Log("Pontuou");
            this.pontuei = true;
            this.pontuacao.AdicionarPontos();
        }
    }

    private void OnTriggerEnter2D(Collider2D outro) {
        this.Destruir();
    }

    public void Destruir() { 
        GameObject.Destroy(this.gameObject);
    }
}
1 resposta

Olá Willian! Como vai?

O erro MissingReferenceException que você está enfrentando no Unity geralmente ocorre quando você tenta acessar um objeto que já foi destruído. No seu caso, parece que após a destruição do obstáculo, algum outro script ou parte do código continua tentando acessar esse objeto.

Pela descrição do seu problema e o contexto fornecido, uma possível causa para esse erro pode ser a tentativa de acessar a pontuação (this.pontuacao) após o obstáculo ter sido destruído. Se o objeto pontuacao estiver tentando acessar o obstáculo destruído, isso pode gerar o erro que você está vendo.

Uma coisa que notei no seu código é que você está usando GameObject.FindAnyObjectByType<Pontuacao>();, o que parece ser um erro de digitação. O método correto para encontrar um objeto do tipo Pontuacao seria GameObject.FindObjectOfType<Pontuacao>();.

Além disso, é uma boa prática verificar se o objeto ainda existe antes de tentar acessá-lo. Você pode fazer isso verificando se o objeto é null antes de chamar métodos nele.

Se o erro persistir, seria útil verificar se há outros scripts ou componentes que possam estar tentando acessar o obstáculo após sua destruição e adicionar verificações de nulidade apropriadas também nesses locais.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software