Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Zumbi continua travando ao chegar perto do Ponto Aleatorio

Fiz tudo conforme dito na Aula 04 para corrigir o erro dos zumbis ficarem travados quando chegavam no ponto aleatorio. Porem mesmo com o codigo igual ao da aula, o zumbi continua com o mesmo problema.

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

public class ControlaZumbi : MonoBehaviour, IMatavel
{
    [HideInInspector]
    public GameObject Jogador;
    [HideInInspector]
    public Status StatusZumbi;
    private MovimentarPersonagem movimentoPersonagem;
    private AnimacoesPersonagem animacaoPersonagem;
    public AudioClip SomDeMorte;
    private Vector3 direcao;
    private Vector3 posicaoAleatoria;
    private float contadorVagar;
    private float tempoEntrePosicoesAleatorias = 4;

    void Start() 
    {
        Jogador = GameObject.FindWithTag(Tags.Jogador);
        movimentoPersonagem = GetComponent<MovimentarPersonagem>();
        animacaoPersonagem = GetComponent<AnimacoesPersonagem>();
        StatusZumbi = GetComponent<Status>();
        GerarTipoZumbi();
    }

    void FixedUpdate()
    {

        //Movimenta o Zumbi em direção ao Jogador
        float distancia = Vector3.Distance(transform.position, Jogador.transform.position);
        if (distancia > 16)
        {
            Vagar();
        }
        else if (distancia > 3)
        {
            direcao = Jogador.transform.position - transform.position;
            movimentoPersonagem.Movimentar(direcao, StatusZumbi.Velocidade);
            animacaoPersonagem.Atacar(false);
        }
        else
        {
            animacaoPersonagem.Atacar(true);
        }

        //Rotaciona o Zumbi em direção ao Jogador
        movimentoPersonagem.Rotacionar(direcao);
    }

    void Vagar()
    {
        contadorVagar -= Time.deltaTime;

        if(contadorVagar <= 0)
        {
            posicaoAleatoria = AleatorizarPosicao();
            contadorVagar += tempoEntrePosicoesAleatorias;
        }
        bool ficouPertoOSuficiente = Vector3.Distance(transform.position, posicaoAleatoria) <= 0.05;

        if(ficouPertoOSuficiente == false)
        {
            direcao = posicaoAleatoria - transform.position;
            movimentoPersonagem.Movimentar(direcao, StatusZumbi.Velocidade);
        }
    }

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

        return posicao;
    }

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

    void GerarTipoZumbi()
    {
         int gerarTipoZumbi = Random.Range(1,28);
        transform.GetChild(gerarTipoZumbi).gameObject.SetActive(true);
    }

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

    public void Morrer()
    {
        Destroy(gameObject);
        ControlaAudio.instancia.PlayOneShot(SomDeMorte);
    }
}
1 resposta
solução!

Resolvido! O erro aconteceu por causa da movimentação do zumbi.

Antes eu estava usando a velocidade do RigidBody pra movimentar o objeto

meuRigidBody.velocity = direcao.normalized * velocidade;

O que fazia o objeto ficar sempre deslizando pra fora do alcance do ponto aleatorio, assim a variavel que mandava ele ficar parado ficava desligando e ligando. Pra corrigir eu simplesmente usei a posição do RigidBody.

meuRigidBody.MovePosition(meuRigidBody.position + (direcao.normalized * velocidade * Time.deltaTime));

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