Vérifier le sol avec un rayon
Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 35 sur 63.
Un saut ne devrait commencer que depuis le sol. Standing on the Ground déterminait cela à partir des normales de contact, mises à jour par les messages de collision. Un rayon répond sur-le-champ, à tout moment, à la question « suis-je debout sur quelque chose ? » : lance-le droit vers le bas depuis le centre, avec une longueur légèrement supérieure à la distance entre le centre et le bas. Ce joueur est une capsule de 2 unités de haut, donc son bas se trouve 1 unité sous son centre, et le rayon mesure 1.1 :
public float jumpForce = 5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
bool IsGrounded()
{
return Physics.Raycast(transform.position, Vector3.down, 1.1f);
}Les 0.1 supplémentaires constituent une marge. Un corps au repos sur le sol peut se trouver un tout petit peu au-dessus ou s’enfoncer un tout petit peu dedans ; un rayon de longueur exactement égale à 1 rate donc sa cible pendant certaines images. Une longueur beaucoup plus grande pose le problème inverse : avec 3, le joueur pourrait sauter à nouveau alors qu’il se trouve à 2 unités dans les airs, et sans aucune longueur, le rayon trouve toujours le sol, donc chaque pression déclenche un saut.
Le rayon commence à l’intérieur du collider du joueur, que les rayons ignorent, donc il ne détecte jamais le joueur. La touche est lue dans Update(), car GetKeyDown n’est vrai que pendant une seule image, et une impulsion ponctuelle peut être ajoutée directement à cet endroit, comme dans Jump with an Impulse.
Défi
MoyenLa grenouille saute dès que la barre d’espace est pressée, même en plein air, et peut ainsi grimper jusqu’au ciel. Modifie Hopper pour qu’elle ne saute que depuis le sol :
- Ajoute une méthode
bool IsGrounded()qui lance un rayon vertical vers le bas depuis le centre de la grenouille. La grenouille est une sphère mise à l’échelle 1.5, son rayon est donc de 0.75 : fais en sorte que le rayon dépasse de 0.1 le bas de la sphère. - Fais-la sauter uniquement lorsque la barre d’espace est pressée et que
IsGrounded()est vrai.
Appuie sur Jouer et essaie de sauter deux fois, puis clique sur Vérifier.
Essayez vous-même
using UnityEngine;
public class Hopper : MonoBehaviour
{
public float jumpForce = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
}
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 à ramasser3Déclencheurs
Colliders déclencheursOnTriggerEnterObjets à ramasserZones mortellesEntrée et sortieRécapitulatif : clé et porte6Lancers de rayons
Physics.RaycastRaycastHitVérifier le sol avec un rayonLayers et LayerMaskLigne de vueOverlapSphere et SphereCastRécapitulatif : fil-piège laser