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

Som de tiro ainda tocando mesmo depois do Game Over

Codigo da interface:

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

public class ControlaInterface : MonoBehaviour {

    private ControlaJogador scriptControlaJogador;
    public Slider SliderVidaJogador;
    public GameObject PainelDeGameOver;
    public Text TextoDeSobrevivencia;
    public Text TextoDeSobrevivenciaMaximo;
    public float TempoMaximoSalvo;

    void Start ()
    {
        scriptControlaJogador = GameObject.FindWithTag(Tags.Jogador).GetComponent<ControlaJogador>();
        SliderVidaJogador.maxValue = scriptControlaJogador.statusJogador.VidaInicial;
        AtualizarSliderVidaJogador();
        Time.timeScale = 1;
        TempoMaximoSalvo = PlayerPrefs.GetFloat("PontuacaoMaxima");
    }

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

    public void Gameover()
    {
        PainelDeGameOver.SetActive(true);
        Time.timeScale = 0;
        int minutos = (int)Time.timeSinceLevelLoad / 60;
        int segundos = (int)Time.timeSinceLevelLoad % 60;
        TextoDeSobrevivencia.text = "You survived for " + minutos + "min and " + segundos + "s";
        AjustarPontuacaoMaxima(minutos, segundos);
    }

    public void Reiniciar()
    {
        SceneManager.LoadScene(Tags.Game);
    }

    void AjustarPontuacaoMaxima(int min, int s)
    {
        if(Time.timeSinceLevelLoad > TempoMaximoSalvo)
        {
            TempoMaximoSalvo = Time.timeSinceLevelLoad;
            TextoDeSobrevivenciaMaximo.text = string.Format("Your best time is: {0}min and {1}s", min, s);
            PlayerPrefs.SetFloat("PontuacaoMaxima", TempoMaximoSalvo);
        }
        if(TextoDeSobrevivenciaMaximo.text == "")
        {
            min = (int)TempoMaximoSalvo / 60;
            s = (int)TempoMaximoSalvo % 60;
            TextoDeSobrevivenciaMaximo.text = string.Format("Your best time is: {0}min and {1}s", min, s);
        }

    }
}

Codigo do controle da arma:

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

public class ControlaArma : MonoBehaviour {

    public GameObject Bala;
    public GameObject CanoDaArma;
    public AudioClip SomDoTiro;

    void Update (){
        if (Input.GetButtonDown(Tags.Fire1)){
            Instantiate(Bala, CanoDaArma.transform.position, CanoDaArma.transform.rotation);
            ControlaAudio.instancia.PlayOneShot(SomDoTiro);
        }
    }
}

Solucionei temporariamente adicionando a condicao de conferencia do estado do timeScale. Mas gostaria de saber se eh algum erro em algum dos scripts.

void Update (){ if (Input.GetButtonDown(Tags.Fire1) && Time.timeScale != 0) { Instantiate(Bala, CanoDaArma.transform.position, CanoDaArma.transform.rotation); ControlaAudio.instancia.PlayOneShot(SomDoTiro); } }

7 respostas

Oi, Gabriel, tudo bem?

Você está falando daqueles comentários que aparecem no console de 0 rotation ou algum erro está acontecendo mesmo?

Porque parece estar tudo certo, o que aparece no console?

Bom tarde Henrique,

Na verdade não. Não há erros no console. Os comentários 0 rotation eu vi a solução que vc deu aqui no forum e ja implementei. Assim como o erro que vc mesmo corrigi na aula onde ensina priorizar a execução dos scripts.

O comportamento que estou me referindo é que mesmo após a morte do jogador, na tela de game over, os sons de tiro tocam ao efetuar um clique. Por isso anexei o código da classe que controla a arma onde tem o método que detecta o input do mouse.

Dei uma solução rápida adicionando uma condição no if que testa o input e adicionei um AND Time.timeScale != 0 Desta forma nas telas de game over onde o timeScale está setado com 0 não dispara o evento de instanciar bala e tocar som.

Porém sinto que esta não é a melhor solução e gostaria de uma opinião.

Você pode usar a vida do status do jogador mas essa opção que você fez não é ruim porque o jogo pode ter pause por exemplo e essa opção já mantem funcionando.

Ou você pode quando dar game over já disparar uma boolean pra não poder atirar.

Boa tarde, Gabriel

Eu também percebi isso e fiz o seguinte comando para resolver, no arquivo ControlaArma.cs, dentro do método Update:

  void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            if (ControlaJogador.Vida <= 0) 
            { 
                ControlaAudio.Instancia.Stop(); 
            }
            else 
            {
            Instantiate(Bala, CanoDaArma.transform.position, CanoDaArma.transform.rotation);
            ControlaAudio.Instancia.PlayOneShot(ShootSound);
            }
        }
}
solução!

Vitor, tudo bom? Você poderia simplificar seu código para algo como:

void Update()
{
    if (Input.GetButtonDown("Fire1") && ControlaJogador.Vida > 0) 
    {
        Instantiate(Bala, CanoDaArma.transform.position, CanoDaArma.transform.rotation);
        ControlaAudio.Instancia.PlayOneShot(ShootSound);
    }
}

Assim você só consegue atirar e rodar áudios se clicar e o jogador estiver Vivo.

Realmente ficou mais claro e fazendo a mesma coisa com menos código.

Obrigado!

Sim. No meu caso ainda prefiro setar a condição pelo tempo assim:

void Update()
{
    if (Input.GetButtonDown("Fire1") && Time.timeScale != 0 ) 
    {
        Instantiate(Bala, CanoDaArma.transform.position, CanoDaArma.transform.rotation);
        ControlaAudio.Instancia.PlayOneShot(ShootSound);
    }
}

Desta forma os sons de tiro apenas tocam se o jogo não estiver parado. Vai que no futuro eu queira implementar uma forma em que o jogador morra mesma com vida maior que zero(Cair num buraco, ser esmagado etc...).