Kolizje i wyzwalacze kolizji

Przez kolizje w świecie wirtualnym rozumiemy interakcję co najmniej dwóch obiektów. Interakcja powstaje w wyniku osiągnięcia punktu przestrzeni 3D, będącego wspólnym dla ciał zderzających się.

Najprostszą kolizją jest zderzenie, na przykład obiektu z podłogą, ścianą itp. Drugim rodzajem kolizji jest wyzwalacz (Trigger) kolizji. Przykładem zastosowania wyzwalacza może być portal przenoszący do nowej sceny lub innego miejsca w bieżącej scenie.

Standardowo komponent kolizji (Collider) podpina się do dowolnego obiektu sceny z menu Component/ Physics. Silnik Unity daje możliwość wykorzystania kilku różnych typów colliderów związanych z kształtem obiektu: sześcian (Box), kula (Sphere), kapsuła (Capsule), koło (Wheel) lub siatka (Mesh).

W tej części zmodyfikujemy projekt z poprzedniego tematu (zobacz).

Cel: Do tworzonej sceny dodaj zabezpieczenie przez wypadnięciem poza podłogę. Podczas zderzeń kuli z kapsułą (i na odwrót) wymień tekstury pomiędzy obiektami. Dodaj obszar z wyzwalaczem powodującym podskok obiektu.

Niewidoczne ściany- granice sceny

Przy każdym boku podłogi dodamy puste obiekty (Create Empty), do których przypiszemy collider typu box

collider typu box Unity

Takich ścian kolizji tworzymy cztery.

wall collider box Unity

W celu przyspieszenia pracy ściany możemy powielić wybierając jak poniżej

duplicate Unity

Gotowy układ ścian przedstawia poniższy rysunek

kolizje Unity

Układ hierarchii obiektów sceny możemy uporządkować poprzez przeciągnięcie dodanych ścian do podłogi w zakładce okna sceny

collider kolizje Unity

Skompiluj scenę i sprawdź efekt działania. Zarówno kula jak i kapsuła nie wypadną poza podłogę. Te kolizje nie wymagały z naszej strony żadnego kodu. Są to podstawowe kolizje zderzeń

Przechwytywanie kolizji

Przechwytywanie kolizji możemy podzielić ze względu na użycie metody OnCollisonEnter, OnCollisonStay, OnCollisonExit, które odpowiednio rejestrują początek kolizji, trwanie kolizji, zakończenie kolizji. Od sytuacji, czy też problemu zależy, którą metodę wykorzystamy.

Tworzymy nowy skrypt o nazwie WymienKoszulke. Skrypt podpinamy do kapsuły. Patrz poniższa ilustracja.

OnCollisonEnter Unity

Wewnątrz skryptu usuwamy funkcje Start() oraz Update(). Odwołamy się do metody wykrycia momentu kolizji, czyli OnCollisonEnter. Funkcja ta jest wywoływana po każdym odświeżeniu sceny. My musimy sprawdzić czy kolizja występuje z obiektem o nazwie Sphere (taka została przypisana kuli w tworzonej scenie). Jeżeli stwierdzimy, że jest to żądany obiekt, to odczytujemy materiały z kolidujących obiektów i wykonujemy zamiany. Pełna zawartość skryptu

Wskazówka:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WymienKoszulke : MonoBehaviour
{
    private void OnCollisionEnter(Collision o)
    {
        if (o.gameObject.name == "Sphere")
        {
            Material materialNowy = o.gameObject.GetComponent<MeshRenderer>().material;
            Material materialStary = gameObject.GetComponent<MeshRenderer>().material;
            gameObject.GetComponent<Renderer>().material = materialNowy;
            o.gameObject.GetComponent<Renderer>().material = materialStary;
        }
    }
}

Skompiluj program i sprawdź efekt działania. Prawidłowo działający kod wykona podmianę materiałów. Patrz poniższa ilustracja.

MeshRenderer> material Unity

Wyzwalacz kolizji (trigger)

Zadaniem wyzwalacza kolizji będzie wystrzelenie w powietrze obiektu, który wejdzie w zdefiniowany obszar. Do sceny dodamy nowy obiekt (Cylinder) o wyróżnionej teksturze (utwórz nowy materiał). Z cylindra usuwamy Capsule Collider. Do obiektu przypiszemy pusty obiekt (Create Empty), do którego przypiszemy Box Collider. Patrz poniższy rysunek

trigger Unity

We właściwościach Box Collider ustawiamy użycie wyzwalacza (Is Trigger)

is trigger Unity

Tworzymy nowy skrypt o nazwie Wyrzutnia i dodajemy go do obiektu Wyrzutnia. Patrz poniższa ilustracja

wyrzutnia Unity

W skrypcie usuwamy funkcje Start() i Update() i inicjujemy funkcję OnTriggerEnter. Zawartość całego skryptu jest poniżej

Wskazówka:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Wyrzutnia : MonoBehaviour
{
    private void OnTriggerEnter(Collider o)
    {
        if (o.name == "Sphere" || o.name == "Capsule")
        {
            Debug.Log(o.name);
            Rigidbody rb = o.GetComponent<Rigidbody>();
            rb.AddForce(new Vector3(0,1000,0));
        }   
    }
}

Skompiluj program i sprawdź efekt działania. Zauważysz, że po najechaniu obiektu w obszar żółtego kręgu obiekt zostaje wystrzelony w górę.

OnTriggerEnter Collider Unity

Wyzwalacz działa tylko raz w momencie wejścia w kolizję. Jego zastosowania mogą być różne.

Układ okresowy- kod qr
Układ okresowy

Układ okresowy pierwiastków- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Alkomat- wirtualny test kod qr
Alkomat- wirtualny test

Alkomat- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Taklarz- olinowanie stałe kod qr
Olinowanie stałe- kalkulator średnic

Olinowanie stałe- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
przepis na gogfry

Przepis na gofry

zobacz
przepis na bitą śmietanę

Przepis na bitą śmietanę

zobacz