Menu
CoddyTech

Repousser

Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 57 sur 71.

Un effet de recul est une poussée qui éloigne de ce qui vous a heurté : une impulsion le long de la ligne reliant l’objet qui frappe à celui qui est frappé. Cette borne repousse tout ce qui la heurte :

[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 de la borne vers l’objet qui l’a heurtée. Sa coordonnée y est réglée sur 0 pour que la poussée reste horizontale, et normalized lui donne la même longueur, quelle que soit la distance entre les deux centres. ForceMode.Impulse correspond à une poussée ponctuelle : elle modifie la vitesse de power divisé par la masse, en une seule fois, si bien 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 produit l’effet d’une seule é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 à l’étape suivante ; un script de ce type doit donc laisser la vitesse inchangée pendant un instant après un impact, ou déplacer le joueur à l’aide de forces.

challenge icon

Défi

Moyen

Laisse le joueur déclencher une onde de choc avec la barre d’espace.

  1. À la détection de Input.GetKeyDown(KeyCode.Space), parcours foreach (Collider hit in Physics.OverlapSphere(transform.position, radius)), en ignorant le collider du joueur.
  2. Pour chaque hit.TryGetComponent(out Rigidbody body), définis away = hit.transform.position - transform.position avec away.y = 0f.
  3. Appelle body.AddForce(away.normalized * power + Vector3.up * lift, ForceMode.Impulse);.

Appuie sur « Jouer » et appuie sur la barre d’espace parmi les caisses. Puis clique sur « Vérifier ».

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()
    {
        // sur Space : éloigner du joueur chaque Rigidbody situé dans radius
    }
}

Toutes les leçons de Physique et gameplay

Entraînez-vous par vous-même : Playground Unity