Menu
CoddyTech

Rückstoß

Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 54 von 63.

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 Rammbock 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 Rammbock zu dem Objekt, das ihn getroffen hat. Der 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 Masse 2 mit halb so hoher Geschwindigkeit davonfliegt wie ein Ball mit Masse 1. Der standardmäßige ForceMode.Force ist dafür gedacht, in jedem Schritt angewendet zu werden, und liefert die Wirkung eines einzelnen Schritts, also 50-mal weniger.

Der Stoß hält nur an, solange nichts die Geschwindigkeit überschreibt. Bei einem Spieler, dessen FixedUpdate in jedem Schritt rb.linearVelocity anhand der Pfeiltasten festlegt, ist sie einen Schritt später wieder weg. Ein solches Skript muss die Geschwindigkeit nach einem Treffer also kurzzeitig unangetastet lassen oder den Spieler mit Kräften bewegen.

challenge icon

Aufgabe

Mittel

Der Spieler kann eine Schockwelle auslösen. Schreibe das Skript Shockwave auf den Player. Im Inspector werden ihm radius (4), power (6) und lift (2) zugewiesen. Das Skript Player ist fertig: Mit den Pfeiltasten bewegt sich der Spieler.

  • Wenn die Leertaste gedrückt wird, ermittle mit Physics.OverlapSphere alle Collider innerhalb des radius um den Spieler.
  • Jeder davon, der ein Rigidbody hat, außer dem Spieler selbst, erhält einen Impuls: power direkt vom Spieler weg über den Boden, plus lift nach oben.
  • Collider ohne Rigidbody, wie etwa der Boden, bleiben unberührt.

Drücke Play, bewege dich zwischen den Kisten und drücke die Leertaste, dann Check.

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
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Physik und Gameplay