Breiteres Paddle
Lektion 14 von 16 im Kurs Unity-Spiel: Brick Breaker von Coddy.
Ein Wide-Power-up, das mit dem Schläger aufgefangen wird, macht ihn für einige Sekunden breiter. Das Power-up erkennt das Auffangen: Sein Trigger-Collider berührt den Collider des Schlägers, und beide Körper sind kinematisch, was für OnTriggerEnter ausreicht. Auf dem Weg nach unten fällt es auch durch den Ball hindurch, deshalb prüft es das Tag. Ein Enum mit den Arten, das pro Prefab im Inspector festgelegt wird, unterscheidet die Power-ups voneinander.
Ein zeitlich begrenzter Effekt ist eine Coroutine: ändern, warten, zurückändern. Wird das Power-up erneut aufgefangen, während der erste Effekt noch läuft, muss die Zeit von vorn beginnen. Bewahre also die Coroutine auf, die StartCoroutine zurückgibt, und stoppe sie, bevor du eine neue startest. Andernfalls endet die erste zu früh und macht die zweite rückgängig. Ein Geschwindigkeitsschub:
Coroutine boost;
public void Boost()
{
if (boost != null) StopCoroutine(boost);
boost = StartCoroutine(BoostFor(3f));
}
IEnumerator BoostFor(float seconds)
{
speed = normalSpeed * 2f;
yield return new WaitForSeconds(seconds);
speed = normalSpeed;
boost = null;
}Der Schub setzt die Geschwindigkeit anhand von normalSpeed, das einmal gespeichert wurde, statt die aktuelle Geschwindigkeit zu verdoppeln und später zu halbieren: Zwei Schübe hintereinander würden sie auf das Vierfache erhöhen. Die Begrenzung des Schlägers liest seine Breite ohnehin bei jedem Schritt aus, sodass ein breiter Schläger weiterhin an den Wänden stoppt.
Aufgabe
Schwer- Füge in
PowerUppublic enum Kind { Wide, Multiball }undpublic Kind kindhinzu (jedem Prefab wird sein Typ zugewiesen). FügeOnTriggerEnterhinzu: Wenn das Power-up das mitPaddlegetaggte Objekt berührt, ruft ein Wide-Power-upWiden()imPaddle-Skript dieses Objekts auf, und beide Typen zerstören das Power-up. - Füge in
Paddlepublic float wideFactor = 1.6fundpublic float wideSeconds = 8fhinzu und merke dir inAwake()die normale Breite des Schlägers, also seine x-Skalierung. - Schreibe
public void Widen(): Die Methode startet eine Coroutine, die die x-Skalierung des Schlägers auf daswideFactor-Fache der normalen Breite setzt,wideSecondswartet und anschließend die normale Breite wiederherstellt. Wird der Schläger während der Verbreiterung erneut getroffen, beginnt die Zeit von vorn.
Ein Multiball-Power-up wird aufgenommen und bewirkt vorerst nichts.
Drücke Play, nimm ein grünes Power-up auf und klicke dann auf Check.
Probier es selbst
using UnityEngine;
using UnityEngine.InputSystem;
public class Paddle : MonoBehaviour
{
public float speed = 14f;
public float wallX = 8f; // Die Innenseiten der Seitenwände liegen bei -wallX und wallX
Rigidbody rb;
void Awake()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
float input = 0f;
if (Keyboard.current.leftArrowKey.isPressed || Keyboard.current.aKey.isPressed) input -= 1f;
if (Keyboard.current.rightArrowKey.isPressed || Keyboard.current.dKey.isPressed) input += 1f;
Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime;
float halfWidth = transform.localScale.x / 2f;
target.x = Mathf.Clamp(target.x, -wallX + halfWidth, wallX - halfWidth);
rb.MovePosition(target);
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.