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.
Wyzwanie
ŁatwyW Ball:
- W
Awake()utwórznew PhysicsMaterial("Bouncy")z wartością bounciness równą 1, dynamicznym i statycznym tarciem równym 0, ustawbounceCombinena Maximum ifrictionCombinena Minimum, a następnie przypisz go do collidera piłki za pomocąGetComponent<Collider>().material. - Dodaj
FixedUpdate(): gdy piłka jest wystrzelona, ustaw jejlinearVelocityna jej bieżący kierunek pomnożony przezspeed.
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;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.