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

Erro Slider

Boa noit professor!

Ao rodar o jogo, após criar a parte de atulização do Slider, apresentou esse erro:

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

O que poderia ser? Não encontrei nada de errado no código.

Obrigado

8 respostas

Oi, Ramon, tudo bem?

NullReference normalmente significa que a variável necessária não está preenchida. Como está sua linha 15?

A variável está preenchida no inspector?

Olá Herinque, tudo bem sim! Está dessa forma e eu não achei nada de diferente do que foi passado no video da aula. A barra funciona como deveria mas fica aparecendo esse erro.

No inspector ela está com valor de 100, quanto na variavel do script Controlado Jogador quanto no Slider.

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

public class ControlaInterface : MonoBehaviour
{
    private ControlaJogador scriptControlaJogador; //variavel que guarda o script ControlaJogador

    public Slider SliderVidaJogador;

    void Start()
    {
        scriptControlaJogador = GameObject.FindWithTag("Jogador").GetComponent<ControlaJogador>();
        SliderVidaJogador.maxValue = scriptControlaJogador.Vida; // LINHA 15
        AtualizarSliderVidaJogador();
    }

    void Update()
    {
    }

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

Você pode colocar o ControlaJogador também?

Claro! (não repare os comentários no código rsrs)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; // controle de cenas do jogo

public class ControlaJogador : MonoBehaviour
{
    public float Velocidade = 10;
    public LayerMask MascaraChao;
    public GameObject TextoGameOver;
    public int Vida = 100;
    public ControlaInterface ScriptControlaInterface;

    private Vector3 direcao;
    private Rigidbody rigidbodyJogador;
    private Animator animatorJogador;




    private void Start()
    {
        Time.timeScale = 1; // Para o jogo sair do pause
        rigidbodyJogador = GetComponent<Rigidbody>();
        animatorJogador = GetComponent<Animator>();

    }

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

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

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

        if (Vida <= 0) // Jogador está morto? se sim, entra no if
        {
            if (Input.GetButtonDown("Jump")) // Usuário apertou alguma tecla do mouse?
            {
                SceneManager.LoadScene("SampleScene"); // Chama função que reinicia a cena do jogo
            }
        }

    }

    void FixedUpdate()
    {
        rigidbodyJogador.MovePosition(rigidbodyJogador.position + (direcao * Velocidade * Time.deltaTime));

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

        RaycastHit impacto;

        if(Physics.Raycast(raio, out impacto, 100, MascaraChao))
        {
            Vector3 posicaoMiraJogador = impacto.point - transform.position;
            posicaoMiraJogador.y = transform.position.y; // ambos ficarem na mesma altura (mira e altura do jogador)

            Quaternion novaRotacao = Quaternion.LookRotation(posicaoMiraJogador);

            rigidbodyJogador.MoveRotation(novaRotacao);
        }
    }

    public void TomarDano (int dano) //metodo publico para controlar a quantidad de vida do personagem e será acessado por outros scripts
    {
        Vida -= dano; //tira 5 da vida do jogador a cada hit (dano)
        ScriptControlaInterface.AtualizarSliderVidaJogador();

        if(Vida <= 0) //Jogador está morto? se sim, entra no if
        {
            Time.timeScale = 0; //quando chamar esse método (zumba ataca jogador), ativara a função Time Scale que pausará o jogo. 1 jogo normal, 0 jogo parado, 2 jogo 2x mais rapido.
            TextoGameOver.SetActive(true); //acessa o jogador para puxar o texto e somente aparecer na tela quando o jogador sendo atacado
        }

    }


}

No script parece tudo certo, pode ser alguma configuração na Unity então.

Você consegue fazer um .zip da pasta do projeto toda e colocar num Google Drive, Dropbox ou algo assim? Lembra de deixar o compartilhamento publico e colocar o link aqui :)

solução!

Oi, Ramon, olhei aqui seu script e o funcionamento parecem perfeitos.

Mas na Slider tem duas copias do ControlaInterface sem necessidade, só a do canvas é suficiente. Pode apagar esses componentes da Slider.

Era isso! Resolvido! Obrigado Henrique!