1
resposta

[Bug] Os zumbis não olham para outras direções.

acho que não pode videos então tem aqui uma imagem, os zumbis se mexem normalmente mas ele sempre olham para essa mesma direçãoaqui o codigo do ControlaInimigo, se precisar de mais algum me avise: [using System.Collections; using System.Collections.Generic; using UnityEngine;

public class ControlaInimigo : MonoBehaviour, IMatavel {

public GameObject jogador;
private Rigidbody rigidbodyInimigo;
private MovimentoPersonagem movimentaInimigo;
private AnimacaoPersonagem animacaoInimigo;
private Status statusInimigo;
private Vector3 posicaoAleatoria;
private float posicaoAleatoriaTimer;
private float tempoEntrePosicaoAleatoria = 4;
private Vector3 direcao;
public AudioClip SomZumbiMorte;

// Start is called before the first frame update
void Start()
{
    jogador = GameObject.FindWithTag("Jogador");
    AleatorizarZumbi();
    rigidbodyInimigo = GetComponent<Rigidbody>();
    animacaoInimigo = GetComponent<AnimacaoPersonagem>();
    movimentaInimigo = GetComponent<MovimentoPersonagem>();
    statusInimigo = GetComponent<Status>();
}

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

    direcao = jogador.transform.position - transform.position;
    animacaoInimigo.Movimentar(direcao.magnitude);

    movimentaInimigo.Rotacionar(direcao);
    if (distancia > 15) 
    {
        Vagar();
    }
    else if (distancia > 2.5)
    {

        movimentaInimigo.Movimentar(direcao, statusInimigo.Velocidade);

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

void Vagar()
{
    posicaoAleatoriaTimer -= Time.deltaTime;
    if (posicaoAleatoriaTimer <= 0)
    {
        posicaoAleatoria = AleatorizarPosicao();
        posicaoAleatoriaTimer += tempoEntrePosicaoAleatoria;
    }

    bool posicaoFinal = Vector3.Distance(transform.position, posicaoAleatoria) <= 0.05;
    if (posicaoFinal == false)
    {
        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;
}

    void Ataca ()
{
    int dano = Random.Range(20, 30);
    jogador.GetComponent<ControlaJogador>().TomarDano(dano);
    
}
void AleatorizarZumbi ()
{
    int gerarTipoZumbi = Random.Range(1, 28);
    transform.GetChild(gerarTipoZumbi).gameObject.SetActive(true);
}

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

public void Morrer()
{
    Destroy(gameObject);
    ControlaAudio.instancia.PlayOneShot(SomZumbiMorte);
}

}]()

1 resposta

Olá, João!

Pelo que você descreveu, parece que os zumbis estão se movendo, mas não estão rotacionando para olhar na direção correta. Vamos verificar alguns pontos no seu script:

  1. Rotacionar o Zumbi: Certifique-se de que o método Rotacionar na classe MovimentoPersonagem está implementando a rotação corretamente. Ele deve estar usando algo como Quaternion.LookRotation para ajustar a direção do zumbi.

    public void Rotacionar(Vector3 direcao)
    {
        if (direcao != Vector3.zero)
        {
            Quaternion novaRotacao = Quaternion.LookRotation(direcao);
            rigidbodyInimigo.MoveRotation(novaRotacao);
        }
    }
    
  2. Verifique o Animator: No Unity, no componente Animator, certifique-se de que as transições entre os estados de animação estão configuradas corretamente e que não há condições que impeçam a rotação.

  3. Confirme a Direção: No método FixedUpdate, você está calculando a direção corretamente, mas pode ser útil verificar se a direção está sendo normalizada antes de passar para a rotação.

    direcao = (jogador.transform.position - transform.position).normalized;
    
  4. Debug: Adicione alguns logs para verificar se a direção está sendo calculada corretamente e se o método de rotação está sendo chamado.

    Debug.Log("Direção: " + direcao);
    

Verifique esses pontos e veja se algum deles resolve o problema. Espero ter ajudado e bons estudos!