Menu
CoddyTech

Breiter Schläger

Lektion 16 von 19 im Kurs Unity-Spiel: Brick Breaker von Coddy.

Ein zeitlich begrenzter Effekt ist eine Coroutine: ändern, warten, zurückändern. Wird ein zweites Objekt gefangen, während der erste Effekt noch läuft, muss die Zeit neu beginnen. Behalte also die Coroutine, die StartCoroutine zurückgibt, und stoppe sie, bevor du eine neue startest. Andernfalls endet der erste Effekt vorzeitig und macht den zweiten rückgängig. Eine Geschwindigkeitssteigerung:

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;
}

Die Geschwindigkeit wird ausgehend von normalSpeed festgelegt, das einmalig gespeichert wird, statt die aktuelle Geschwindigkeit zu verdoppeln: Zwei Geschwindigkeitssteigerungen hintereinander würden sie sonst auf das Vierfache erhöhen. Die Begrenzung des Schlägers berücksichtigt bei jedem Schritt seine Breite, sodass auch ein breiter Schläger an den Wänden anhält.

challenge icon

Aufgabe

Schwer

Ein „Wide“-Power-up macht das Paddle 8 Sekunden lang breiter.

  1. Füge in Paddle public float wideFactor = 1.6f; und public float wideSeconds = 8f; hinzu und speichere in Awake die normale x-Skalierung.
  2. Widen() stoppt eine laufende Coroutine, falls vorhanden, und startet eine: x-Skalierung auf das wideFactor-Fache der normalen setzen, wideSeconds warten und wieder auf normal setzen.
  3. Die Coroutine benötigt using System.Collections;.

Klicke auf „Spielen“ und fange ein grünes Power-up: Das Paddle wird größer und schrumpft dann wieder auf seine ursprüngliche Größe. Klicke danach auf „Prüfen“.

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);
    }

    public void Widen()
    {
        Debug.Log("Wide paddle");
    }
}

Alle Lektionen in Unity-Spiel: Brick Breaker

Übe selbstständig: Unity-Playground