Menu
CoddyTech

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.

challenge icon

Aufgabe

Schwer
  1. Füge in PowerUp public enum Kind { Wide, Multiball } und public Kind kind hinzu (jedem Prefab wird sein Typ zugewiesen). Füge OnTriggerEnter hinzu: Wenn das Power-up das mit Paddle getaggte Objekt berührt, ruft ein Wide-Power-up Widen() im Paddle-Skript dieses Objekts auf, und beide Typen zerstören das Power-up.
  2. Füge in Paddle public float wideFactor = 1.6f und public float wideSeconds = 8f hinzu und merke dir in Awake() die normale Breite des Schlägers, also seine x-Skalierung.
  3. Schreibe public void Widen(): Die Methode startet eine Coroutine, die die x-Skalierung des Schlägers auf das wideFactor-Fache der normalen Breite setzt, wideSeconds wartet 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);
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Unity-Spiel: Brick Breaker