Quaternions
Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 41 sur 63.
Un Quaternion est le type utilisé par Unity pour représenter une rotation : transform.rotation en est une, tout comme la valeur renvoyée par Quaternion.Euler. Ses quatre nombres x, y, z et w ne sont pas des angles, et tu n'as jamais besoin de les définir toi-même. Pour combiner des rotations, tu les multiplies. Une rotation multipliée par un vecteur fait tourner ce vecteur :
Vector3 a = Quaternion.Euler(0, 90, 0) * Vector3.forward; // (1, 0, 0)
Vector3 b = Quaternion.Euler(0, 0, 45) * new Vector3(2, 0, 0); // (1.41, 1.41, 0)
Vector3 lamp = transform.position + transform.rotation * new Vector3(0, 1, 2);La rotation se place à gauche : Vector3.forward * transform.rotation ne compile pas. La troisième ligne fait tourner un décalage selon la rotation propre de l'objet ; lamp correspond donc au point situé 1 unité au-dessus et 2 unités devant l'objet dans ses propres directions, quelle que soit son orientation.
Une rotation multipliée par une autre rotation combine les deux rotations. transform.rotation * Quaternion.Euler(0, 90, 0) correspond à la rotation de l'objet, suivie d'un quart de tour autour de son propre axe y ; si tu inverses l'ordre, le quart de tour se fait autour de l'axe y du monde. Pour un objet droit, les deux donnent le même résultat. Pour un avion incliné de 30 degrés, ce n'est pas le cas, car son propre axe y est incliné avec lui :
Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0); // nez (0.87, 0.5, 0) : il monte en tournant
Quaternion world = Quaternion.Euler(0, 90, 0) * banked; // nez (1, 0, 0) : il reste à l’horizontaleQuaternion.identity représente l'absence totale de rotation, celle que tu as passée à Instantiate. La multiplier ne change rien, et transform.rotation = Quaternion.identity; remet un objet dans sa pose sans rotation.
Défi
MoyenLe canon tourne avec les flèches gauche et droite, et la barre d’espace tire une balle droit devant. Fais en sorte que la barre d’espace tire plutôt une salve de trois balles : une droit devant, une tournée de spread (20) degrés vers la droite par rapport à la direction du canon, et une tournée de 20 degrés vers la gauche. La dispersion doit tourner avec le canon.
- Chaque balle est orientée dans sa propre direction (le script Bullet fourni la fait avancer dans sa direction avant).
- Chaque balle commence à 1 unité du centre du canon, dans sa propre direction.
Appuie sur Play, tourne et tire, puis Check.
Essayez vous-même
using UnityEngine;
public class Gun : MonoBehaviour
{
public GameObject bulletPrefab;
public float turnSpeed = 90f;
public float spread = 20f;
void Update()
{
if (Input.GetKey(KeyCode.RightArrow)) transform.Rotate(0, turnSpeed * Time.deltaTime, 0);
if (Input.GetKey(KeyCode.LeftArrow)) transform.Rotate(0, -turnSpeed * Time.deltaTime, 0);
if (Input.GetKeyDown(KeyCode.Space))
{
// Une balle, droit devant. Tire-en trois : à -spread, 0 et spread degrés.
Instantiate(bulletPrefab, transform.position, transform.rotation);
}
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Physique et gameplay
1Corps rigide
Gravité et massePousser avec AddForceSauter avec une impulsionFixedUpdate pour la physiqueVitesseCorps cinématiquesRécapitulatif : plateforme de lancement4Coroutines
InvoquerInvokeRepeating, CancelInvokeVotre première coroutineBoucles dans les coroutinesArrêter les coroutinesRécapitulatif : compte à rebours2Collisions
OnCollisionEnterQu’est-ce que j’ai touché ?Se briser à l’impactRester au solRebond et frictionFormes des collidersRécapitulatif : mur destructible5Projet : Course aux pièces
La balle roulanteDes pièces à ramasser