Rester au sol
Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 11 sur 63.
Chaque contact possède une normale : une direction de longueur 1, perpendiculaire à la surface que tu as touchée, qui pointe de celle-ci vers ton objet. collision.GetContact(0) est le premier point de contact, et sa normal t’indique de quel côté tu as touché. Debout sur un sol plat, elle vaut (0, 1, 0) ; contre un mur à ta droite, elle vaut (-1, 0, 0) ; lorsque tu te cognes la tête contre un plafond, elle vaut (0, -1, 0).
Cette caisse distingue les atterrissages des chocs latéraux :
void OnCollisionEnter(Collision collision)
{
Vector3 normal = collision.GetContact(0).normal;
if (normal.y > 0.5f)
{
Debug.Log("Landed on " + collision.gameObject.name);
}
else
{
Debug.Log("Bumped the side of " + collision.gameObject.name);
}
}Le test utilise normal.y > 0.5f plutôt que la valeur exacte 1 afin que les pentes comptent aussi comme du sol : y vaut 0.5 sur une pente de 60 degrés, plus raide que ce que quiconque peut gravir à pied. Deux autres messages sont utiles pour tout ce qui dure : OnCollisionStay s’exécute à chaque étape physique tant que le contact persiste, et OnCollisionExit une seule fois lorsqu’il prend fin. Un événement de sortie ne comporte aucun point de contact, puisque plus rien ne se touche ; n’appelle donc pas GetContact à cet endroit.
Défi
FacileLe joueur peut marcher et sauter, mais la touche Espace fonctionne aussi en plein air : il peut donc grimper vers le ciel en sautant à répétition et sauter depuis le côté du mur. (Son collider a un matériau sans friction, il glisse donc le long des murs au lieu d’y rester collé.) Faites en sorte qu’il ne saute que lorsqu’il se trouve sur quelque chose.
- Gardez un
bool grounded: à true tant que le joueur touche quelque chose dont la normale de contact pointe vers le haut (y supérieur à 0.5), à false dès qu’il ne le touche plus. - Sautez uniquement lorsque la touche Espace a été pressée et que
groundedest à true. Une pression en l’air est ignorée, elle n’est pas mémorisée pour l’atterrissage.
Appuyez sur Play, essayez de sauter deux fois et de grimper au mur, puis appuyez sur Check.
Essayez vous-même
using UnityEngine;
public class Hopper : MonoBehaviour
{
public float speed = 4f;
public float jump = 6f;
private Rigidbody rb;
private bool jumpPressed;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
jumpPressed = true;
}
}
void FixedUpdate()
{
float h = Input.GetAxisRaw("Horizontal");
rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, 0);
if (jumpPressed)
{
rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
jumpPressed = false;
}
}
}
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