Die Geschwindigkeit beibehalten
Lektion 3 von 19 im Kurs Unity-Spiel: Brick Breaker von Coddy.
Ein Brick-Breaker-Ball wird nie langsamer. Sein PhysicsMaterial übernimmt den größten Teil der Arbeit: Eine Sprungkraft von 1 erhält die gesamte Geschwindigkeit eines Abprallens, und eine Reibung von 0 verhindert, dass die Wände ihn abbremsen. Die Wände haben kein Material, und Unity mittelt standardmäßig die Werte der beiden Collider: Die 1 des Balls und die 0 einer Wand ergeben einen Abprall mit halber Geschwindigkeit. bounceCombine = Maximum und frictionCombine = Minimum sorgen dafür, dass die Werte des Balls Vorrang haben.
Die Physik ist trotzdem nicht exakt: Ein beweglicher Schläger fügt seine Geschwindigkeit hinzu, und kleine Fehler summieren sich über Hunderte von Abprallern. Deshalb behält der Ball bei jedem Physikschritt seine Richtung bei und erhält seine Geschwindigkeit zurück:
rb.linearVelocity = rb.linearVelocity.normalized * 7f;Ein Ball, der auf 2 Einheiten pro Sekunde abgebremst wurde, fliegt im nächsten Schritt wieder mit 7.
Aufgabe
EinfachLass den Ball bei gleichbleibender Geschwindigkeit endlos abprallen.
- Erzeuge in
BallsAwake()einnew PhysicsMaterial("Bouncy")mit einem Rückprallwert von 1 und Reibungswerten von jeweils 0,bounceCombine = PhysicsMaterialCombine.MaximumundfrictionCombine = PhysicsMaterialCombine.Minimum; weise esGetComponent<Collider>().materialzu. - Füge
FixedUpdate()hinzu: Wenn der Ball gestartet wurde,rb.linearVelocity = rb.linearVelocity.normalized * speed;
Drücke auf „Spielen“ und starte den Ball: Er prallt von jeder Wand ab, ohne langsamer zu werden. Klicke dann auf „Prüfen“.
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;
}
}
Alle Lektionen in Unity-Spiel: Brick Breaker
Übe selbstständig: Unity-Playground