4
respostas

[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);
}

}]()

4 respostas

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!

Olá, me desculpa por demorar para responder, fiquei um tempo sem fazer o curso, mas eu notei que o problema pode ser o fato que o animator não vai de 0.1 ao 0.5 como no video do curso, mas sim entre 70.0 a 80.0, sabe se é possivel mudar isso na unity?

Oi João, sem problemas, entendo que você tenha dado uma pausa nos estudos. :)

Sobre a questão do Animator, sim, é totalmente possível ajustar os valores que estão sendo usados para transitar entre os estados de animação.

Parece que o problema pode estar relacionado à configuração dos parâmetros de transição no seu Animator. Esses parâmetros controlam quando as animações mudam, e no seu caso, talvez os valores estejam fora do intervalo esperado (de 0.1 a 0.5) e estão variando entre 70.0 e 80.0, como você mencionou.

Aqui estão algumas sugestões para ajustar isso:

Ajustando os Parâmetros no Animator:

  1. Abra a janela do Animator no Unity (Janela > Animator).
  2. Selecione o controlador de animação do seu zumbi (o controlador onde as animações de movimentação e rotação estão configuradas).
  3. No painel de parâmetros à esquerda, verifique se o parâmetro que você está usando (por exemplo, "Speed" ou "Rotation") está correto. Se os valores estiverem entre 70 e 80, talvez seja necessário ajustar o valor que está sendo passado para esse parâmetro no seu código.

Modificando os Valores no Código:

Se você estiver controlando a rotação ou a velocidade com um parâmetro como "Speed", no seu código, você pode normalizar o valor entre 0.1 e 0.5, dependendo da lógica que você quer seguir. Exemplo:

// Supondo que você queira ajustar a rotação com o parâmetro 'Speed'
float valorAnimator = Mathf.Clamp(direcao.magnitude, 0.1f, 0.5f);
animacaoInimigo.Movimentar(valorAnimator);

Alterando o Range do Parâmetro:

Caso o parâmetro esteja com valores de 70 a 80, você pode alterar o range dele no próprio Animator:

  1. Selecione o parâmetro no Animator.
  2. Ajuste o tipo de valor ou range que ele usa (se estiver configurado para valores de 70 a 80, altere para um intervalo mais apropriado como 0 a 1 ou 0.1 a 0.5, dependendo da necessidade).

Verifique as Transições de Animação:

Certifique-se de que as transições entre os estados (por exemplo, de "Idle" para "Andando") estejam configuradas corretamente, com base no valor do parâmetro que você está usando. Isso pode impactar a rotação ou o movimento do zumbi.

Dá uma olhada nessas dicas e veja se algum desses pontos resolve o problema. Se precisar de mais alguma coisa, estamos por aqui! :)

Olá, eu gostaria de saber onde eu implemento este código, com alterações que acho necessarias para funcionar, pois estive tentando coloca-lo em um script chamado "animacaoPersonagem" mas não sei se esta certo, que é onde esta localizado o codigo para movimento no projeto, mas no lugares que tentei esteve dando erro, vou mandar o script para ver se ajuda.

public class AnimacaoPersonagem : MonoBehaviour
{
    private Animator meuAnimator;

    void Awake()
    {
        meuAnimator = GetComponent<Animator>();
    }

   public void Atacar (bool estado)
    {
       meuAnimator.SetBool("Atacando", estado);
    }

   public void Movimentar (float valorMovimento)
    {
        meuAnimator.SetFloat("movendo", valorMovimento);
    }

}