Recul
Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 54 sur 63.
Une poussée repousse l’objet qui a été heurté : une impulsion le long de la ligne reliant celui qui frappe à l’objet frappé. Ce bumper repousse tout ce qui le percute :
[SerializeField] private float power = 8f;
void OnCollisionEnter(Collision collision)
{
Vector3 away = collision.transform.position - transform.position;
away.y = 0f;
collision.rigidbody.AddForce(away.normalized * power, ForceMode.Impulse);
}collision.transform.position - transform.position pointe du bumper vers l’objet qui l’a heurté. Sa coordonnée y est définie sur 0 afin que la poussée reste horizontale, et normalized lui donne la même magnitude quelle que soit la distance entre les deux centres. ForceMode.Impulse correspond à une poussée ponctuelle : elle modifie immédiatement la vitesse de power divisé par la masse, de sorte qu’une balle de masse 2 part à la moitié de la vitesse d’une balle de masse 1. Le mode par défaut, ForceMode.Force, est conçu pour être appliqué à chaque étape et donne une poussée correspondant à une étape, soit 50 fois moins.
La poussée ne dure que tant que rien ne remplace la vitesse. Un joueur dont le FixedUpdate définit rb.linearVelocity à partir des flèches à chaque étape la perd dès l’étape suivante. Un script de ce type doit donc laisser la vitesse inchangée pendant un moment après un impact, ou déplacer le joueur à l’aide de forces.
Défi
MoyenLe joueur peut déclencher une onde de choc. Écris le script Shockwave sur le Player. L’Inspector lui attribue radius (4), power (6) et lift (2). Le script Player est prêt : les flèches déplacent le joueur.
- Quand tu appuies sur Espace, trouve chaque collider situé à moins de
radiusdu joueur avecPhysics.OverlapSphere. - Chacun de ceux qui possède un Rigidbody, à l’exception du joueur lui-même, reçoit une impulsion :
powerdirectement vers l’extérieur à partir du joueur, au ras du sol, plusliftvers le haut. - Les colliders sans Rigidbody, comme le sol, ne sont pas affectés.
Appuie sur Play, déplace-toi parmi les caisses et appuie sur Espace, puis sur Check.
Essayez vous-même
using UnityEngine;
public class Shockwave : MonoBehaviour
{
[SerializeField] private float radius = 4f;
[SerializeField] private float power = 6f;
[SerializeField] private float lift = 2f;
void Update()
{
// à l'appui sur Space : repousser chaque Rigidbody situé dans le rayon radius loin du joueur
}
}
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