Menu
CoddyTech

Mit dem Schläger zielen

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

Bei einem perfekten Abprall kann der Spieler nicht zielen: Der Ball verlässt den Schläger in dem Winkel, in dem er aufgetroffen ist. Bei Brick-Breaker-Spielen bestimmt stattdessen der Schläger die Richtung. Ein Treffer nahe dem linken Ende schickt den Ball nach oben und links, ein Treffer in der Mitte schickt ihn gerade nach oben, und je weiter der Treffer von der Mitte entfernt ist, desto größer ist der Winkel.

Wandle den Treffer in eine Zahl zwischen -1 am linken Ende und 1 am rechten Ende um: den x-Versatz des Balls von der Mitte des Schlägers, geteilt durch die halbe Breite des Schlägers. Angenommen, der Schläger ist 4 Einheiten breit, seine Mitte liegt bei x = 2 und der Ball trifft bei x = 3. Der Versatz beträgt 1, die halbe Breite beträgt 2, also ist die Zahl 0.5 und die neue Richtung ist 0.5 nach rechts und 1 nach oben, also (0.5, 1, 0), normiert. Ein Treffer genau am Ende ergibt 1 oder -1, was einem Winkel von 45 Grad zur geraden Aufwärtsrichtung entspricht. Begrenze die Zahl auf diesen Bereich, denn der Ball kann die Ecke des Schlägers etwas über das Ende hinaus berühren.

Die Methode des Balls OnCollisionEnter wird ausgeführt, nachdem die Physik den Abprall berechnet hat. Eine dort festgelegte Geschwindigkeit ersetzt ihn also. Wände senden dieselbe Nachricht und sollen ihren normalen Abprall beibehalten, prüfe also zuerst, was getroffen wurde. collision.collider.bounds ist der Bereich, den der Collider in der Welt ausfüllt, einschließlich Skalierung:

void OnCollisionEnter(Collision collision)
{
    Bounds box = collision.collider.bounds;
    Debug.Log(collision.gameObject.name + " is " + box.size.x + " wide, centered at x = " + box.center.x);
}
challenge icon

Aufgabe

Einfach

Füge OnCollisionEnter(Collision collision) zu Ball hinzu:

  1. Tu nichts, wenn das getroffene Objekt nicht mit Paddle getaggt ist.
  2. Berechne x: die x-Position des Balls minus die x-Position des Paddles, geteilt durch die halbe Breite des Paddles (collision.collider.bounds.size.x), begrenzt auf den Bereich von -1 bis 1.
  3. Setze die Geschwindigkeit des Rigidbody auf new Vector3(x, 1f, 0f), normalisiert und multipliziert mit speed.

Drücke Play, fange den Ball nahe jedem Ende des Paddles und klicke dann auf Check.

Probier es selbst

using UnityEngine;
using UnityEngine.InputSystem;

public class Ball : MonoBehaviour
{
    public Transform paddle;
    public float speed = 9f;

    Rigidbody rb;
    bool launched;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
        PhysicsMaterial bouncy = new PhysicsMaterial("Bouncy");
        bouncy.bounciness = 1f;
        bouncy.dynamicFriction = 0f;
        bouncy.staticFriction = 0f;
        bouncy.bounceCombine = PhysicsMaterialCombine.Maximum;
        bouncy.frictionCombine = PhysicsMaterialCombine.Minimum;
        GetComponent<Collider>().material = bouncy;
    }

    void Update()
    {
        if (launched) return;
        transform.position = paddle.position + Vector3.up * 0.5f;
        if (Keyboard.current.spaceKey.wasPressedThisFrame) Launch(new Vector3(0.3f, 1f, 0f));
    }

    public void Launch(Vector3 direction)
    {
        launched = true;
        rb.linearVelocity = direction.normalized * speed;
    }

    void FixedUpdate()
    {
        if (!launched) return;
        rb.linearVelocity = rb.linearVelocity.normalized * speed;
    }
}
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