Typy kolizji
Kolizje w Unreal Engine są podobne do tych w Unity, ale istnieją między nimi pewne różnice, które omówiono poniżej. Jeśli masz doświadczenie w korzystaniu z wykrywania kolizji opartego na warstwach w silniku Unity, to ustawienia kolizji projektu powinny wyglądać podobnie do macierzy kolizji. Dostęp do nich można uzyskać, wybierając kolejno Edit (Edytuj) > Project Settings (Ustawienia projektu) > Collision (Kolizja). Po rozwinięciu karty Preset (Ustawienie wstępne) zobaczysz wszystkie domyślne profile wstępnie skonfigurowane wraz z opisem ich działania.
Zauważysz, że Unreal oferuje kilka dodatkowych opcji rozwiązywania kolizji. Są one szczegółowo omówione w sekcji Unreal Engine Collision Overview (Kolizje w Unreal Engine – omówienie). Ten poziom szczegółowości wykrywania kolizji jest przydatny i może poprawić wydajność gry. Ważne uwagi:
Kanały lub poszczególne obiekty kolizyjne można ustawić na blokowanie, nakładanie się lub ignorowanie.
Częstym błędem jest brak zaznaczenie pola wyboru Generate Overlap Events (Wygeneruj zdarzenia nakładania się) na obiektach kolizyjnych, gdy potrzebujesz tych zdarzeń.
Geometria statyczna powinna blokować i nakładać się na siebie, ale niekoniecznie powodować nakładanie się lub zdarzenia trafienia, ponieważ nie jest to wymagane do rozgrywki.
Zdarzenia nakładania się mogą być generowane nawet wtedy, gdy jeden obiekt blokuje inny – szczególnie podczas poruszania się z dużą szybkością. W Unity może to stanowić problem, jeśli bezpośrednio modyfikujesz translację zamiast komponentu Rigidbody. Takie postępowanie pomija kwestie fizyki.
W Unreal, po wywołaniu dowolnej funkcji aktualizującej przekształcenie aktora, dostępne są dwa parametry logiczne, które określają sposób przemieszczania się aktora:
Sweep ustawiony na true powoduje nakładanie się obiektów i zatrzymanie aktora przed osiągnięciem miejsca docelowego, jeśli zostanie zablokowany. Teleport określa, czy prędkość fizyki zostanie zachowana.
Kanały mogą być również używane do śledzenia, które jest odpowiednikiem physics cast (rzut fizyczny) w Unity (tj. Raycast, SphereCast itp.). Możesz przekazać kanał podczas wywołania funkcji Line Trace (śledzenie linii) w taki sam sposób, jak przekazuje się maskę warstwy w Raycast w Unity.
Niestandardowe typy kolizji w Parrot
Parrot ma kilka niestandardowych konfiguracji kanałów obiektów kolizji: Player (gracz), Cannonball (kula armatnia) i Enemy (przeciwnik).
Dodając te typy obiektów, Parrot może precyzyjnie kontrolować sposób interakcji kanałów obiektów z kanałami śledzenia w momencie wystąpienia kolizji w świecie. Domyślna reakcja jest ustawiona dla typowych sytuacji, ale można ją dostosować do własnych potrzeb. Parrot ma też kilka niestandardowych ustawień wstępnych kanałów śledzenia: Player (gracz), OverlapAllPlayers, BlockAllPlayers, Cannonball (kula armatnia) i Enemy (przeciwnik).
Te ustawienia wstępne są szczególnie przydatne w przypadku wyzwalaczy rozgrywki. Na przykład OverlapAllPlayers może ignorować wszystkie inne kolizje i reagować tylko na zdarzenia kolizji z typami obiektów kolizji gracza. Jeśli przyjrzysz się ustawieniom kolizji dla różnych siatek w grze, zobaczysz, że te ustawienia wstępne są często używane.
W razie potrzeby ustawienia kolizji można również dostosować dla poszczególnych siatek.
Granice świata
Podczas tworzenia poziomów należy zwrócić uwagę na opcję World Bounds (Granice świata). Można ją ustawić, wybierając World Settings (Ustawienia świata) > World (Świat). Można zaimplementować niestandardowy typ obrażeń dla sytuacji, w których aktor wchodzi w interakcję z tymi zdefiniowanymi granicami świata. Granice w Parrot wykorzystują kombinację ustawienia świata KillZ i woluminy wyzwalania Out of Bounds (Poza granicami).
Woluminy wyzwalania
Unreal Engine posiada wbudowanych aktorów woluminu wyzwalania (zobacz Aktorzy woluminu wyzwalania w Unreal Engine), którzy mogą być używani do wyzwalania zdarzeń. Przykłady wykorzystania tej funkcji przez deweloperów w grze Parrot to woluminy wyzwalania Out Of Bounds (Poza granicami) i Finish Line (Linia mety). Woluminy wyzwalania są często używane w połączeniu z blueprintem poziomu (zobacz dokument dla deweloperów Blueprinty poziomów w Parrot), ale nie jest to konieczne. Wyzwalacz Parrot dla Out Of Bounds (Poza granicami) to wyzwalacz o kształcie prostopadłościanu z prostym wykresem zdarzeń:
Jeśli przyjrzysz się ustawieniom kolizji aktora w panelu Details (Szczegóły), zobaczysz, że większość pracy wykonuje tutaj ustawienie wstępne kanału kolizji.
Wzmocnienie do podniesienia
Przyjrzyjmy się praktycznemu przykładowi systemu kolizji z implementacją wzmocnienia do podniesienia w Parrot. Po otwarciu BP_PickupBase w sekcji Content (Zawartość) > Blueprints (Blueprinty) > Pickups (Przedmioty do podnoszenia) i spojrzeniu na okno podglądu można zobaczyć hierarchię zawierającą komponent kolizji.
Ustawienia kolizji i Out of Bounds (Poza granicami) mają wstępnie ustawiony wyzwalacz, który generuje zdarzenia nakładania się z graczami:
Jeśli spojrzysz na graf zdarzeń, zobaczysz zdarzenie ActorBeginOverlap z parametrem Other Actor (Inny aktor). To zdarzenie działa podobnie jak OnCollisionEnter w Unity. Różnica polega na tym, że zamiast komponentu obiektu kolizyjnego przekazywany jest sam aktor.
Parrot sprawdza, czy aktor jest graczem, który się nakłada. Następnie wywoływane jest zdarzenie OnPickedUp. Dzięki temu klasy pochodne blueprintów mogą zdefiniować własne zachowanie dla zdarzenia OnPickedUp, podczas gdy klasa bazowa obsługuje samo zdarzenie nakładania się aktora.
Deweloperzy używają bazowego blueprintu, aby wszystkie przedmioty do podniesienia odtwarzały dźwięk i spawnowały efekty cząsteczkowe. Zmienne dźwięku podnoszenia i efektu cząsteczkowego można edytować w instancji, dzięki czemu można je ustawić w domyślnych ustawieniach klas pochodnych. Domyślne ustawienia klasy znajdują się w edytorze Blueprint, u góry obok przycisku kompilacji:
Przykładem zmiany domyślnych ustawień klasy jest przyspieszenie do podniesienia, które wykorzystuje system Niagra z zielonymi cząsteczkami (w przeciwieństwie do serca do podniesienia, które wykorzystuje cząsteczki różowe). Podobnie, sama siatka przedmiotu do podniesienia może być ustawiona w pochodnych blueprintach. Ostatnim krokiem w logice nakładania się jest zniszczenie aktora przedmiotu do podniesienia, ponieważ nie chcemy, aby pozostawał on po podniesieniu przedmiotu przez gracza.
Przy użyciu zaledwie kilku węzłów można stworzyć solidną logikę, którą można z łatwością rozszerzyć na pochodne blueprinty. Wszystkie pochodne blueprinty wynikają ze zdarzenia nakładania się powiązanego z aktorem.
Postać gracza zeskakująca z przeciwnika
Kolejnym świetnym przykładem jest gracz zeskakujący z przeciwnika. Typ obiektu kolizyjnego w kształcie kapsuły przeciwnika to „wróg” i będzie zderzał się z obiektami typu gracz. Przeciwnicy z mieczami mają również podobne zdarzenie nakładania się. Są one powszechnie nazywane polami trafień i są miejscami, w których atak jest skuteczny.
Ale co robi gra Parrot, gdy gracz chce zeskoczyć z przeciwnika? Rozwiązaniem było umieszczenie pola obrażeń na głowach przeciwników. Kiedy gracz nakłada się na wolumin pola obrażeń, postać gracza może wykonać serię sprawdzeń, aby ustalić, czy skok jest prawidłowy, na podstawie położenia postaci, położenia pola obrażeń i jego rozmiarów. Jeśli sprawdzenia zakończą się pomyślnie, gracz może wykonać skok i zadać obrażenia przeciwnikowi. Ciężką pracę ponownie wykonują kanały kolizji, filtrując tylko te nałożenia, które interesują Parrot – obiekt kolizji gracza i przeciwnika w obszarze pola obrażeń.