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.
Wyzwanie
ŁatwyCeluj piłką za pomocą paletki: miejsce jej lądowania wyznacza kąt.
- W klasie
BalldodajOnCollisionEnter(Collision collision); zakończ działanie metody, jeśli trafiony obiekt nie ma taguPaddle. - Oblicz
float x: odejmij pozycję x paletki od pozycji x piłki, podziel wynik przez połowę wartościcollision.collider.bounds.size.xi ogranicz go do zakresu od -1 do 1. - 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