Menu
CoddyTech

Celuj paletką

Lekcja 4 z 19 w kursie Gra w Unity: Brick Breaker w Coddy.

Przy idealnym odbiciu gracz nie może celować. W grach typu Brick Breaker kierunek zależy od położenia paletki: uderzenie blisko lewego końca posyła piłkę w górę i w lewo, a uderzenie na środku — prosto w górę.

Przekształć miejsce uderzenia w liczbę od -1 na lewym końcu do 1 na prawym: odległość piłki od środka paletki wzdłuż osi x podziel przez połowę szerokości paletki. Paletka o szerokości 4, wyśrodkowana w punkcie x 2, uderzona w punkcie x 3: odległość wynosi 1, połowa szerokości wynosi 2, więc liczba to 0.5, a piłka wylatuje w kierunku (0.5, 1, 0), po normalizacji. Ogranicz tę wartość, ponieważ piłka może dotknąć narożnika nieco poza końcem paletki.

OnCollisionEnter wykonuje się po obliczeniu przez fizykę odbicia, więc ustawiona tam prędkość zastępuje obliczoną. Ściany również odbijają piłkę, zachowując zwykłe odbicie, więc najpierw sprawdź tag. collision.collider.bounds.size.x to szerokość paletki w świecie.

challenge icon

Wyzwanie

Łatwy

Celuj piłką za pomocą paletki: miejsce jej lądowania wyznacza kąt.

  1. W klasie Ball dodaj OnCollisionEnter(Collision collision); zakończ działanie metody, jeśli trafiony obiekt nie ma tagu Paddle.
  2. Oblicz float x: odejmij pozycję x paletki od pozycji x piłki, podziel wynik przez połowę wartości collision.collider.bounds.size.x i ogranicz go do zakresu od -1 do 1.
  3. Ustaw rb.linearVelocity = new Vector3(x, 1f, 0f).normalized * speed;

Naciśnij „Graj” i odbij piłkę lewym końcem paletki: poleci w lewo. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

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

Wszystkie lekcje w sekcji Gra w Unity: Brick Breaker

Poćwicz samodzielnie: Edytor online Unity