Menu
CoddyTech

Mit dem Schläger zielen

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

Bei einem perfekten Abprall kann der Spieler nicht zielen. In Brick-Breaker-Spielen bestimmt 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.

Wandle den Treffer in eine Zahl von -1 am linken Ende bis 1 am rechten um: den x-Abstand des Balls von der Mitte des Schlägers, geteilt durch die halbe Breite des Schlägers. Ein Schläger mit einer Breite von 4, dessen Mitte bei x 2 liegt, wird bei x 3 getroffen: Der Abstand beträgt 1, die halbe Breite beträgt 2, also ist die Zahl 0.5 und der Ball fliegt entlang (0.5, 1, 0), normalisiert. Begrenze den Wert, da der Ball eine Ecke etwas über das Ende hinaus berühren kann.

OnCollisionEnter wird ausgeführt, nachdem die Physik den Abprall berechnet hat, daher ersetzt eine dort festgelegte Geschwindigkeit den Abprall. Auch Wände schicken den Ball zurück und behalten ihren normalen Abprall bei, prüfe also zuerst das Tag. collision.collider.bounds.size.x ist die Breite des Schlägers in der Spielwelt.

challenge icon

Aufgabe

Einfach

Richte den Ball mit dem Schläger aus: Wo er landet, bestimmt den Winkel.

  1. Füge in Ball OnCollisionEnter(Collision collision) hinzu; kehre zurück, wenn das getroffene Objekt nicht mit Paddle getaggt ist.
  2. Berechne float x: die x-Koordinate des Balls minus die x-Koordinate des Schlägers, geteilt durch die Hälfte von collision.collider.bounds.size.x und auf einen Wert zwischen -1 und 1 begrenzt.
  3. Setze rb.linearVelocity = new Vector3(x, 1f, 0f).normalized * speed;

Drücke „Spielen“ und fange den Ball am linken Ende des Schlägers: Er fliegt nach links weg. Klicke dann auf „Prüfen“.

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

Alle Lektionen in Unity-Spiel: Brick Breaker

Übe selbstständig: Unity-Playground