Menu
CoddyTech

Rozbijanie przy zderzeniu

Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 10 z 71.

Jak silne było uderzenie? collision.relativeVelocity określa, jak szybko dwa obiekty zbliżały się do siebie w chwili zderzenia, a jego magnitude to prędkość uderzenia w m/s. Jest to różnica prędkości: samochód jadący z prędkością 10 m/s, który uderza w samochód jadący w tym samym kierunku z prędkością 8 m/s, uderza z prędkością zaledwie 2 m/s i oba samochody odnotowują tę samą prędkość uderzenia.

To jajko pęka, gdy uderza o podłoże z prędkością większą niż crackSpeed. Upuszczone z wysokości 1 m uderza z prędkością około 4.4 m/s (pierwiastek kwadratowy z 2 x 9.81 x 1), a z wysokości 2 m — około 6.3 m/s:

public float crackSpeed = 5f;

void OnCollisionEnter(Collision collision)
{
    if (collision.relativeVelocity.magnitude > crackSpeed)
    {
        Debug.Log("Splat!");
        Destroy(gameObject);
    }
}

Dlaczego nie użyć własnego rb.linearVelocity jajka? Do czasu wywołania OnCollisionEnter fizyka zdążyła już obsłużyć uderzenie, więc prędkość jajka to prędkość pozostała po uderzeniu, bliska zeru. relativeVelocity zachowuje prędkość samego uderzenia. To prędkość, więc masa nie ma znaczenia: ciężkie i lekkie jajko lądujące z prędkością 6 m/s odnotują tę samą wartość 6.

challenge icon

Wyzwanie

Łatwy

Napisz Window.cs: każde uderzenie osłabia okno, a przy wartości 0 okno się rozbija.

  1. W metodzie OnCollisionEnter okna odejmij collision.relativeVelocity.magnitude od strength.
  2. Gdy strength <= 0f, wywołaj Destroy(gameObject);.

Naciśnij „Graj”, tocz miękkie kule strzałką w górę, a potem mocną kulę klawiszem spacji: okno się rozbije. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;

public class Window : MonoBehaviour
{
    public float strength = 10f;

    // Każde uderzenie zmniejsza strength o prędkość uderzenia; gdy strength spadnie do 0, szyba się rozbije
}

Wszystkie lekcje w sekcji Fizyka i rozgrywka

Poćwicz samodzielnie: Edytor online Unity