Menu
CoddyTech

Physics.Raycast

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

Un raycast lance une ligne invisible depuis un point, dans une direction, et indique si elle a touché un collider. Physics.Raycast(origin, direction, maxDistance) renvoie true lorsqu’un collider se trouve sur la ligne à une distance inférieure ou égale à maxDistance unités, et false dans le cas contraire. Cette voiture freine lorsque quelque chose se trouve à moins de 2 unités devant son nez :

public float brakeDistance = 2f;

void Update()
{
    if (Physics.Raycast(transform.position, transform.forward, brakeDistance))
    {
        Debug.Log("Brake!");
    }
}

transform.forward pivote avec la voiture, le rayon regarde donc toujours devant son nez ; Vector3.forward pointerait toujours le long de l’axe z du monde. Le rayon part du centre de la voiture, à l’intérieur de son propre collider, et un rayon ne signale jamais un collider à l’intérieur duquel il commence : la voiture ne se détecte donc pas elle-même. Omettez maxDistance et le rayon se prolonge à l’infini : la voiture freinerait à cause d’un mur situé à l’autre bout de la carte.

Les rayons détectent les colliders, pas ce qui est dessiné : un objet avec un Renderer mais sans collider leur est invisible, et un collider de type trigger est considéré comme un impact. Pendant les tests, Debug.DrawRay(transform.position, transform.forward * brakeDistance, Color.red) dessine le rayon dans la vue Scene de Unity.

challenge icon

Défi

Moyen

Fais en sorte que la porte du magasin s’ouvre lorsqu’une personne se tient sous le capteur.

  1. Dans Update(), teste Physics.Raycast(transform.position, Vector3.down, reach) : un rayon droit vers le bas, long de reach unités, qui s’arrête au-dessus du sol.
  2. Lorsque le résultat est vrai, appelle door.SetActive(false);, et dans le else, door.SetActive(true);.

Clique sur « Jouer » et fais passer le visiteur sous le capteur : la porte s’ouvre, puis se referme derrière lui. Ensuite, clique sur « Vérifier ».

Essayez vous-même

using UnityEngine;

public class DoorSensor : MonoBehaviour
{
    public GameObject door;
    public float reach = 3f;

    void Update()
    {
        // Ouvrir la porte tant que le rayon dirigé vers le bas depuis le Sensor touche quelque chose.
    }
}

Toutes les leçons de Physique et gameplay

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