Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Matemáticas para juegos: personaje

12/31
Recursos

Aportes 2

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Mi solución al reto.

El Objetivo es encontrar el ángulo que hay entre el enemigo y el jugador, pero necesitamos aplicar las razones trigonométricas así que lo primero que hacemos es formar un triángulo rectángulo usando las coordenadas del jugador y el enemigo de la sig. Manera:
Nota: esto esta dentro del FixedUpdate.

corner.position = new Vector3( transform.position.x , target.position.y , 0);


Una vez tenemos formado el triángulo calculamos el Cateto Opuesto y el Cateto Adyacente:

float cA = corner.position.y - transform.position.y;
float cO = corner.position.x - target.position.x;

Bien ahora para encontrar el ángulo tenemos que despejarlo de la tangente de la sig forma:

  • Tan θ = cO/cA
  • ArcTan Tan θ = ArcTan(cO/cA)
  • θ = ArcTan(cO/cA)

Bien ahora que tenemos una fórmula para calcular el ángulo lo implementamos en el código:

float angle = Mathf.Atan2(cO,cA) * Mathf.Rad2Deg;

rb.rotation = angle;

Calculamos Arcotangente usando la función Atan2 esta recibe como para metros la tangente y retorna el ángulo, pero como este está en radianes lo multiplicamos por la constante Rad2Deg para convertirlo a grados.

Bueno esa la forma en la que lo implemente, pero esto tiene un inconveniente y es que la rotación es instantánea, ¿a alguien se le ocurre como implementarle una velocidad angular a la rotación del avión enemigo?

Yo encapsule el movimiento en una función y luego llamo a esa función en el FixedUpdate():

<code> 
  private void FixedUpdate()
    {
        CalculateAngle();
  }

    private void CalculateAngle()
    {
      //Hallamos la distancia en el eje X
       float distX = target.position.x - transform.position.x;
       //Hallamos la distancia en el eje Y
       float distY = target.position.y - transform.position.y;
       //Usamos Mathf para hallar la arcotangente y pasar el resultado de radianes a grados
       float angle = Mathf.Atan2(distY, distX) * Mathf.Rad2Deg;
       //Le restamos 90 grados para corregir el desface que tiene
       rb.rotation = angle - 90;
       rb.velocity = (target.position - transform.position).normalized * moveSpeed;
  }

Otra forma de lograr el mismo resultado es con el siguiente código:

<code> 
   private void FixedUpdate()
    {
        CalculateAngle();
    }

    private void CalculateAngle()
    {
        transform.LookAt(target);
        rb.velocity = (target.position - transform.position).normalized * moveSpeed;
    }

Para que esto funciones debemos hacer una configuración de gameObject padre-hijo de la siguiente forma:

Padre:

Hijo: