Ligne de vue
Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 37 sur 63.
Être près d’un garde ne signifie pas qu’il vous voit : un mur entre vous bloque sa vue. Pour tester la visibilité directe, lance un rayon depuis l’œil vers la cible et vérifie 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 tienne, 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 tant que CanSee() est vrai. Quand la cible est à découvert, le premier élément touché par le rayon est la cible. Quand la cible se trouve derrière une caisse, le rayon touche d’abord la caisse, hit.transform est celui de la caisse, et la réponse est fausse. Physics.Raycast renvoie également true pour la caisse à lui seul, c’est pourquoi la touche est comparée à la cible.
La cible doit avoir un collider pour que le rayon la détecte. Il n’est pas nécessaire de normaliser la direction du rayon, puisque sa longueur provient de maxDistance. Physics.Linecast(from, to) pose la question dans l’autre sens : un collider se trouve-t-il entre deux points ? !Physics.Linecast(eye, target.position, wallMask) signifie qu’aucun mur ne fait obstacle.
Défi
MoyenLa tour de guet surveille le joueur. Le script Sentry se trouve sur la tour, et l’Inspector lui fournit le player et une range de 8. La couleur de la tour indique ce qu’elle voit :
- Tant qu’elle voit le joueur, colore la tour en rouge (
Color.red) et en vert (Color.green) sinon. - Elle voit le joueur uniquement si celui-ci se trouve à une distance inférieure ou égale à
rangeunités et si rien ne se trouve entre eux.
Appuie sur Play et déplace le joueur autour du mur avec les flèches, puis Check.
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.
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
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 à rebours2Collisions
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 à ramasser