Obecnie symuluję siły uderzenia fizyki w celu lokalnego unikania jednostek, ale ta metoda czasami wypycha jednostki z formacji i ma bardzo niepożądane skutki, gdy jednostki się zlepią.
Jak robi się lokalne unikanie w grach RTS, takich jak Starcraft 2? Czy symulowana jest fizyka, czy kontroler wszechkierunkowy decyduje, gdzie wszystko powinno być? Wiem, że to pytanie może być nieco ogólne, więc pytam konkretnie, jak osiągnąć lokalne zachowania unikania w Starcraft 2; choć wszystko, co działa, będzie bardzo mile widziane.
Nie szukam żadnego kodu - tylko użyteczne zasoby lub wyjaśnienia, w jaki sposób Starcraft 2 (lub podobne gry) radzi sobie z unikaniem lokalnym.
Obecnie mam zaimplementowane wykrywanie kolizji (z wektorem penetracji), siły kolizji i ruch według prędkości. Każda jednostka jest porównywana z drugą pod kątem kolizji - jeśli zderzą się, obiekty zostaną natychmiast przesunięte przez wektor penetracji, a następnie zastosowana zostanie siła zderzenia. Następnie kolejna pętla przesuwa obiekty według ich prędkości i stosuje prędkości do prędkości. Przesunięcie łagodzi problem nadmiernych sił kolizji przykładanych do skupionych jednostek, ale jednostki wciąż czasami strzelają.
Rozwiązanie, którego szukam, musi spełniać następujące wymagania (jak w Starcraft 2):
- Obiekty nie mogą się nakładać; lub przynajmniej nakładanie się musi zostać ostatecznie rozwiązane.
- Przedmioty nie odpychają się bardziej niż to konieczne, więc 2 jednostki mogą stać i poruszać się obok siebie w szyku.
- Nie powinno być żadnych dziwnych zachowań, gdy obiekty zbijają się w kierunku tego samego miejsca docelowego.
- Może obsługiwać jednostki o różnych rozmiarach, a nawet o różnych wypukłych kształtach.
Do tej pory myślałem o wykrywaniu kolizji, wykrywaniu przyszłych kolizji, aby nakładanie się nigdy nie miało miejsca. Następnie zastosuj ograniczenie, upewniając się, że prędkości 2 jednostek nie powodują, że się nakładają. Nadal majstruję przy algorytmie ograniczania ruchu poza nakładanie się.