Menu
CoddyTech

Utrzymaj prędkość

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

Piłka w grze Brick Breaker nigdy nie zwalnia. Jej PhysicsMaterial wykonuje większość pracy: sprężystość 1 zachowuje całą prędkość po odbiciu, a tarcie 0 zapobiega spowalnianiu jej przez ściany. Ściany nie mają materiału, a Unity domyślnie uśrednia wartości obu zderzaków: 1 piłki i 0 ściany sprawiają, że piłka odbija się z połową prędkości. bounceCombine = Maximum i frictionCombine = Minimum sprawiają, że wygrywają wartości samej piłki.

Fizyka nadal nie jest idealnie dokładna: poruszająca się paletka dodaje swoją prędkość, a drobne błędy kumulują się przez setki odbić. Dlatego w każdym kroku fizyki kierunek piłki pozostaje bez zmian, a jej prędkość jest przywracana do poprzedniej wartości:

rb.linearVelocity = rb.linearVelocity.normalized * 7f;

Piłka, która zwolniła do 2 jednostek na sekundę, w następnym kroku znów porusza się z prędkością 7.

challenge icon

Wyzwanie

Łatwy

Spraw, by piłka odbijała się bez końca z jednakową prędkością.

  1. W Awake() klasy Ball utwórz new PhysicsMaterial("Bouncy") z wartością bounciness równą 1, obydwoma współczynnikami tarcia równymi 0, bounceCombine = PhysicsMaterialCombine.Maximum i frictionCombine = PhysicsMaterialCombine.Minimum; ustaw go w GetComponent<Collider>().material.
  2. Dodaj FixedUpdate(): jeśli piłka została wystrzelona, rb.linearVelocity = rb.linearVelocity.normalized * speed;

Naciśnij „Graj” i wystrzel piłkę: odbija się od każdej ściany, nie zwalniając. 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>();
    }

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

Wszystkie lekcje w sekcji Gra w Unity: Brick Breaker

Poćwicz samodzielnie: Edytor online Unity