Menu
CoddyTech

Ligne de vue

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

Être près d’un garde ne signifie pas qu’il vous voit : un mur entre vous bloque sa vue. Pour tester la ligne de vue, lancez un rayon depuis l’œil vers la cible et vérifiez que la première chose qu’il touche est bien la cible elle-même. La direction correspond à la position de la cible moins la vôtre, et un rayon de cette longueur atteint la cible :

public Transform target;

bool CanSee()
{
    Vector3 toTarget = target.position - transform.position;
    if (Physics.Raycast(transform.position, toTarget, out RaycastHit hit, toTarget.magnitude))
    {
        return hit.transform == target;
    }
    return false;
}

Une caméra de sécurité sur un pilier consigne I see you lorsque CanSee() est vrai. Lorsque la cible est à découvert, le premier objet touché par le rayon est la cible. Lorsque la cible se trouve derrière une caisse, le rayon touche d’abord la caisse, hit.transform correspond à celle de la caisse, et la réponse est false. Physics.Raycast renvoie également true pour la caisse, ce qui explique pourquoi la collision est comparée à la cible.

La cible doit avoir un collider pour que le rayon puisse la détecter. Le rayon n’a pas besoin d’une direction normalisée, puisque sa longueur provient de maxDistance. Physics.Linecast(from, to) pose la question dans l’autre sens : est-ce qu’un collider se trouve entre deux points ? !Physics.Linecast(eye, target.position, wallMask) signifie qu’aucun mur ne fait obstacle.

challenge icon

Défi

Moyen

Colore le sentinelle en rouge lorsqu’elle peut voir le joueur, et en vert sinon.

  1. Écris bool CanSee() : avec Vector3 toPlayer = player.position - transform.position;, renvoie false lorsque toPlayer.magnitude > range.
  2. Lance ensuite Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range) et renvoie hit.transform == player ; si le rayon ne touche rien, renvoie false.
  3. Dans Update(), définis la couleur de la tour sur Color.red ou Color.green selon le résultat de CanSee().

Appuie sur « Jouer » et marche derrière le mur. Puis appuie sur « Vérifier ».

Essayez vous-même

using UnityEngine;

public class Sentry : MonoBehaviour
{
    public Transform player;
    public float range = 8f;

    void Update()
    {
        // Rouge tant que la sentinelle peut voir le joueur, vert sinon.
    }
}

Toutes les leçons de Physique et gameplay

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