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

Após a vida do jogador chegar a zero o jogo trava por um erro

Após fazer a refatoração dos códigos, e até mesmo copiar e colar o código para saber onde o erro se encontrava, nada foi resolvido. O erro ocorre toda vez que clico com o botão do mouse para reiniciar o jogo e o seguinte erro aparece:

NullReferenceException: Object reference not set to an instance of an object ControlaInterface.Start () (at Assets/Scripts/ControlaInterface.cs:16)

Eu já olhei em diversos locais do código, porém não encontro nada. O código em questão para reiniciar o jogo é esse logo abaixo.

void Update()
    {

        float eixoX = Input.GetAxis("Horizontal");
        float eixoZ = Input.GetAxis("Vertical");

        direcao = new Vector3(eixoX, 0, eixoZ);

        animacaoJogador.Movimentar(direcao.magnitude);

        if(statusJogador.Vida <= 0)
        {
            if(Input.GetButtonDown("Fire1"))
            {
                SceneManager.LoadScene("game");
            }
        }
    }
6 respostas

O erro diz que você faz referência a um objeto que não é uma instância de um objeto, ou simplificando, que por algum motivo você perdeu a referência de algo que está tentando acessar... Seja por que o objeto foi destruído ou a referência foi alterada. Pra entender melhor o que aconteceu a gente precisa saber o que está codado na função Start do script ControlaInterface. Igual o erro sugere, é lá que está o problema!

Vou mandar o scrip ControlaInterface inteiro

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

public class ControlaInterface : MonoBehaviour {

    private ControlaJogador scriptControlaJogador;
    public Slider SliderVidaJogador;

    // Use this for initialization
    void Start () {
        scriptControlaJogador = GameObject.FindWithTag("Jogador")
                                .GetComponent<ControlaJogador>();

        SliderVidaJogador.maxValue = scriptControlaJogador.statusJogador.Vida;
        AtualizarSliderVidaJogador();
    }
    
    // Update is called once per frame
    void Update () {

    }

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

Como o erro aponta, na linha 16 que ocorre o erro, então ou perdeu a referência do SliderVidaJogador ou perdeu a referência do scriptControlaJogador. Olhando parece que o problema é perder a referência do scriptControlaJogador.

Pensa o seguinte, você está chamando lá o

SceneManager.LoadScene("game");

certo? Quando você carrega essa cena e chama a função Start do ControlaInterface ele tenta encontrar um objeto com a tag "Jogador"

scriptControlaJogador = GameObject.FindWithTag("Jogador")
                                .GetComponent<ControlaJogador>(); 

Se nesse momento não tiver nenhum objeto com a Tag "Jogador" em cena, essa variável vai ficar vazia e consequentemente vai causar esse erro no momento de chamar a próxima linha.

Pra verificar se é esse o problema você pode tentar deixar esse código assim

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

public class ControlaInterface : MonoBehaviour {

    private ControlaJogador scriptControlaJogador;
    public Slider SliderVidaJogador;

    // Use this for initialization
    void Start () {
        scriptControlaJogador = GameObject.FindWithTag("Jogador")
                                .GetComponent<ControlaJogador>();

        if(!scriptControlaJogador)
            return;
        
        SliderVidaJogador.maxValue = scriptControlaJogador.statusJogador.Vida;
        AtualizarSliderVidaJogador();
    }
    
    // Update is called once per frame
    void Update () {

    }

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

Se o erro não acontecer mais, provavelmente é esse o problema mas essa não é a solução, é só uma maneira de te fazer encontrar qual a origem do erro. Eu não assisti essas aulas então não sei exatamente como é o jogo que você está fazendo. Espero ter ajudado de alguma forma.

Agradeço pela ajuda, mas infelizmente o erro continua. Deve de fato ser a tag que não é ativada novamente ou algo do tipo.

solução!

Oi, Hugo, você já chegou no módulo 5 desse curso? Eu acho que resolvo esse problema na aula 5-2

Parece ser o problema que o Status tem que rodar antes do ControlaJogador.

Não, por causa de alguns acontecimentos como TCC e estágio, estou demorando mais do que o planejado. Mas obrigado, vou continuar seguindo as aulas até chegar o momento em que esse problema é corrigido.