Menu
CoddyTech

Fang ein Power-up

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

Ein Power-up erkennt das Auffangen selbst: Sein Trigger-Collider berührt den Collider des Schlägers, und beide Körper sind kinematisch. Das reicht für OnTriggerEnter. Es fällt auch am Ball vorbei, deshalb prüft es zuerst den Tag.

Ein Enum benennt die Arten, und jedes Prefab legt seine eigene Art im Inspector fest, sodass ein Skript für beide genügt:

public enum Kind { Wide, Multiball }
public Kind kind;

if (kind == Kind.Multiball) Debug.Log("Three balls");

other.GetComponent<Paddle>() findet das Paddle-Skript auf dem Objekt, das das Power-up berührt hat. „Wide“ gibt vorerst nur eine Meldung aus; in der nächsten Lektion wird der Schläger vergrößert.

challenge icon

Aufgabe

Schwer

Fange mit dem Schläger ein fallendes Power-up.

  1. Füge in PowerUp public enum Kind { Wide, Multiball } und public Kind kind; hinzu (jedes Prefab legt seinen Typ fest).
  2. Füge OnTriggerEnter(Collider other) hinzu: Kehre zurück, sofern other.CompareTag("Paddle") nicht zutrifft; ein breites Power-up ruft other.GetComponent<Paddle>().Widen(); auf, danach Destroy(gameObject);
  3. Füge in Paddle public void Widen() hinzu, das vorerst Wide paddle protokolliert.

Drücke auf „Spielen“ und fange ein grünes Power-up: Es verschwindet und die Konsole zeigt Wide paddle an. Drücke anschließend 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);
    }
}

Alle Lektionen in Unity-Spiel: Brick Breaker

Übe selbstständig: Unity-Playground