Quaternions
Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 43 sur 71.
Un Quaternion est le type de Unity qui représente une rotation : transform.rotation en est un, 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 manipuler 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. Ainsi, lamp est le point situé 1 unité au-dessus et 2 unités devant l’objet, selon 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 s’effectue autour de l’axe y du monde. Pour un objet à la verticale, 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 par une rotation ne change rien, et transform.rotation = Quaternion.identity; remet un objet dans sa pose sans rotation.
Défi
MoyenFais en sorte que la barre d’espace tire une salve de trois balles qui pivote avec le canon.
- Remplace la ligne
Instantiateparfor (int i = -1; i <= 1; i++). - À l’intérieur, définis
Quaternion aim = transform.rotation * Quaternion.Euler(0, i * spread, 0);. - Fais apparaître chaque balle à 1 unité dans la direction visée :
Instantiate(bulletPrefab, transform.position + aim * Vector3.forward, aim);.
Appuie sur « Jouer », tourne et tire : les trois balles s’écartent en éventail, à 20 degrés les unes des autres. Puis clique sur « Vérifier ».
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);
}
}
}
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 à rebours7Rotation
Angles d’EulerQuaternionsRegardez dans la direction où vous vous déplacezTourner en douceurRécapitulatif : tourelle10Projet : Évasion de l’arène
L’arèneLes chasseurs2Collisions
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 à ramasser3Déclencheurs
Colliders déclencheursOnTriggerEnterObjets à ramasserLes caisses gardent le resteZones mortellesEntrée et sortieRécapitulatif : clé et porteEntraînez-vous par vous-même : Playground Unity