Menu
CoddyTech

Tourner en douceur

Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 45 sur 71.

Définir directement transform.rotation sur une nouvelle rotation fait tourner un objet en une seule image. Quaternion.RotateTowards(current, goal, maxDegrees) renvoie current tourné vers goal d’au plus maxDegrees, sans jamais dépasser l’objectif. En utilisant turnSpeed * Time.deltaTime comme incrément, l’objet tourne à une vitesse constante et s’arrête exactement sur son objectif, comme le fait MoveTowards pour les positions. Ce tournesol suit le soleil à 30 degrés par seconde :

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 le soleil est à 90 degrés, le tournesol met 3 secondes à le rejoindre, en tournant de 30 degrés à chaque seconde. Il tourne par le chemin le plus court, et l’objectif est recalculé à chaque image, ce qui lui permet de suivre un soleil en mouvement.

Quaternion.Slerp(a, b, t) représente la rotation située à une fraction t du trajet entre a et b, comme Vector3.Lerp le fait pour les points. Écrit sous la forme Slerp(transform.rotation, goal, 5f * Time.deltaTime) dans Update(), ce code effectue une partie de l’angle restant à chaque image : le mouvement est rapide au début, puis ralentit de plus en plus à l’approche de l’objectif ; il ne se fait jamais à vitesse constante et n’atteint jamais tout à fait l’objectif. Cette transition en douceur convient à une caméra ou à une tête qui pivote. Lorsque la vitesse de rotation est une règle du jeu, comme pour un canon qui pivote de 60 degrés par seconde, utilise RotateTowards.

challenge icon

Défi

Moyen

Fais tourner le hibou en douceur dans la direction indiquée par chaque flèche.

  1. Ajoute Quaternion goal; et définis-le sur transform.rotation dans Start().
  2. À l’appui sur chaque flèche avec Input.GetKeyDown, définis goal, par exemple goal = Quaternion.LookRotation(Vector3.right); : haut +z, droite +x, bas -z, gauche -x.
  3. À chaque image, définis transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);.

Appuie sur « Jouer » et touche les flèches. Puis appuie sur « Vérifier ».

Essayez vous-même

using UnityEngine;

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

    void Update()
    {
        // Haut, droite, bas, gauche : pivoter pour faire face à +z, +x, -z, -x à une vitesse de turnSpeed degrés par seconde.
    }
}

Toutes les leçons de Physique et gameplay

Entraînez-vous par vous-même : Playground Unity