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.
Aufgabe
SchwerEin „Wide“-Power-up macht das Paddle 8 Sekunden lang breiter.
- Füge in
Paddlepublic float wideFactor = 1.6f;undpublic float wideSeconds = 8f;hinzu und speichere in Awake die normale x-Skalierung. - Widen() stoppt eine laufende Coroutine, falls vorhanden, und startet eine: x-Skalierung auf das
wideFactor-Fache der normalen setzen,wideSecondswarten und wieder auf normal setzen. - 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