Menu
CoddyTech

Utrzymaj prędkość

Lekcja 3 z 16 w kursie Gra w Unity: Zbijanie klocków w Coddy.

Piłka w grze Brick Breaker nigdy nie zwalnia. Większość pracy wykonuje jej PhysicsMaterial: sprężystość 1 zachowuje całą prędkość odbicia, a tarcie 0 zapobiega szarpaniu lub obracaniu piłki przez ściany. Ściany i cegły nie mają własnego materiału, a Unity łączy wartości obu colliderów, domyślnie za pomocą Average: 1 piłki i domyślne 0 ściany sprawiają, że odbicie odbywa się z połową prędkości. bounceCombine = Maximum i frictionCombine = Minimum sprawiają, że własne wartości piłki wygrywają z wartościami obiektów, w które uderza.

Fizyka nadal nie jest dokładna: poruszająca się platforma dodaje własną prędkość do odbicia, dwie piłki odpychają się nawzajem, a drobne błędy kumulują się przez setki odbić. Dlatego przy każdym FixedUpdate piłka zachowuje swój kierunek, a jej prędkość jest przywracana. W komponencie Rigidbody piłki w Inspectorze zaznaczona jest też opcja Freeze Position Z, która utrzymuje ją w płaszczyźnie gry.

Inna gra wymaga innej reguły. Krążek do hokeja na lodzie może zwalniać, ale nigdy nie przekroczy określonego limitu prędkości, a Vector3.ClampMagnitude skraca zbyt długi wektor, pozostawiając krótszy bez zmian:

void FixedUpdate()
{
    rb.linearVelocity = Vector3.ClampMagnitude(rb.linearVelocity, maxSpeed);
}

Samo ograniczenie prędkości nie wystarczy w przypadku piłki: jeśli jej prędkość spadnie do 2 jednostek na sekundę, pozostanie na poziomie 2. Trzeba ustawić jej prędkość dokładnie na zadaną wartość, zgodnie z jej kierunkiem.

challenge icon

Wyzwanie

Łatwy

W Ball:

  1. W Awake() utwórz new PhysicsMaterial("Bouncy") z wartością bounciness równą 1, dynamicznym i statycznym tarciem równym 0, ustaw bounceCombine na Maximum i frictionCombine na Minimum, a następnie przypisz go do collidera piłki za pomocą GetComponent<Collider>().material.
  2. Dodaj FixedUpdate(): gdy piłka jest wystrzelona, ustaw jej linearVelocity na jej bieżący kierunek pomnożony przez speed.

W Unity możesz też utworzyć materiał jako zasób (Create > Physics Material) i przeciągnąć go do pola Material komponentu Sphere Collider; tutaj tworzy go skrypt.

Naciśnij Play, wystrzel piłkę i obserwuj, jak się odbija, a następnie kliknij Check.

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

    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;
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Gra w Unity: Zbijanie klocków