Introduction aux vecteurs dans Unity
Dans Unity, les vecteurs sont représentés par les classes Vector2 et Vector3 pour les espaces 2D et 3D respectivement. Un vecteur est une entité mathématique qui a une magnitude (longueur) et une direction.
Créer des vecteurs
// Vecteur 2D Vector2 vecteur2D = new Vector2(1.0f, 2.0f); // Vecteur 3D Vector3 vecteur3D = new Vector3(1.0f, 2.0f, 3.0f);
Addition et soustraction
Vector3 vecteurA = new Vector3(1.0f, 2.0f, 3.0f); Vector3 vecteurB = new Vector3(4.0f, 5.0f, 6.0f); Vector3 somme = vecteurA + vecteurB; // Résultat : (5.0f, 7.0f, 9.0f) Vector3 difference = vecteurA - vecteurB; // Résultat : (-3.0f, -3.0f, -3.0f)
Multiplication et division par un scalaire
Pour changer la magnitude d'un vecteur :
Vector3 vecteur = new Vector3(2.0f, 3.0f, 4.0f); float scalaire = 2.0f; Vector3 resultatMultiplication = vecteur * scalaire; // (4.0f, 6.0f, 8.0f) Vector3 resultatDivision = vecteur / scalaire; // (1.0f, 1.5f, 2.0f)
Magnitude et normalisation
Calculer la magnitude
La magnitude d'un vecteur est sa longueur :
Vector3 vecteur = new Vector3(3.0f, 4.0f, 0.0f);
float magnitude = vecteur.magnitude; // Résultat : 5.0f
Normaliser un vecteur
Normaliser, c'est transformer le vecteur en un vecteur de longueur 1 qui conserve sa direction :
Vector3 vecteur = new Vector3(3.0f, 4.0f, 0.0f);
Vector3 vecteurNormalise = vecteur.normalized; // (0.6f, 0.8f, 0.0f)
Produit scalaire et produit vectoriel
Produit scalaire (Dot Product)
Le produit scalaire de deux vecteurs donne une valeur proportionnelle au cosinus de l'angle entre eux. Il sert à déterminer si deux vecteurs sont perpendiculaires, parallèles, ou s'ils pointent dans des directions similaires.
Vector3 vecteurA = new Vector3(1.0f, 0.0f, 0.0f);
Vector3 vecteurB = new Vector3(0.0f, 1.0f, 0.0f);
float produitScalaire = Vector3.Dot(vecteurA, vecteurB); // 0.0f : perpendiculaires
Produit vectoriel (Cross Product)
Le produit vectoriel de deux vecteurs 3D donne un vecteur perpendiculaire au plan formé par les deux vecteurs d'origine. On l'utilise pour calculer des normales ou orienter un objet.
Vector3 vecteurA = new Vector3(1.0f, 0.0f, 0.0f);
Vector3 vecteurB = new Vector3(0.0f, 1.0f, 0.0f);
Vector3 produitVectoriel = Vector3.Cross(vecteurA, vecteurB); // (0.0f, 0.0f, 1.0f)
Déplacer un objet
Déplacement dans une direction donnée
using UnityEngine;
public class DeplacementSimple : MonoBehaviour
{
public Vector3 direction = new Vector3(1.0f, 0.0f, 0.0f); // vers la droite
public float vitesse = 5.0f;
void Update()
{
// Déplacer l'objet en tenant compte du temps écoulé (Time.deltaTime)
transform.position += direction.normalized * vitesse * Time.deltaTime;
}
}
Déplacement vers un point cible
using UnityEngine;
public class DeplacementVersCible : MonoBehaviour
{
public Transform cible;
public float vitesse = 5.0f;
void Update()
{
// Calculer la direction vers la cible
Vector3 direction = (cible.position - transform.position).normalized;
// Déplacer l'objet vers la cible
transform.position += direction * vitesse * Time.deltaTime;
}
}
Faire tourner un objet
Rotation autour de l'axe Y
using UnityEngine;
public class RotationSimple : MonoBehaviour
{
public float vitesseRotation = 90.0f; // degrés par seconde
void Update()
{
transform.Rotate(Vector3.up, vitesseRotation * Time.deltaTime);
}
}
Faire face à une cible avec LookAt
using UnityEngine;
public class FaireFaceACible : MonoBehaviour
{
public Transform cible;
void Update()
{
transform.LookAt(cible);
}
}
Calcul manuel de la rotation (en douceur)
using UnityEngine;
public class RotationVersCible : MonoBehaviour
{
public Transform cible;
public float vitesseRotation = 5.0f;
void Update()
{
Vector3 direction = (cible.position - transform.position).normalized;
Quaternion rotationVersCible = Quaternion.LookRotation(direction);
// Appliquer la rotation en douceur
transform.rotation = Quaternion.Slerp(transform.rotation, rotationVersCible, vitesseRotation * Time.deltaTime);
}
}
Combiner déplacement et rotation
L'objet se déplace tout en regardant dans la direction de son mouvement :
using UnityEngine;
public class DeplacementRotationCombine : MonoBehaviour
{
public Transform cible;
public float vitesseDeplacement = 5.0f;
public float vitesseRotation = 5.0f;
void Update()
{
Vector3 direction = (cible.position - transform.position).normalized;
transform.position += direction * vitesseDeplacement * Time.deltaTime;
Quaternion rotationVersCible = Quaternion.LookRotation(direction);
transform.rotation = Quaternion.Slerp(transform.rotation, rotationVersCible, vitesseRotation * Time.deltaTime);
}
}
Déplacement selon les entrées de l'utilisateur
Pour contrôler un personnage avec les touches du clavier (ZQSD ou flèches) :
using UnityEngine;
public class ControleJoueur : MonoBehaviour
{
public float vitesseDeplacement = 5.0f;
public float vitesseRotation = 100.0f;
void Update()
{
float translation = Input.GetAxis("Vertical") * vitesseDeplacement * Time.deltaTime;
float rotation = Input.GetAxis("Horizontal") * vitesseRotation * Time.deltaTime;
transform.Translate(0, 0, translation);
transform.Rotate(0, rotation, 0);
}
}