Menu
CoddyTech

Mit AddForce schieben

Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 2 von 71.

Sobald ein Objekt ein Rigidbody hat, bewegt die Physik es. Deshalb hörst du auf, seine Position zu ändern, und schiebst es stattdessen an. rb.AddForce(force) schiebt den Körper mit einer Kraft an, einem Vector3 in Newton. Eine Kraft legt keine Geschwindigkeit fest: Solange du sie weiter hinzufügst, beschleunigt sie den Körper jede Sekunde um die Kraft geteilt durch die Masse. Hörst du auf zu schieben, behält der Körper seine Geschwindigkeit bei.

Dieses Hovercraft (2 kg) hat ein Triebwerk: Solange die Nach-oben-Taste gedrückt ist, schiebt eine Kraft von thrust es nach vorne, entlang +z. Bei einem Schub von 12 gewinnt es jede Sekunde 12 / 2 = 6 m/s hinzu:

public float thrust = 12f;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void FixedUpdate()
{
    if (Input.GetKey(KeyCode.UpArrow))
    {
        rb.AddForce(Vector3.forward * thrust);
    }
}

Kräfte gehören in FixedUpdate(), das Unity vor jedem Physikschritt 50-mal pro Sekunde aufruft (Lektion 4 erklärt warum). In der Zeile kommt kein Time.deltaTime vor: AddForce verteilt die Kraft bereits über den Schritt, und eine Multiplikation mit Time.deltaTime würde den Schub 50-mal schwächer machen. Auf dem Boden wirkt die Reibung entgegen, deshalb kann eine kleine Kraft eine schwere Kiste möglicherweise überhaupt nicht bewegen.

challenge icon

Aufgabe

Einfach

Schiebe den Puck mit Kräften über die reibungsfreie Eisfläche.

  1. Lies in FixedUpdate() float h = Input.GetAxis("Horizontal"); und float v = Input.GetAxis("Vertical"); aus.
  2. Rufe rb.AddForce(new Vector3(h, 0, v) * push); ohne Time.deltaTime auf.

Drücke „Spielen“, schiebe den Puck an und lass los: Er gleitet weiter. Drücke dann „Prüfen“.

Probier es selbst

using UnityEngine;

public class PuckPusher : MonoBehaviour
{
    public float push = 4f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // Schiebe den Puck: Horizontal entlang der x-Achse, Vertikal entlang der z-Achse
    }
}

Alle Lektionen in Physik und Gameplay

Übe selbstständig: Unity-Playground