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

Diversos erros após criar o menu

Olá Professor, conforme acompanhado na aula, estava criando uma tela de menu personalizada no proprio "menu" criei novas ações para o "Jogador" e salvei, não apliquei para todos para nao impactar no "Jogador" do "game", porém quando fui fazer o mesmo o Zumbi, nao sei se houve alguma falta de atenção minha, mas removi TAMBEM todos os animator's do zumbi do "game" após isso resolvi usar o prefab de Zumbi disponibilizado nas aulas, mas perdi todas as referencias... ja referenciei tudo que eu lembrava, mas estou tomando alguns erros que nao sei o que faço, fora alguns bugs.... poderia me ajudar?

os erros são:Insira aqui a descrição dessa imagem para ajudar na acessibilidade

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

Gerador:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeCódigo ControlaInimigo: Removi as variaveis pois não estava cabendo tudo nesse post

public class ControlaInimigo : MonoBehaviour, IMatavel
{
    // Start is called before the first frame update
    void Start()
    {
        Jogador = GameObject.FindWithTag("Jogador");
        animacaoInimigo = GetComponent<AnimacaoPersonagem>();
        movimentaInimigo = GetComponent<MovimentoPersonagem>();
        AleatorizarZumbi();
        statusInimigo = GetComponent<Status>();
        scriptControlaInterface = GameObject.FindObjectOfType(typeof(ControlaInterface)) as ControlaInterface;
    }

    void FixedUpdate()
    {     
        float distancia = Vector3.Distance(transform.position, Jogador.transform.position);

        movimentaInimigo.Rotacionar(direcao);
        animacaoInimigo.Movimentar(direcao.magnitude);

        if (distancia > 15)
        {
            Vagar();
        }
        else if (distancia > 2.5)
        {
            Perseguir();
        }
        else
        {
            direcao = Jogador.transform.position - transform.position;
            animacaoInimigo.Atacar(true);
        }
    }

    void Perseguir()
    {
        direcao = Jogador.transform.position - transform.position;
        movimentaInimigo.Movimentar(direcao, statusInimigo.Velocidade);
        animacaoInimigo.Atacar(false);
    }

    void Vagar()
    {
        contadorVagar -= Time.deltaTime;
        if (contadorVagar <= 0)
        {
            posicaoAleatoria = AleatorizarPosicao();
            contadorVagar += tempoEntrePosicoesAleatorias + Random.Range(-1f, 1f);
        }

        bool ficouPertoOSuficiente = Vector3.Distance(transform.position, posicaoAleatoria) <= 0.05;
        if (!ficouPertoOSuficiente)
        {
            direcao = posicaoAleatoria - transform.position;
            movimentaInimigo.Movimentar(direcao, statusInimigo.Velocidade);
        }
    }

    Vector3 AleatorizarPosicao()
    {
        Vector3 posicao = Random.insideUnitSphere * 10;
        posicao += transform.position;
        posicao.y = transform.position.y;

        return posicao;
    }

    private void AtacaJogador()
    {
        int dano = Random.Range(20, 30);
        Jogador.GetComponent<ControlaJogador>().TomarDano(dano);
    }

    private void AleatorizarZumbi()
    {
        int geraTipoZumbi = Random.Range(1, transform.childCount);
        transform.GetChild(geraTipoZumbi).gameObject.SetActive(true);
    }

    public void TomarDano(int dano)
    {
        statusInimigo.Vida -= dano;
        if (statusInimigo.Vida <= 0)
        {
            Morrer();
        }
    }

    public void Morrer()
    {
        animacaoInimigo.Morrer();
        movimentaInimigo.Morrer(gameObject);
        this.enabled = false;
        ControlaAudio.instancia.PlayOneShot(SomDeMorte);
        VerificarGeracaoKitMedico(porcentagemGerarKitMedico);
        scriptControlaInterface.AtualizarQuantidadeDeZumbisMortos();
        meuGerador.DiminuirQuantidadeDeZumbisVivos();
    }

