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.
Défi
MoyenLaisse le joueur déclencher une onde de choc avec la barre d’espace.
- À la détection de
Input.GetKeyDown(KeyCode.Space), parcoursforeach (Collider hit in Physics.OverlapSphere(transform.position, radius)), en ignorant le collider du joueur. - Pour chaque
hit.TryGetComponent(out Rigidbody body), définisaway = hit.transform.position - transform.positionavecaway.y = 0f. - 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
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 porteEntraînez-vous par vous-même : Playground Unity