Rückstoß
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 57 von 71.
Ein Rückstoß ist ein Stoß weg von dem, was dich getroffen hat: ein Impuls entlang der Linie vom Stoßenden zum getroffenen Objekt. Dieser Stoßfänger stößt alles zurück, was mit ihm zusammenstößt:
[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 zeigt vom Stoßfänger zu dem Objekt, das ihn getroffen hat. Sein y-Wert wird auf 0 gesetzt, damit der Stoß waagerecht bleibt, und normalized sorgt dafür, dass der Vektor unabhängig vom Abstand zwischen den beiden Mittelpunkten dieselbe Länge hat. ForceMode.Impulse ist ein einmaliger Stoß: Er ändert die Geschwindigkeit sofort um power geteilt durch die Masse, sodass ein Ball mit der Masse 2 mit halb so hoher Geschwindigkeit wegfliegt wie ein Ball mit der Masse 1. Der Standardwert ForceMode.Force ist für die Anwendung in jedem Schritt gedacht und bewirkt pro Schritt eine Veränderung, die 50-mal kleiner ist.
Der Stoß hält nur so lange an, wie nichts die Geschwindigkeit überschreibt. Ein Spieler, dessen FixedUpdate in jedem Schritt rb.linearVelocity anhand der Pfeiltasten setzt, verliert den Stoß einen Schritt später. Ein solches Skript muss die Geschwindigkeit also nach einem Treffer kurzzeitig unverändert lassen oder den Spieler mit Kräften bewegen.
Aufgabe
MittelLass den Spieler mit der Leertaste eine Schockwelle auslösen.
- Bei
Input.GetKeyDown(KeyCode.Space)durchlaufeforeach (Collider hit in Physics.OverlapSphere(transform.position, radius))und überspringe dabei den Collider des Spielers selbst. - Verwende für jedes
hit.TryGetComponent(out Rigidbody body)den Wertaway = hit.transform.position - transform.positionmitaway.y = 0f. - Rufe
body.AddForce(away.normalized * power + Vector3.up * lift, ForceMode.Impulse);auf.
Drücke „Spielen“ und dann zwischen den Kisten die Leertaste. Klicke anschließend auf „Prüfen“.
Probier es selbst
using UnityEngine;
public class Shockwave : MonoBehaviour
{
[SerializeField] private float radius = 4f;
[SerializeField] private float power = 6f;
[SerializeField] private float lift = 2f;
void Update()
{
// Bei Space: jeden Rigidbody innerhalb von radius vom Spieler wegstoßen
}
}
Alle Lektionen in Physik und Gameplay
1Rigidbody
Schwerkraft und MasseMit AddForce schiebenMit einem Impuls springenFixedUpdate für PhysikGeschwindigkeitKinematische KörperRückblick: Startrampe4Coroutinen
AufrufenWiederholt aufrufen, Aufruf abbrechenDeine erste CoroutineSchleifen in CoroutinenCoroutinen beendenRückblick: Countdown10Projekt: Arena-Flucht
Die ArenaJäger2Kollisionen
OnCollisionEnterWas habe ich getroffen?Beim Aufprall zerbrechenAuf dem Boden stehenAbprallen und ReibungCollider-FormenRückblick: Zerstörbare Wand5Projekt: Münzrausch
Der rollende BallMünzen zum Einsammeln11Abschließende Herausforderungen
KanonenreichweiteBewegliche ZieleMurmelgolfIns LochEscape RoomDie TürÜbe selbstständig: Unity-Playground