    void VerificarGeracaoKitMedico(float porcentagemGeracao)
    {
        if (Random.value <= porcentagemGeracao)
        {
            Instantiate(KitMedicoPrefab, transform.position, Quaternion.identity);
        }
    }
}

e o bug basicamente quando mato algum zumbi ele sai deslizando morto (Não todos, mas alguns sim)... eu nao fiz eles entrarem de baixo da terra pois achei "melhor" fazer com que eles caissem mortos e simplesmente sumissem após alguns segundos, e desativei o RiggiBody pra eles nao tomarem dano enquanto mortos no chao

13 respostas

Oi, Gabriel, o ideal seria você ir objeto a objeto e selecionar ele de novo pra garantir que ele funciona bonitinho e depois aplicar o prefab, isso deve resolver.

Professor, ajudou sim, pelo menos na maioria dos problemas... agora o kit medico está sendo dropado e está sendo destruido tambem... mas ainda há um erro que não estou sabendo corrigir :/

Ele nao acontece sempre, mato alguns zumbis, e sem nenhum padrão esse erro ocorre...

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

outro ponto é que após eu matar todos os zumbis da tela, eles não nascem mais, somente o chefe... e ainda sim após eu matar os zumbis um ou outro sai deslizando pela tela kkkk... acho que todos esses problemas podem estar relacionados com alguma coisa que posso estar deixando passar Meu objeto GeradorZumbi possui o objeto Zumbi e o Script GeradorZumbis... ja removi e adicionei dnv e apliquei

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

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

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

Qual a linha 117 do script com o erro e como está o script do gerador?

SCRIPT ControlaInimigo... Linha 117 em negrito com conteudo meuGerador.DiminuirQuantidadeDeZumbisVivos();

public void Morrer()
{
    animacaoInimigo.Morrer();
    movimentaInimigo.Morrer(gameObject);
    this.enabled = false;
    ControlaAudio.instancia.PlayOneShot(SomDeMorte);
    VerificarGeracaoKitMedico(porcentagemGerarKitMedico);
    scriptControlaInterface.AtualizarQuantidadeDeZumbisMortos();
    meuGerador.DiminuirQuantidadeDeZumbisVivos();
}

Script Gerador:

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

public class GeradorZumbis : MonoBehaviour
{
    public GameObject Zumbi;
    private float contadorTempo = 0;
    public float TempoGerarZumbi = 1;
    public LayerMask LayerZumbi;
    private float distanciaDeGeracao = 3;
    private float DistanciaDoJogadorParaGeracao = 20;
    private GameObject jogador;
    private int quantidadeMaximaDeZumbisVivos = 10;
    private int quantidadeDeZumbisVivos;
    private float tempoProximoAumentoDeDificuldade = 3;
    public float contadorDeAumentarDificuldade;

    // Update is called once per frame
    private void Start()
    {
        jogador = GameObject.FindWithTag("Jogador");
        contadorDeAumentarDificuldade = tempoProximoAumentoDeDificuldade;
        for (int i = 0; i < quantidadeMaximaDeZumbisVivos; i++)
        {
            StartCoroutine(GerarNovoZumbi());
        }
    }

    void Update()
    {
        bool possoGerarZumbisPelaDistancia = Vector3.Distance(transform.position, jogador.transform.position) > DistanciaDoJogadorParaGeracao;

        if (possoGerarZumbisPelaDistancia && quantidadeDeZumbisVivos < quantidadeMaximaDeZumbisVivos)
        {
            contadorTempo += Time.deltaTime;
            if (contadorTempo >= TempoGerarZumbi)
            {
                StartCoroutine(GerarNovoZumbi());
                contadorTempo = 0;
            }
        }

        if (Time.timeSinceLevelLoad > contadorDeAumentarDificuldade)
        {
            quantidadeDeZumbisVivos++;
            contadorDeAumentarDificuldade = Time.timeSinceLevelLoad + tempoProximoAumentoDeDificuldade;
        }
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireSphere(transform.position, distanciaDeGeracao);
    }

