Vecteurs et mouvements dans Unity

Module 1 | Guide résumé pour la Prépa Volière | C#

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);
    }
}