17
respostas

eu do play o jogo pausa e o jogador fica com a metade do corpo embaixo da terra.

fala que o erro ta no animacaoJogador.Movimentar(direcao.magnitude); NullReferenceException: Object reference not set to an instance of an object ControlaInterface.Start () (at Assets/Scripts/ControlaInterface.cs:16)

using UnityEngine.SceneManagement;

public class ControlaJogador : MonoBehaviour, IMatavel {

private Vector3 direcao;
public LayerMask MascaraChao;
public GameObject TextoGameOver;
public ControlaInterface scriptControlaInterface;
public AudioClip SomDeDano;
private MovimentoJogador meuMovimentoJogador;
private AnimacaoPersonagem animacaoJogador;
public Status statusJogador;

private void Start()
{
    Time.timeScale = 1;
    meuMovimentoJogador = GetComponent<MovimentoJogador>();
    animacaoJogador = GetComponent<AnimacaoPersonagem>();
    statusJogador = GetComponent<Status>();
}

// Update is called once per frame
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");
        }
    }
}

void FixedUpdate()
{
    meuMovimentoJogador.Movimentar(direcao, statusJogador.Velocidade);

    meuMovimentoJogador.RotacaoJogador(MascaraChao);
}

public void TomarDano (int dano)
{
    statusJogador.Vida -= dano;
    scriptControlaInterface.AtualizarSliderVidaJogador();
    ControlaAudio.instancia.PlayOneShot(SomDeDano);
    if(statusJogador.Vida <= 0)
    {
        Morrer();
    }        
}

public void Morrer ()
{
    Time.timeScale = 0;
    TextoGameOver.SetActive(true);
}

}

17 respostas

Oi, Luan, pelo erro que você mandou parece ter um problema com o ControlaInterface.

Pode colar todos os erros do Console aqui e os scripts que são referenciados lá?

esse e o primeiro erro fala que o erro ta no SliderVidaJogador.maxValue = scriptControlaJogador.statusJogador.Vida; . NullReferenceException: Object reference not set to an instance of an object ControlaInterface.Start () (at Assets/Scripts/ControlaInterface.cs:15)

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();
}    

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

}

esse e o segundo erro fala que o erro ta no meuMovimentoJogador.Movimentar(direcao, statusJogador.Velocidade); . NullReferenceException: Object reference not set to an instance of an object ControlaJogador.FixedUpdate () (at Assets/Scripts/ControlaJogador.cs:48)

private Vector3 direcao;
public LayerMask MascaraChao;
public GameObject TextoGameOver;
public ControlaInterface scriptControlaInterface;
public AudioClip SomDeDano;
private MovimentoJogador meuMovimentoJogador;
private AnimacaoPersonagem animacaoJogador;
public Status statusJogador;

private void Start()
{
    Time.timeScale = 1;
    meuMovimentoJogador = GetComponent<MovimentoJogador>();
    animacaoJogador = GetComponent<AnimacaoPersonagem>();
    statusJogador = GetComponent<Status>();
}

// Update is called once per frame
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");
        }
    }
}

void FixedUpdate()
{
    meuMovimentoJogador.Movimentar(direcao, statusJogador.Velocidade);

    meuMovimentoJogador.RotacaoJogador(MascaraChao);
}

public void TomarDano (int dano)
{
    statusJogador.Vida -= dano;
    scriptControlaInterface.AtualizarSliderVidaJogador();
    ControlaAudio.instancia.PlayOneShot(SomDeDano);
    if(statusJogador.Vida <= 0)
    {
        Morrer();
    }        
}

public void Morrer ()
{
    Time.timeScale = 0;
    TextoGameOver.SetActive(true);
}

}

Erros de NullReference no geral são porque um método foi chamado num valor nulo.

Confere se seu jogador tem o script MovimentoJogador e a tag Jogador.

Se tiver tudo certo e as duas coisas existirem temos que dar uma investigada mais a fundo. Aí você pode mandar a pasta do projeto toda em .zip num Dropbox, GoogleDrive, etc e damos uma olhada por aqui. Blz? :)

o link da pasta arrumei ve se da pra fazer o dowload. https://drive.google.com/file/d/1nblPYl_vz7bwYmgTkHjWbDYRAIkgDmXi/view?usp=sharing

Oi, Luan, deixa o acesso público pra gente poder baixar.

Mais uma dica, compactar uma pasta grande no Google Drive as vezes demora muito e da erro. Então idealmente é usar um .zip.

arrumei o link.

Oi, Luan, acho que esse erro que você está recebendo tem a ver com a ordem da execução dos scripts. Tocamos nesse assunto na parte 3 se não estou enganado.

