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

Rotação do Chefe de fase enquanto ataca

Boa Noite

Estou com problemas na Rotação do chefe, em alguns momentos ele não rotaciona enquanto executa a ação de ataque e a rotação dele está "quebrando" nas vezes que ele rotaciona.

Já deixei marcado o " is Kinematic" para ele.

Segue codigo:

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

public class ControlaChefe : MonoBehaviour, IMatavel
{

    private Transform Jogador;
    private NavMeshAgent agente;
    private Status statusChefe;
    private AnimacaoPersonagem animacaoChefe;
    private MovimentoPersonagem movimentoChefe;
    public GameObject kitmedicoPrefab;

    private void Start()
    {
        Jogador = GameObject.FindWithTag("Jogador").transform;
        agente = GetComponent<NavMeshAgent>();
        statusChefe = GetComponent<Status>();
        agente.speed = statusChefe.Velocidade;
        animacaoChefe = GetComponent<AnimacaoPersonagem>();
        movimentoChefe = GetComponent<MovimentoPersonagem>();

    }

    private void Update()
    {
        agente.SetDestination(Jogador.position);
        animacaoChefe.Movimentar(agente.velocity.magnitude);

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

            if (estoupertodoJogador == true)
            {
                animacaoChefe.Atacar(true);
                Vector3 direcao = Jogador.position - transform.position;
                movimentoChefe.Rotacionar(direcao);
            }
            else
            {
                animacaoChefe.Atacar(false);
            }
        }

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

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

    public void Morrer()
    {
        animacaoChefe.morrer();
        movimentoChefe.Morrer();
        this.enabled = false;
        agente.enabled = false;
        Destroy(gameObject, 2);
        Instantiate(kitmedicoPrefab, transform.position, Quaternion.identity);
    }
}

4 respostas

Francisco, tudo bem?

Será que é algo com as distancias?

Talvez a distancia que faça ele atacar esteja baixa de mais o que faz com que ele só realize essa ação de vez em quando.

Quer dar uma olhada e ver se isso resolve o problema?

Senão manda pra gente o projeto em .zip. Pode subir num Google Drive, Dropbox ou qualquer outro local desde que tenha permissão externa e colar o link aqui.

Boa Noite Henrique!

Não sei se é isso que me pediu, mas pelo que entendi do código a distancia que faz o chefe atacar e baseada no valor da "Stopping Distance" então eu aumentei o valor e fiz alguns teste e não teve muita diferença, as vezes ele rotaciona um pouco durante o ataque mas após um tempo ele para com a rotação.

Aqui tem o link do projeto

https://drive.google.com/open?id=1OciLUGJ0KCu1_cX74NpTuMWWUiAla0EZ

Agradeço pelo atenção

solução!

Realmente, testei seu projeto e a rotação não parece estar muito suave.

Acredito que seja o NavMeshAgent entrando no meio da rotação. Acho que podemos fazer uma alteração para ele não rotacionar tão brusco usando o Lerp ou Slerp, algo assim:

if (estoupertodoJogador == true)
{
    animacaoChefe.Atacar(true);
    Vector3 direcao = Jogador.position - transform.position;
    Quaternion novaRotacao = Quaternion.LookRotation(direcao.normalized);
    transform.rotation = Quaternion.Slerp(transform.rotation, novaRotacao, Time.deltaTime * 10);
} 

Boa Noite!

Apliquei esse trecho no código e funcionou muito bem! Muito obrigado!

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