W grach RPG często spotykamy się ze scenami, gdzie dziesiątki, a czasem setki postaci niezależnych (NPC) wędrują po świecie. Jeśli każda z nich ma płynnie omijać przeszkody i dotrzeć do celu, potrzebujemy efektywnego systemu nawigacji. W Unity narzędziem do tego jest NavMesh. Jednak przy dużej liczbie jednostek, niewłaściwa konfiguracja NavMesh i użycie NavMesh Agentów może szybko zabić wydajność.
1. Generowanie NavMesh: klucz do wydajności
Pierwszy krok to odpowiednie upieczenie (Baking) siatki nawigacyjnej. Im bardziej złożony i szczegółowy NavMesh, tym więcej pamięci zajmie i tym dłużej będą trwały obliczenia ścieżek.
Porady dotyczące Bakiowania NavMesh:
-
Agent Radius: Ustaw minimalną wartość. Zbyt duża sprawi, że NavMesh będzie miał „dziury” w wąskich przejściach.
-
Agent Height: Ważne dla skakania czy przechodzenia pod nisko wiszącymi elementami.
-
Max Slope/Step Height: Zdefiniuj, jakie zbocza i stopnie mogą pokonywać Twoje postacie. Zbyt duże wartości mogą generować niepotrzebnie skomplikowaną siatkę.
-
Exclusion Areas: Wykorzystuj
NavMeshObstaclelub ręcznie wykluczaj regiony, do których AI nigdy nie powinno się dostać (np. obszary niedostępne dla gracza).
2. NavMesh Agents: kiedy i jak ich używać?
NavMeshAgent to komponent Unity, który zajmuje się całą logiką poruszania się po NavMesh.
Częste błędy i ich rozwiązania:
-
Update()co klatkę: DomyślnieNavMeshAgentmoże próbować przeliczyć ścieżkę co klatkę, nawet jeśli cel się nie zmienił lub jest poza zasięgiem.-
Rozwiązanie: Nie ustawiaj celu (
SetDestination) co klatkę. Ustaw go tylko wtedy, gdy cel się zmienił lub agent dotarł do aktualnego. Sprawdzajagent.remainingDistance < agent.stoppingDistancelubagent.hasPath == false.
-
-
Unikanie kolizji (Obstacle Avoidance): Domyślne algorytmy unikania kolizji są kosztowne. Przy dużej liczbie agentów mogą powodować zacięcia.
-
Rozwiązanie: Zmniejsz
Qualityunikania kolizji wNavMeshAgent(np. naLowQuality). Dla tła możesz wyłączyć kolizje (NoObstacleAvoidance). Alternatywnie, zastosuj proste zasady omijania przeszkód za pomocą Raycastów zamiast pełnego NavMesh Obstacle.
-
-
Zbyt częste przeliczanie ścieżek: Dla AI tła (np. spacerujący po mieście NPC) nie ma potrzeby, aby co chwilę szukał najkrótszej drogi.
-
Rozwiązanie: Wprowadź opóźnienie w obliczeniach ścieżek (np. co 0.5-1 sekundy).
-
3. Dynamiczny NavMesh i przeszkody
Co jeśli scena się zmienia? Drzwi się otwierają, mosty opadają?
-
NavMesh Obstacle: Użyj
NavMeshObstaclena obiektach ruchomych (np. zamykające się drzwi). Pamiętaj, aby ustawićCarvenatrue, aby dynamicznie tworzyły „dziury” w NavMesh. Pamiętaj, żeNavMeshObstacledziałają synchronicznie, więc zbyt wiele ruchomych przeszkód może obciążać procesor. -
NavMesh Link: Do łączenia oddzielnych obszarów NavMesh (np. platformy, które się ruszają).
Podsumowanie
Optymalizacja NavMesh jest kluczowa dla zapewnienia płynnej rozgrywki w RPG z dużą liczbą jednostek. Zaczynając od starannego bakiowania, poprzez świadome użycie NavMeshAgent i jego opcji unikania kolizji, a kończąc na zarządzaniu dynamicznymi przeszkodami, możemy znacząco poprawić wydajność. Pamiętaj, że nawet najinteligentniejszy przeciwnik będzie wyglądał głupio, jeśli będzie się zacinał.