Para resolver o problema alguns passos:

  • Trocar o Start do ControlaJogador para Awake

No código ControlaInterface troquei essas duas linhas:

SliderVidaJogador.maxValue = scriptControlaJogador.statusJogador.Vida;
AtualizarSliderVidaJogador();

por:

SliderVidaJogador.maxValue = scriptControlaJogador.statusJogador.VidaInicial;
SliderVidaJogador.value = scriptControlaJogador.statusJogador.VidaInicial;

Isso garante que o script rode numa ordem mais concreta. Assim no script do jogador roda primeiro e tem o tempo de fazer o que tem que fazer.

Porque o que estava acontecendo aqui é:

  • Se o ControlaInterface rodasse primeiro ele quebrava porque o ControlaJogador ainda não preencheu a variável status.
  • Se o script ControlaJogador rodasse primeiro dava tudo certo mas talvez o Status ainda não tenha rodado então falhava a execução da linha de passar a VidaInicial para Vida então a Slider ficava com valor zerado.

Enfim... A ordem estava influenciando muito em como o jogo se comporta e tirar isso é uma necessidade no momento por isso essa correção é importante.

continuo a mesma coisa mesmo eu fazendo tudo que vc falo. using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;

public class ControlaJogador : MonoBehaviour, IMatavel {

private Vector3 direcao;
public LayerMask MascaraChao;
public GameObject TextoGameOver;
public ControlaInterface scriptControlaInterface;
public AudioClip SomDeDano;
private MovimentoJogador meuMovimentoJogador;
private AnimacaoPersonagem animacaoJogador;
public Status statusJogador;

private void Awake()
{
    Time.timeScale = 1;
    meuMovimentoJogador = GetComponent<MovimentoJogador>();
    animacaoJogador = GetComponent<AnimacaoPersonagem>();
    statusJogador = GetComponent<Status>();
}

// Update is called once per frame
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");
        }
    }
}

void FixedUpdate()
{
    meuMovimentoJogador.Movimentar(direcao, statusJogador.Velocidade);

    meuMovimentoJogador.RotacaoJogador(MascaraChao);SO QUE AGORA O ERRO TA AQUI.
}

public void TomarDano (int dano)
{
    statusJogador.Vida -= dano;
    scriptControlaInterface.AtualizarSliderVidaJogador();
    ControlaAudio.instancia.PlayOneShot(SomDeDano);
    if(statusJogador.Vida <= 0)
    {
        Morrer();
    }        
}

e o erro do ControlaInterface ta no mesmo lugar.

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.VidaInicial;<==CONTINUA AQUI O ERRO

SliderVidaJogador.value = scriptControlaJogador.statusJogador.VidaInicial; }

Qual erro aparece no console? Mesmo erro?

E quando ele acontece?

sim acontece o mesmo erro,assim que da play o jogo pausa o meu personagen vai pra baixo da terra e fala que o erro ta no canvas e no jogador.

Tenta ir até Edit > Project Settings > Script Execution Order

E adicionar no + a seguinte ordem: Status primeiro, ControlaJogador segundo, ControlaInterface terceiro.

Então aplica as modificações e roda o jogo para ver o que acontece.

acontece a mesma coisa

Quer mandar o projeto novamente novamente? Pode apagar as pastar Library, Packages e Log pra enviar porque fica menor e elas são geradas automaticamente.

Você também pode testar apagá-las por ai para "zerar" o cache.

Achei estranho porque esse projeto que você mandou parece não ter as modificações no script e nos settings. É uma versão mais velha?

acho que devo ter te passado o link errado. https://drive.google.com/file/d/1AWaL7gQMvVGMBVSeF-7Jy8nmIdaEIc8g/view?usp=sharing

Oi, Luan, os erros desse projeto que você mandou mudaram pro outro eu fui erro a erro dando uma olhada mas faltou alguns scripts. Mas pelo menos aqui deu um monte de problemas, vou dar uma repassada.

No Jogador não tinha o script de Status, MovimentoJogador e AnimacaoPersonagem então coloquei.

Aí os erros trocaram pro Zumbi que também não tinha vários scripts.

Sobre o personagem baixar aqui o Animator estava configurado mas as animações não existiam então ele não fazia nada, foi só colocar as animações que deu certo.

Lembra de aplicar todos os prefabs quando fazer alterações. Todos os erros vão te dar a linha de onde eles acontecem quando der erro de NullReferenceException é porque naquela linha tem algo nulo então tem que conferir com paciência o objeto pra ver o que faltou daquela linha.