Die Geschwindigkeit beibehalten
Lektion 3 von 16 im Kurs Unity-Spiel: Brick Breaker von Coddy.
Ein Brick-Breaker-Ball wird nie langsamer. Sein PhysicsMaterial übernimmt den größten Teil der Arbeit: Bounciness 1 sorgt dafür, dass bei jedem Abprallen die gesamte Geschwindigkeit erhalten bleibt, und Friction 0 verhindert, dass die Wände den Ball abbremsen oder in Drehung versetzen. Die Wände und Ziegel haben kein eigenes Material, und Unity kombiniert standardmäßig die Werte der beiden Collider mit Average: Die 1 des Balls und der Standardwert 0 einer Wand ergeben einen Abprall mit halber Geschwindigkeit. Mit bounceCombine = Maximum und frictionCombine = Minimum setzen sich die eigenen Werte des Balls gegenüber allem durch, womit er zusammenstößt.
Die Physik ist trotzdem nicht exakt: Ein beweglicher Schläger addiert seine eigene Geschwindigkeit zu einem Abprall, zwei Bälle stoßen sich gegenseitig weg, und kleine Fehler summieren sich über Hunderte von Abprallern. Deshalb behält der Ball bei jedem FixedUpdate seine Richtung bei und seine Geschwindigkeit wird zurückgesetzt. Beim Rigidbody des Balls ist außerdem im Inspector Freeze Position Z aktiviert, wodurch er auf der Spielebene bleibt.
Ein anderes Spiel benötigt eine andere Regel. Ein Air-Hockey-Puck darf langsamer werden, aber nie schneller als ein bestimmter Grenzwert sein, und Vector3.ClampMagnitude kürzt einen zu langen Vektor und lässt einen kürzeren unverändert:
void FixedUpdate()
{
rb.linearVelocity = Vector3.ClampMagnitude(rb.linearVelocity, maxSpeed);
}Für den Ball reicht eine Begrenzung nicht aus: Ein Ball, der auf 2 Einheiten pro Sekunde abgebremst wurde, würde bei 2 bleiben. Seine Geschwindigkeit muss exakt anhand seiner Richtung festgelegt werden.
Aufgabe
EinfachIn Ball:
- Erstelle in
Awake()einnew PhysicsMaterial("Bouncy")mit einem Rückprallwert von 1, dynamischer und statischer Reibung von 0,bounceCombineMaximum undfrictionCombineMinimum, und weise es dem Collider des Balls mitGetComponent<Collider>().materialzu. - Füge
FixedUpdate()hinzu: Setze, während der Ball gestartet ist, seinelinearVelocityauf seine aktuelle Richtung multipliziert mitspeed.
In Unity kannst du das Material auch als Asset erstellen (Create > Physics Material) und in das Material-Feld des Sphere Colliders ziehen; hier erstellt es das Skript.
Drücke Play, starte den Ball und beobachte, wie er abprallt, dann Check.
Probier es selbst
using UnityEngine;
using UnityEngine.InputSystem;
public class Ball : MonoBehaviour
{
public Transform paddle;
public float speed = 9f;
Rigidbody rb;
bool launched;
void Awake()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (launched) return;
transform.position = paddle.position + Vector3.up * 0.5f;
if (Keyboard.current.spaceKey.wasPressedThisFrame) Launch(new Vector3(0.3f, 1f, 0f));
}
public void Launch(Vector3 direction)
{
launched = true;
rb.linearVelocity = direction.normalized * speed;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.