Kinematische Körper
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 6 von 71.
Bewegliche Plattformen, Aufzüge und Türen müssen wie feste Objekte kollidieren, dürfen aber weder herunterfallen noch von allem, was auf ihnen landet, herumgeschoben werden. Das ist ein kinematischer Körper: Setze rb.isKinematic = true, dann bewegen ihn Schwerkraft, Kräfte und Stöße nicht mehr. Sein Collider zählt weiterhin, sodass ein dynamischer Körper (den die Physik bewegt) gegen ihn stößt wie gegen eine Wand und auf ihm steht wie auf dem Boden. Du bewegst einen kinematischen Körper selbst mit rb.MovePosition.
Dieser Aufzug fährt mit lift m/s nach oben, bis er top erreicht. MovePosition erwartet die Position, an der sich das Objekt nach diesem Schritt befinden soll. Deshalb addiert der Code die Bewegung eines Schritts mithilfe von Time.fixedDeltaTime:
void Start()
{
rb = GetComponent<Rigidbody>();
rb.isKinematic = true;
}
void FixedUpdate()
{
if (rb.position.y < top)
{
rb.MovePosition(rb.position + Vector3.up * lift * Time.fixedDeltaTime);
}
}Warum nicht transform.position setzen? Dadurch wird das Objekt teleportiert, und die Physik erfährt nie, dass es sich bewegt hat: Eine Kiste auf einer gleitenden Plattform würde zurückbleiben, statt mitzufahren. MovePosition teilt der Physik mit, dass sich der Körper während des Schritts an die neue Stelle bewegt hat, sodass alles, was er berührt, korrekt mitgenommen und geschoben wird. AddForce bewirkt bei einem kinematischen Körper nichts, und kinematische Körper kollidieren niemals mit statischen Collidern oder miteinander: Nur dynamische Körper stoßen mit ihnen zusammen.
Aufgabe
EinfachHänge die Barke über die Lava und schiebe sie mit den Pfeiltasten.
- Setze in
Start()rb.isKinematic = true;. - Lies in
FixedUpdate()float h = Input.GetAxisRaw("Horizontal");aus und ruferb.MovePosition(rb.position + Vector3.right * h * speed * Time.fixedDeltaTime);auf.
Drücke „Spielen“ und schiebe sie: Die Barke hängt in der Luft und die Drohne prallt ab. Drücke dann „Prüfen“.
Probier es selbst
using UnityEngine;
public class Barge : MonoBehaviour
{
public float speed = 2f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
// Setze den Lastkahn auf kinematisch
}
void FixedUpdate()
{
// Verschiebe ihn mit den Pfeiltasten entlang der x-Achse
}
}
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