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
Takich ścian kolizji tworzymy cztery.
W celu przyspieszenia pracy ściany możemy powielić wybierając jak poniżej
Gotowy układ ścian przedstawia poniższy rysunek
Układ hierarchii obiektów sceny możemy uporządkować poprzez przeciągnięcie dodanych ścian do podłogi w zakładce okna sceny
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.
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.
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
We właściwościach Box Collider ustawiamy użycie wyzwalacza (Is Trigger)
Tworzymy nowy skrypt o nazwie Wyrzutnia i dodajemy go do obiektu Wyrzutnia. Patrz poniższa ilustracja
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ę.
Wyzwalacz działa tylko raz w momencie wejścia w kolizję. Jego zastosowania mogą być różne.