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

[Bug] Inimigo não chega mais perto do personagem

Após fazer o código do de controlar a movimentação, os zumbis não chegam perto do personagem, como se o personagem estivesse em uma bolha e os zumbis não pudessem atravessá-la

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

Código da Movimentação

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

public class MovimentoPersonagem : MonoBehaviour
{
    private Rigidbody meuRigidbody;

    private 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);

        GetComponent<Rigidbody>().MoveRotation(novaRotacao);
    }
}

Código do Inimigo

public class ControlaZumbi : MonoBehaviour, IMatavel
{

    public GameObject Jogador;
    private MovimentoPersonagem MovimentaInimigo;
    private AnimPersonagem animacaoInimigo;
    private Status statusInimigo;
    public AudioClip SomMorte;
    private Vector3 posicaoAleatoria;
    private Vector3 direcao;
    float contadorVagar;
    public int RaioVagar = 10;

    // Start is called before the first frame update
    void Start()
    {
        Jogador = GameObject.FindWithTag("Jogador");
        MovimentaInimigo = GetComponent<MovimentoPersonagem>();
        animacaoInimigo = GetComponent<AnimPersonagem>();
        AleatorizarZumbi();
        statusInimigo = GetComponent<Status>();

    }

    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)
        {
            direcao = Jogador.transform.position - transform.position;

            MovimentaInimigo.Movimentar(direcao, statusInimigo.Velocidade);

            animacaoInimigo.Atacar(false);
        }
        else
        {
            animacaoInimigo.Atacar(true);
        }
    }

    void Vagar()
    {
        contadorVagar -= Time.deltaTime;
        if(contadorVagar <= 0)
        {
            posicaoAleatoria = AleatorizarPosicao();
            contadorVagar += statusInimigo.tempoEntrePosicoes;
        }

        bool Perto = Vector3.Distance(transform.position, posicaoAleatoria) <= 0.05;
        if(Perto == false)
        {
            direcao = posicaoAleatoria - transform.position;
            MovimentaInimigo.Movimentar(direcao, statusInimigo.Velocidade);
        }

    }

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

        return posicao;
    }

    void ataque()
    {
        int dano = Random.Range(statusInimigo.DanoMin, statusInimigo.DanoMax);
        Jogador.GetComponent<ControlaJogador>().TomarDano(dano);
    }

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

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

    public void Morrer()
    {
        Destroy(gameObject);
        ControlaAudio.instancia.PlayOneShot(SomMorte);
    }
}
5 respostas

Oi, Pedro, você sabe quando isso começou a acontecer? Lembra de ir testando com frequencia o jogo.

Já tentou diminuir essa distância?

else if (distancia > 2.5)

Ou ver se o jogador tá com a colisão muito grande ou algo assim.

Testei essas soluções e não adiantou, os inimigos ainda não conseguem chegar ao personagem. Eles ficam travados, se o personagem se move para perto deles, eles voltam a andar mas logo travam em uma posição novamente

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

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

solução!

Vamo mudar o código pra testar:

if(distancia > 15)
        {
            Vagar();
        }
        else
        {
            direcao = Jogador.transform.position - transform.position;

            MovimentaInimigo.Movimentar(direcao, statusInimigo.Velocidade);

            animacaoInimigo.Atacar(false);
        }

Dessa forma o inimigo sempre vai andar até a personagem, se ele não chegar a encostar nela é porque tem algo travando eles. Uma colisão maior do que deveria etc.

Se não tiver encontrando faz um .zip da pasta do projeto aqui que damos uma olhada.

Mudei e continua o mesmo bug, também testei as colisões, estão todas corretas, inclusive as do chão. Rodei o jogo e fui na opção de debug, percebi que é na parte de "direção", por algum motivo, quando o zumbi chega a uma certa distancia do gerador, ou do player, estou em duvida de qual dos dois agora; Apenas as casas muito depois da "," que alteram (30,21300; 30,21458; 30,21572; por exemplo)

Segue o Arquivo .zip via Mega

https://mega.nz/file/3qpn3aLY#-vKjNdKgke-VQvSsglH9hBTtLdt90EbrrSEPinLZGbk

Consegui resolver. Por algum motivo, a unity remodelou a colisão do prefab do inimigo, e tava entrando no chão

Valeu!!