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

[Dúvida] Após matar o zumbi se eu continuar atirando a bala interrompe a animação de morte e com isso o zumbi não cai.

Olá! Está acontecendo algo com meus zumbis (e consequentemente com o boss também). Quando eu mato o zumbi com um tiro só ele cai, entra no chão e é destruído, normal. Porém, caso eu dê mais de um tiro nele, o segundo tiro parece interromper a animação de morte e assim, caso eu continue atirando, posso segurar o zumbi "de pé" até ele ser destruído...

Seguem os códigos do ControladorZumbi:

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

public class ControladorZumbi : MonoBehaviour, IMatavel

{

    public GameObject jogador;
    private MovimentacaoPersonagem movimentoZumbi;
    private AnimacaoPersonagem animacaoZumbi;
    private Status statusZumbi;
    public AudioClip somMorteZumbi;
    private Vector3 posicaoAleatoria;
    private Vector3 direcao;
    private float contadorRoaming;
    private float tempoEntrePosicoesAleatorias = 4;
    private float porcentagemGerarKitMedico = 0.15f;
    public GameObject KitMedicoPrefab;
    private ControlaInterface scriptControlaInterface;
    [HideInInspector]
    public GeradorZumbis meuGeradorZumbis;

    void Start()
    {
        jogador = GameObject.FindWithTag("Player");
        animacaoZumbi = GetComponent<AnimacaoPersonagem>();
        movimentoZumbi = GetComponent<MovimentacaoPersonagem>();
        AleatorizarZumbi();
        statusZumbi = GetComponent<Status>();
        scriptControlaInterface = GameObject.FindObjectOfType(typeof(ControlaInterface)) as ControlaInterface;
    }

    void FixedUpdate()
    {
        float distancia = Vector3.Distance(transform.position, jogador.transform.position);
        movimentoZumbi.Rotacionar(direcao);
        animacaoZumbi.Movimentar(direcao.magnitude);

    if (distancia > 15)
    {
        Roaming();
    }
    else if (distancia > 2.5)
    {
        direcao = jogador.transform.position - transform.position;
        movimentoZumbi.Movimentar(direcao, statusZumbi.velocidade);
        animacaoZumbi.Atacar(false);
    }

     else
    {
        direcao = jogador.transform.position - transform.position;
        animacaoZumbi.Atacar(true);
    }
    }

    void Roaming()
    {
        contadorRoaming -= Time.deltaTime;

        if(contadorRoaming <=0)
        {
            posicaoAleatoria = aleatorizarPosicao();
            contadorRoaming += tempoEntrePosicoesAleatorias + Random.Range(-2f, 1f);
        }

        bool pertoSuficiente = Vector3.Distance(transform.position, posicaoAleatoria) <= 0.1;

        if(pertoSuficiente == false)
        {
            direcao = posicaoAleatoria - transform.position;
            movimentoZumbi.Movimentar(direcao, statusZumbi.velocidade);
        }

    }

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

        return posicao;
    }

    void atacaJogador()
    {
        int danoZumbi = Random.Range(20, 30);
        jogador.GetComponent<ControladorJogador>().TomarDano(danoZumbi); 

    }

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

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

    public void Morrer()
    {
        animacaoZumbi.Morrer();
        this.enabled = false;
        ControlaAudio.instancia.PlayOneShot(somMorteZumbi);
        VerificarGeracaoKitMedico(porcentagemGerarKitMedico);
        scriptControlaInterface.AtualizarQuantidadeDeZumbisMortos();
        meuGeradorZumbis.DiminuirQuantidadeDeZumbisVivos();
        Destroy(gameObject, 8);
        Invoke("DerrubarCorpo", 5);
    }

    void DerrubarCorpo()
    {
        movimentoZumbi.Morrer();
    }

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

ControladorBoss:

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

public class ControladorBoss : MonoBehaviour, IMatavel
{
    private Transform jogador;
    private NavMeshAgent agente;
    private Status meuStatusBoss;
    private AnimacaoPersonagem meuAnimacaoBoss;
    private MovimentacaoPersonagem meuMovimentoBoss;
    public GameObject KitMedicoPrefab;


    private void Start()
    {
        jogador = GameObject.FindWithTag("Player").transform;
        agente = GetComponent<NavMeshAgent>();
        meuStatusBoss = GetComponent<Status>();
        agente.speed = meuStatusBoss.velocidade;
        meuAnimacaoBoss = GetComponent<AnimacaoPersonagem>();
        meuMovimentoBoss = GetComponent<MovimentacaoPersonagem>();

    }

    private void Update()
    {
        agente.SetDestination(jogador.position);
        meuAnimacaoBoss.Movimentar(agente.velocity.magnitude);


        if(agente.hasPath == true)
            {
            bool estouPertoDoJogador = agente.remainingDistance <= agente.stoppingDistance;

            if(estouPertoDoJogador)
            {
                meuAnimacaoBoss.Atacar(true);
                Vector3 direcao = jogador.position - transform.position;
                meuMovimentoBoss.Rotacionar(direcao);
            }

            else
            {
                meuAnimacaoBoss.Atacar(false);
            }
        }

    }

    void atacaJogador()
    {
        int dano = Random.Range(30,40);
        jogador.GetComponent<ControladorJogador>().TomarDano(dano);
    }

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

    public void Morrer()
    {
        meuAnimacaoBoss.Morrer();
        this.enabled = false;
        agente.enabled = false;
        //ControlaAudio.instancia.PlayOneShot(somMorteZumbi);
        Instantiate(KitMedicoPrefab, transform.position, Quaternion.identity);
        Destroy(gameObject, 8);
        Invoke("DerrubarCorpo", 5);
    }

    void DerrubarCorpo()
    {
        meuMovimentoBoss.Morrer();
    }

}

E MovimentacaoPersonagem:

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

public class MovimentacaoPersonagem : MonoBehaviour
{
    private Rigidbody meuRigidbody;

    void Awake()
    {
        meuRigidbody = GetComponent<Rigidbody>();
    }


    public void Movimentar(Vector3 direcao, float velocidade)
    {
        meuRigidbody.MovePosition
        (meuRigidbody.position + direcao.normalized * velocidade * Time.deltaTime);
    }

    public void Rotacionar(Vector3 direcao)
    {
        Quaternion novaRotacao = Quaternion.LookRotation(direcao);
        meuRigidbody.MoveRotation(novaRotacao);
    }

    public void Morrer()
    {
        meuRigidbody.constraints = RigidbodyConstraints.None;
        meuRigidbody.velocity = Vector3.zero;
        meuRigidbody.isKinematic = false;
        GetComponent<Collider>().enabled = false; 
    }


}

Eu criei um invoke pois queria que o corpinho ficasse caído no mapa uns segundinhos antes de "vazar"para baixo do mapa para efeito dramático, não sei dizer se é isso que está causando problemas...

Obrigada!!

solução!

Olá, tudo bem?

Como está o código da classe AnimacaoPersonagem? A sua animação de Morrer no Animator tem alguma transição? Lembre-se de tirar qualquer transição dela.

Outra coisa que vi é que você está desativando a colisão no MovimentacaoPersonagem só quando invoca o método, o que demora 5 segundos, idealmente você desativaria a colisão logo de cara pra evitar computar qualquer coisa da bala a partir de agora.

Bons estudos!

Olá!! Deu certo! Tinha tentado na noite anterior e não tinha ido, mas agora foi, ahaha!

obrigada!!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software