Vérifier le sol avec un rayon
Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 37 sur 71.
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 : son bas se trouve donc 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, donc un rayon de longueur exactement égale à 1 ne détecte pas le sol sur certaines images. Une longueur beaucoup plus grande pose le problème inverse : avec 3, le joueur pourrait sauter de nouveau alors qu’il est à 2 unités dans les airs, et avec une longueur nulle, le rayon trouve toujours le sol, donc chaque pression déclenche un saut.
Le rayon commence à l’intérieur du propre collider du joueur, que les rayons ignorent : il ne signale donc 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 « Sauter avec une impulsion ».
Défi
MoyenFais sauter la grenouille uniquement depuis le sol.
- Ajoute
bool IsGrounded()qui renvoiePhysics.Raycast(transform.position, Vector3.down, 0.85f): le rayon de la grenouille, 0.75, plus 0.1. - Dans
Update(), ajoute&& IsGrounded()auifsur Space.
Appuie sur « Jouer » et appuie deux fois sur Space : la grenouille saute une 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);
}
}
}
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 porte6Lancers de rayons
Physics.RaycastRaycastHitVérifier le sol avec un rayonLayers et LayerMaskLigne de vueOverlapSphere et SphereCastRécapitulatif : fil-piège laserEntraînez-vous par vous-même : Playground Unity