3
respostas

[Dúvida] O contador não esta funcionando

Toda vez que atiro em um zumbi, além do contador não funcionar, aparece este erro:

NullReferenceException: Object reference not set to an instance of an object ControlaInterface.AtualizarQuantidadeZumbisMortos () (at Assets/Scripts/ControlaInterface.cs:38) ControlaInimigo.Morrer () (at Assets/Scripts/ControlaInimigo.cs:109) ControlaInimigo.TomarDano (System.Int32 dano) (at Assets/Scripts/ControlaInimigo.cs:100) Bala.OnTriggerEnter (UnityEngine.Collider objetoDeColisao) (at Assets/Scripts/Bala.cs:27)

Tenho uma noção de qual seja o erro, mas não consigo resolve-lo

3 respostas

segue os codigos que o console fala que da erro:

public class ControlaInterface : MonoBehaviour { private ControlaJogador scriptControlaJogador; public Slider SliderVidaJogador; public GameObject PainelDeGameOver; public Text TextoTempoDeSobrevivencia; public Text TextoPontuacaoMaxima; private float TempoPontuacaoSalvo; private int quantidadeDeZumbisMortos; public Text TextoQuantidadeDeZumbisMortos;

// Start is called before the first frame update
void Start()
{
    scriptControlaJogador = GameObject.FindWithTag("Jogador").GetComponent<ControlaJogador>();

    SliderVidaJogador.maxValue = scriptControlaJogador.statusJogador.Vida;
    AtualizarSliderVidaJogador();
    Time.timeScale = 1;
    TempoPontuacaoSalvo = PlayerPrefs.GetFloat("PontuacaoMaxima");
}

public void AtualizarSliderVidaJogador ()
{
    SliderVidaJogador.value = scriptControlaJogador.statusJogador.Vida;
}

public void AtualizarQuantidadeZumbisMortos()
{
    quantidadeDeZumbisMortos++;
    TextoQuantidadeDeZumbisMortos.text = string.Format("X {0}", quantidadeDeZumbisMortos);
}

public void GameOver ()
{
    PainelDeGameOver.SetActive(true);
    Time.timeScale = 0;

    int minutos = (int)(Time.timeSinceLevelLoad / 60);
    int segundos = (int)(Time.timeSinceLevelLoad % 60);
    TextoTempoDeSobrevivencia.text = "Você sobreviveu por " + minutos + "mins e " + segundos + "s";

    AjustarPontuacaoMaxima(minutos, segundos);
}

void AjustarPontuacaoMaxima(int min, int seg)
{ 
    if(Time.timeSinceLevelLoad > TempoPontuacaoSalvo)
    {
        TempoPontuacaoSalvo = Time.timeSinceLevelLoad;
        TextoPontuacaoMaxima.text = string.Format("Seu melhor tempo é de {0}mins e {1}s", min, seg);

        PlayerPrefs.SetFloat("PontuacaoMaxima", TempoPontuacaoSalvo);
    }

    if(TextoPontuacaoMaxima.text == "")
    {
        min = (int)TempoPontuacaoSalvo / 60;
        seg = (int)TempoPontuacaoSalvo % 60;
        TextoPontuacaoMaxima.text = string.Format("Seu melhor tempo é de {0}mins e {1}s", min, seg);
    }
}

public void Reiniciar()
{
    SceneManager.LoadScene("Aula Alura Apocalipse Zumbi");
}

}

public class Bala : MonoBehaviour {

public float Velocidade = 30;
public Rigidbody rigidbodyBala;
public AudioClip SomDeMorte;

private void Start() 
{
    rigidbodyBala = GetComponent<Rigidbody>();
}

// Update is called once per frame
void FixedUpdate () {
    rigidbodyBala.MovePosition
        (rigidbodyBala.position + 
        transform.forward * Velocidade * Time.deltaTime);
}

void OnTriggerEnter(Collider objetoDeColisao)
{
    if(objetoDeColisao.tag == "Inimigo")
    {
        objetoDeColisao.GetComponent<ControlaInimigo>().TomarDano(1);
    }

    Destroy(gameObject);
}

}

public class ControlaInimigo : MonoBehaviour, IMatavel { public GameObject Jogador; private MovimentoPersonagem movimentoInimigo; private AnimacaoPersonagem animacaoInimigo; private Status statusInimigo; public AudioClip SomDeMorte; private Vector3 posicaoAleatoria; private Vector3 direcao; private float contadorVagar; private float tempoEntrePosicoesAleatorias = 4; private float porcentagemGerarKitMedico = 0.1f; public GameObject KitMedicoPrefab; private ControlaInterface scriptControlaInterface;

void Start()
{
    Jogador = GameObject.FindWithTag("Jogador");
    animacaoInimigo = GetComponent<AnimacaoPersonagem>();
    movimentoInimigo = GetComponent<MovimentoPersonagem>();
    AleatorizarZumbi();
    statusInimigo = GetComponent<Status>();
    scriptControlaInterface = GameObject.FindObjectOfType(typeof(ControlaInterface)) as ControlaInterface;
}

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

    direcao = Jogador.transform.position - transform.position;
    animacaoInimigo.Movimentar(direcao.magnitude);

    movimentoInimigo.Rotacionar(direcao);

    if (distancia > 25)
    {
        Vagar();
    }

    else if (distancia > 2.5)
    {
        movimentoInimigo.Movimentar(direcao, statusInimigo.Velocidade);

        animacaoInimigo.Atacar(false);
    }
    else
    {
        animacaoInimigo.Atacar(true);
    }
}

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

    bool ficouPertoOSuficiente = Vector3.Distance(transform.position, posicaoAleatoria) <= 0.05;
    if (ficouPertoOSuficiente == false)
    {
        direcao = posicaoAleatoria - transform.position;
        movimentoInimigo.Movimentar(direcao, statusInimigo.Velocidade);
    }
}

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

    return posicao;
}

void AtacaJogador ()
{
    int dano = Random.Range(20, 30);
    Jogador.GetComponent<ControlaJogador>().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);
    ControlaAudio.instancia.PlayOneShot(SomDeMorte);
    VerificarGeracaoKitMedico(porcentagemGerarKitMedico);
    scriptControlaInterface.AtualizarQuantidadeZumbisMortos();
}

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

}

Oi, Juliano, parece um erro de variáveis confere algumas coisas:

  • Somente o zumbi tem a tag inimigo
  • a variável scriptControlaInterface está sendo preenchida
  • A variável de texto no ControlaInterface está preenchida

Bons estudos!

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