Menu
CoddyTech

Gira suavemente

Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 45 de 71.

Establecer transform.rotation directamente en una nueva rotación hace que un objeto gire en un solo fotograma. Quaternion.RotateTowards(current, goal, maxDegrees) devuelve current girado hacia goal como máximo maxDegrees, y nunca más allá del objetivo. Si se usa turnSpeed * Time.deltaTime como paso, el objeto gira a un ritmo constante y se detiene exactamente en su objetivo, igual que hace MoveTowards con las posiciones. Este girasol sigue al sol a 30 grados por segundo:

public Transform sun;
public float turnSpeed = 30f;

void Update()
{
    Quaternion goal = Quaternion.LookRotation(sun.position - transform.position);
    transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);
}

Si el sol está a 90 grados, el girasol tarda 3 segundos en alcanzarlo, girando 30 grados cada segundo. Gira por el camino más corto y el objetivo se calcula de nuevo en cada fotograma, así que sigue al sol cuando se mueve.

Quaternion.Slerp(a, b, t) es la rotación que está a una fracción t del recorrido entre a y b, igual que Vector3.Lerp para los puntos. Si se escribe como Slerp(transform.rotation, goal, 5f * Time.deltaTime) en Update(), gira una parte del ángulo restante en cada fotograma: rápido al principio, cada vez más despacio cerca del objetivo, nunca a una velocidad fija y sin llegar a alcanzarlo del todo. Esa suavidad es adecuada para una cámara o para girar la cabeza. Cuando la velocidad de giro sea una regla del juego, como la de un cañón que gira 60 grados por segundo, usa RotateTowards.

challenge icon

Desafío

Intermedio

Haz que el búho gire suavemente hacia donde apunta cada flecha.

  1. Añade Quaternion goal; y asígnale transform.rotation en Start().
  2. Cuando Input.GetKeyDown detecte cada flecha, asígnale un valor a goal, por ejemplo goal = Quaternion.LookRotation(Vector3.right);: arriba +z, derecha +x, abajo -z, izquierda -x.
  3. En cada fotograma, asigna transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);.

Pulsa «Jugar» y toca las flechas. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;

public class Owl : MonoBehaviour
{
    public float turnSpeed = 180f;

    void Update()
    {
        // Arriba, derecha, abajo, izquierda: gira para mirar hacia +z, +x, -z, -x a turnSpeed grados por segundo.
    }
}

Todas las lecciones de Física y jugabilidad

Practica por tu cuenta: Playground de Unity