    IEnumerator GerarNovoZumbi()
    {
        Vector3 posicaoDeCriacao = AleatorizarPosicao();
        Collider[] colisores = Physics.OverlapSphere(posicaoDeCriacao, 1, LayerZumbi);

        while (colisores.Length > 0)
        {
            posicaoDeCriacao = AleatorizarPosicao();
            Physics.OverlapSphere(posicaoDeCriacao, 1, LayerZumbi);
            yield return null;
        }

        ControlaInimigo zumbi = Instantiate(Zumbi, posicaoDeCriacao, transform.rotation).GetComponent<ControlaInimigo>();
        zumbi.meuGerador = this;
        quantidadeDeZumbisVivos++;
    }

    Vector3 AleatorizarPosicao()
    {
        Vector3 posicao = Random.insideUnitSphere * 3;
        posicao += transform.position;
        posicao.y = 0;

        return posicao;
    }

    public void DiminuirQuantidadeDeZumbisVivos()
    {
        quantidadeDeZumbisVivos--;
    }
}

Tudo indica que a variável meuGerador não está sendo preenchida e por isso não funciona, quer colocar o começo do ControlaInimigo? Ou você pode tirar todos os geradores (inativa-los) deixar só 1, deixar os zumbis com essa variável public e o número de zumbis pequenos e ir testando o porque não tá funcionando.

Analisei dessa forma mas ainda não consegui identificar...

o fonte do ControlaInimigo está dessa forma

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

public class ControlaInimigo : MonoBehaviour, IMatavel
{
    public GameObject Jogador;
    private MovimentoPersonagem movimentaInimigo;
    private AnimacaoPersonagem animacaoInimigo;
    private Status statusInimigo;
    public AudioClip SomDeMorte;
    private Vector3 posicaoAleatoria;
    private Vector3 direcao;
    private float contadorVagar;
    private float tempoEntrePosicoesAleatorias = 4;
    private float porcentagemGerarKitMedico = 0.1f;
    public GameObject KitMedicoPrefab;
    private ControlaInterface scriptControlaInterface;
    [HideInInspector]
    public GeradorZumbis meuGerador;

    // Start is called before the first frame update
    void Start()
    {
        Jogador = GameObject.FindWithTag("Jogador");
        animacaoInimigo = GetComponent<AnimacaoPersonagem>();
        movimentaInimigo = GetComponent<MovimentoPersonagem>();
        AleatorizarZumbi();
        statusInimigo = GetComponent<Status>();
        scriptControlaInterface = GameObject.FindObjectOfType(typeof(ControlaInterface)) as ControlaInterface;
    }

    void FixedUpdate()
    {     
        float distancia = Vector3.Distance(transform.position, Jogador.transform.position);

        movimentaInimigo.Rotacionar(direcao);
        animacaoInimigo.Movimentar(direcao.magnitude);

        if (distancia > 15)
        {
            Vagar();
        }
        else if (distancia > 2.5)
        {
            Perseguir();
        }
        else
        {
            direcao = Jogador.transform.position - transform.position;
            animacaoInimigo.Atacar(true);
        }
    }

    void Perseguir()
    {
        direcao = Jogador.transform.position - transform.position;
        movimentaInimigo.Movimentar(direcao, statusInimigo.Velocidade);
        animacaoInimigo.Atacar(false);
    }

    void Vagar()
    {
        contadorVagar -= Time.deltaTime;
        if (contadorVagar <= 0)
        {
            posicaoAleatoria = AleatorizarPosicao();
            contadorVagar += tempoEntrePosicoesAleatorias + Random.Range(-1f, 1f);
        }

        bool ficouPertoOSuficiente = Vector3.Distance(transform.position, posicaoAleatoria) <= 0.05;
        if (!ficouPertoOSuficiente)
        {
            direcao = posicaoAleatoria - transform.position;
            movimentaInimigo.Movimentar(direcao, statusInimigo.Velocidade);
        }
    }

    Vector3 AleatorizarPosicao()
    {
        Vector3 posicao = Random.insideUnitSphere * 10;
        posicao += transform.position;
        posicao.y = transform.position.y;

        return posicao;
    }

    private void AtacaJogador()
    {
        int dano = Random.Range(20, 30);
        Jogador.GetComponent<ControlaJogador>().TomarDano(dano);
    }

    private void AleatorizarZumbi()
    {
        int geraTipoZumbi = Random.Range(1, transform.childCount);
        transform.GetChild(geraTipoZumbi).gameObject.SetActive(true);
    }

    public void TomarDano(int dano)
    {
        statusInimigo.Vida -= dano;
        if (statusInimigo.Vida <= 0)
        {
            Morrer();
        }
    }

    public void Morrer()
    {
        animacaoInimigo.Morrer();
        movimentaInimigo.Morrer(gameObject);
        this.enabled = false;
        ControlaAudio.instancia.PlayOneShot(SomDeMorte);
        VerificarGeracaoKitMedico(porcentagemGerarKitMedico);
        scriptControlaInterface.AtualizarQuantidadeDeZumbisMortos();
        meuGerador.DiminuirQuantidadeDeZumbisVivos();
    }

    void VerificarGeracaoKitMedico(float porcentagemGeracao)
    {
        if (Random.value <= porcentagemGeracao)
        {
            Instantiate(KitMedicoPrefab, transform.position, Quaternion.identity);
        }
    }
}

Faz o zip do seu projeto, coloca num Google Drive ou algo assim e manda o link aqui que dou uma olhada.

Só lembra de deixar o compartilhamento publico.

Claro professor, maus ai o vacilo... vou prestar mais atenção e nao fazer caca dnv, e muito obrigado pelo ensinamento até aqui, estou curtindo muito o curso!!

https://drive.google.com/file/d/1mXHRiRWFQLDv3Fb-5phuI8NPl5_M72Qk/view?usp=sharing

Oi, Gabriel, tinha um zumbi solto na cena, esse zumbi tem que ser deletado porque ele não tem gerador então deve resolver ao problema

if (Time.timeSinceLevelLoad > contadorDeAumentarDificuldade)
        {
            quantidadeDeZumbisVivos++;  <<<<<< aqui
            contadorDeAumentarDificuldade = Time.timeSinceLevelLoad + tempoProximoAumentoDeDificuldade;
        }

Quanto a quantidade de zumbis parar é porque na linha marcada está aumentando a quantidade de zumbis que estão vivos e não a máxima de zumbis o que aumentaria o dificuldade, então pro gerador tem muitos zumbis vivos mesmo não tendo.

Professor, perfeito, muito obrigado pela força, ficou somente uma unica duvida... nao sei se é bug, mas está relacionados com um dos apontamentos aqui de cima... os zumbis ficam vagando e quando me veem baseado em uma distancia, vem até mim, porém em alguns 'raros' casos, eles literealmente CORREM, andam mega rapido, e isso faz com que quando eu mato ele, eles saem deslizando... tem algum sentido isso? se fosse codificação, nao seriam todos a dar esse problema?

Professor, consegui fazer com que parem de sair deslizando apenas setando na classe MovimentoPersonagem > Metodo Morrer com meuRigibody.velocity = Vector3.Zero ... porem ainda nao entendo como alguns correm do nada kkkk

fiz um video de 15 segundos para mostrar, no segundo 10, quando eu subo no cenario há dois zumbis com roupa roxa que se aproximam muito rapidamente quando eu chego próximo, o que nao acontece com outros, como por exemplo, há um zumbi operário com chapéu de obra amarelo, que fica pra trás e tanto ele como o roxo estavam na mesma distancia

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

https://youtu.be/a-eMvU3rwtY

solução!

Deve ser o rigidbody de um empurrando o outro dá uma olhada nesse tópico que mexendo no drag e massa deve resolver o problema.

ps.: a trilha do John Murphy ficou top hahahaha

kkkkk tambem achei que combinou legal... Tudo certo professor, as soluções do tópico funcionaram, muito obrigado pela ajuda!!