Menu
CoddyTech

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.

challenge icon

Défi

Moyen

Le 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 radius du joueur avec Physics.OverlapSphere.
  • Chacun de ceux qui possède un Rigidbody, à l’exception du joueur lui-même, reçoit une impulsion : power directement vers l’extérieur à partir du joueur, au ras du sol, plus lift vers 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
    }
}
quiz iconTestez-vous

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