No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Matemáticas para juegos: personaje

12/32
Recursos

Aportes 5

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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?

    private void Update()
    {
        transform.up = target.position - transform.position;
    }

No lo hice con las razones trigonometricas pero asi tambien funciona.

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:

Reto completado!

 private void Update()
    {
        //The distance to enemy of Enemy class.
        _enemyDistance = Target.position - this.transform.position;
        //The direction to enemy of Enemy class.
        _enemyDirection = _enemyDistance.normalized;
	
				//Calculo el angulo que hay entre 0 y la posicion del enemigo de la clase Enemy, lo paso a grados y le reston 90 para que no quede doblado el sprite.
        float angleToEnemy = Mathf.Atan2(_enemyDirection.y, _enemyDirection.x) * Mathf.Rad2Deg - 90;
				//Hago que  rote alrededor del eje Z y multiplico por el angulo anterior.
        transform.eulerAngles = Vector3.forward * angleToEnemy;

    }

Con solo dos lineas podemos completar el reto, esta informacion la saque youtube y es un punto de vista muy util, puede servirnos un monton si queremos que un sprite rote en funcion de un punto. 😃

A ver chicos, tengo como 2 semanas tratando de resolver este dilema. Intente con razones trigonometricas por todos los caminos posibles, pero ningunas me lograba dar el resultado esperado.

Luego recorde una propiedad del producto vectorial y la aplique al juego para saber si el avion que controlamos se encuentra a la izquierda o derecha del enemigo.

Esta es mi solución, donde w es un Vector3:

Toda la documentación para entender esta solución la pueden encontrar en los siguientes links: