Menu
CoddyTech

OnCollisionEnter

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

Gdy dwa obiekty kolizyjne zaczynają się stykać, Unity wywołuje OnCollisionEnter(Collision collision) w skryptach obu obiektów. Jest wywoływana raz, w kroku fizyki, w którym zaczyna się kontakt, i nie jest wywoływana ponownie, gdy obiekty pozostają w kontakcie. Aby w ogóle doszło do zderzenia, co najmniej jeden z tych obiektów musi mieć Rigidbody, którym porusza fizyka: ściana i podłoga bez Rigidbody nigdy nie przekazują sobie żadnych informacji.

Ta skrzynia zapisuje w logu informację o lądowaniu. Ma Rigidbody, więc spada, a komunikat pojawia się w kroku, w którym zetknie się z podłogą:

void OnCollisionEnter(Collision collision)
{
    Debug.Log("Thud!");
}

Skrzynia zapisuje informację w logu raz i ponownie dopiero wtedy, gdy oderwie się od podłogi i wyląduje po raz drugi. Podłoga również otrzymuje komunikat: skrypt na niej wykryłby lądowanie skrzyni, mimo że podłoga nie ma Rigidbody. Nazwa i parametr muszą być dokładne. Metoda o nazwie onCollisionEnter nigdy nie jest wywoływana i nie pojawia się żaden błąd. Jeśli metoda przyjmuje Collider, Unity zapisuje w logu Script error: OnCollisionEnter z komunikatem This message parameter has to be of type: Collision i ignoruje ją. Gdy obiekty pozostają w kontakcie, Unity wywołuje OnCollisionStay w każdym kroku fizyki, a gdy się rozdzielą, wywołuje OnCollisionExit jeden raz.

challenge icon

Wyzwanie

Łatwy

Płyta naciskowa zlicza to, co na niej ląduje.

  1. Dodaj pole private int presses; do PressurePlate.
  2. Dodaj void OnCollisionEnter(Collision collision): zwiększ presses o 1 i zaloguj "Pressed " + presses.

Naciśnij „Graj”: skrzynia ląduje, a w konsoli pojawia się raz komunikat Pressed 1. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;

public class PressurePlate : MonoBehaviour
{
    // Zliczaj każde lądowanie i zapisuj je w logu: Pressed 1, Pressed 2, ...
}

Wszystkie lekcje w sekcji Fizyka i rozgrywka

Poćwicz samodzielnie: Edytor online Unity