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

Barra de vida parou de funcionar

oi, boa noite, eu passei umas horas construindo o cenário e de repente a barra de vida sumiu e comecei a tomar um erro de NullReferenceException. Dei uma olhada aqui sozinho mas não entendi porque ele perdeu a referência, no código parece tudo certo e no inspetor também...

Conseguem me ajudar, por favor?

Segue o link do projeto no Google Drive. https://drive.google.com/drive/folders/1hSvrNEgU5fwTfjLX00084fjRzS6c-Fak?usp=share_link

4 respostas

Oi, Ricardo, quando esse erro acontece? No inicio ou quando reinicia o jogo?

Qual o erro completo e pode colar o script aqui?

Se você clicar duas vezes no erro você consegue ver a variável que está nula e assim ver se ela está sendo preenchida corretamente no Inspector.

Oi, o erro acontece quando eu tomo um dano do Zumbi, aí aparecem os erros no console e o jogo pausa.Insira aqui a descrição dessa imagem para ajudar na acessibilidade

E realmente, quando eu clico no erro, ele aponta para um dos zumbis que foi gerado:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Por fim, o Script que ele aponta é o que controla o Jogador, segue abaixo:

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

public class PlayerController : MonoBehaviour
{
    public float velocidade = 10;
    private Vector3 direcao;
    public LayerMask mascaraChao;
    public GameObject textoGameOver;
    private Rigidbody rigidbodyPlayer;
    private Animator animatorPlayer;
    public int Vida = 100;
    public InterfaceController scriptInterfaceController;
    public AudioClip SomDeDano;

    private void Awake()
    {
        animatorPlayer = GetComponent<Animator>();
        rigidbodyPlayer = GetComponent<Rigidbody>();
        Time.timeScale = 1;
    }

    void Update()
    {
        float eixoX = Input.GetAxis("Horizontal");
        float eixoZ = Input.GetAxis("Vertical");
        direcao = new Vector3(eixoX, 0, eixoZ);

        if (direcao != Vector3.zero)
        {
            animatorPlayer.SetBool("Movendo", true);
        }
        else
        {
            animatorPlayer.SetBool("Movendo", false);
        }

        if (Vida <= 0)
        {
            if (Input.GetButtonDown("Fire1"))
            {
                SceneManager.LoadScene("motel");
            }
        }
    }

    //ao invés de rodar a cada frame, ele roda a cada 0,02s por padrão
    void FixedUpdate()
    {
        rigidbodyPlayer.MovePosition
            (rigidbodyPlayer.position +
            (direcao * velocidade * Time.deltaTime));

        Ray raio = Camera.main.ScreenPointToRay(Input.mousePosition);
        Debug.DrawRay(raio.origin, raio.direction * 100, Color.red);

        RaycastHit impacto;

        //quando eu uso um Raycasthit, eu preciso colocar esse out no parâmetro para avisar que vai entrar no if sem valor, mas lá dentro terá
        if (Physics.Raycast(raio, out impacto, 100, mascaraChao))
        {
            Vector3 posicaoMiraJogador = impacto.point - transform.position;

            posicaoMiraJogador.y = transform.position.y;

            Quaternion novaRotacao = Quaternion.LookRotation(posicaoMiraJogador);

            rigidbodyPlayer.MoveRotation(novaRotacao);
        }
    }

    public void TomarDano(int dano)
    {
        Vida -= dano;
        scriptInterfaceController.AtualizarSliderVidaJogador();
        AudioController.instancia.PlayOneShot(SomDeDano);

        if (Vida <= 0)
        {
            Time.timeScale = 0;
            textoGameOver.SetActive(true);
        }
    }
}
solução!

Esse erro aponta para a linha do scriptInterfaceController essa variável tá preenchida no Inspector?

Lembra de aplicar o prefab!

Era isso mesmo! Na verdade, eu nem percebi e tinha deletado o canvas da minha hierarquia, provavelmente na hora de montar o cenário. Aí foi voltar nas aulas e refazer, valeu pela ajuda!