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.
Défi
MoyenColore le sentinelle en rouge lorsqu’elle peut voir le joueur, et en vert sinon.
- Écris
bool CanSee(): avecVector3 toPlayer = player.position - transform.position;, renvoiefalselorsquetoPlayer.magnitude > range. - Lance ensuite
Physics.Raycast(transform.position, toPlayer, out RaycastHit hit, range)et renvoiehit.transform == player; si le rayon ne touche rien, renvoiefalse. - Dans
Update(), définis la couleur de la tour surColor.redouColor.greenselon le résultat deCanSee().
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
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 à rebours7Rotation
Angles d’EulerQuaternionsRegardez dans la direction où vous vous déplacezTourner en douceurRécapitulatif : tourelle10Projet : Évasion de l’arène
L’arèneLes chasseurs2Collisions
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 à ramasser3Déclencheurs
Colliders déclencheursOnTriggerEnterObjets à ramasserLes caisses gardent le resteZones mortellesEntrée et sortieRécapitulatif : clé et porteEntraînez-vous par vous-même : Playground Unity