Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Lass den Spieler mit der Leertaste eine Schockwelle auslösen.

  1. Bei Input.GetKeyDown(KeyCode.Space) durchlaufe foreach (Collider hit in Physics.OverlapSphere(transform.position, radius)) und überspringe dabei den Collider des Spielers selbst.
  2. Verwende für jedes hit.TryGetComponent(out Rigidbody body) den Wert away = hit.transform.position - transform.position mit away.y = 0f.
  3. 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

Übe selbstständig: Unity-Playground