Czy istnieje prosty sposób, aby zatrzymać wrogów stojących w tym samym miejscu?

24

Tak więc: gra z góry na dół, moi wrogowie gonią gracza, gdy znajdą się w pewnej odległości, stoją w miejscu i strzelają. Jeśli wszyscy zbliżają się z tego samego kierunku, wszyscy kończą w tym samym miejscu (tj. Stojąc „wewnątrz” siebie nawzajem), ponieważ obecnie nie wykrywam kolizji między wrogami - mogą się ominąć.

Jaki jest prosty sposób na obejście tego? Albo jakaś forma wykrywania kolizji, czy jakaś ai?

Iain
źródło
1
Ogranicz się do jednego wroga. : P
Kylotan,

Odpowiedzi:

18

Nie potrzebujesz wykrywania kolizji, ale będziesz musiał dać swoim wrogom odrobinę inteligencji i uniknąć wzajemnego zbliżania się. Wykrywanie kolizji bez tego sprawi, że twoi wrogowie i tak będą wyglądać głupio - ludzie unikają się, na ogół nie zderzają się.

Poszukaj „uciekających”, aby poznać niektóre proste zachowania.

Podstawową ideą jest to, że rzeczy powinny zmierzać w kierunku gracza, ale z dala od bliskiej przeszkody (siebie, ścian, tego rodzaju rzeczy).

JasonD
źródło
6
Nazywa się to również boidami. Przeczytaj o prostych zasadach dotyczących boidów tutaj: en.wikipedia.org/wiki/Boids Wprowadzenie tych ograniczeń powinno być trywialne.
Nailer
12

Możesz zainspirować się zachowaniami uciekającymi , takimi jak Boids .

Zwykle składają się one z 3-4 bardzo prostych reguł, które właściwie zastosowane, skutkują bardzo satysfakcjonującymi i „złożonymi” zachowaniami.

W twoim przypadku możesz spróbować czegoś takiego:

  • Separacja (minimalne promienie między wrogami)
  • Spójność (więc podróżują w grupach)
  • Wyrównanie (więc mają tendencję do poruszania się w tym samym kierunku)
  • Celowane (powinny zmierzać w kierunku gracza)
egarcia
źródło
To prawie dosłowna kopia odpowiedzi JasonD. Przysięgam, że nie spojrzałem na to przed opublikowaniem.
egarcia,
3

Być może zechcesz sprawdzić dyfuzję opartą na współpracy (tutaj świetne animacje) lub inny rodzaj wzoru przeciwdziałającego ruchom. Chociaż sam algorytm dyfuzji może nie powstrzymać wrogów przed przejściem, możesz dodać dodatkowe ograniczenia, aby uczynić to mało prawdopodobnym lub niemożliwym.

leander
źródło
Pełne ujawnienie: całkiem pewne, że znalazłem link do rozpowszechniania tutaj gdzieś na GD, ale przez całe życie nie mogę znaleźć postu, który go teraz dotyczy. To było niezłe znalezisko. =)
leander
To jest super niesamowite, ale trochę bardziej skomplikowane, niż potrzebowałem. I tak przeczyta oficjalny dokument, ale udało się wdrożyć prostsze rozwiązanie.
Iain
2

Co jeśli nie możesz poruszać się po innych jednostkach? Wydaje mi się, że prędzej czy później będziesz go potrzebować. Ilekroć bieżąca ścieżka jest blokowana przez jednostkę, dostosuj ścieżkę, aby się nią poruszać.

jmp97
źródło
2

Na stronie Craiga Reynolda można znaleźć odniesienia do zachowań związanych z kierowaniem i uciekaniem . Są względnie proste do wdrożenia, ale mogą wywoływać piękne, wschodzące zachowania.

tenpn
źródło
Jest to zasadniczo ta sama odpowiedź, co pozostałe 2, ale +1 dla linku - ta strona jest naprawdę dobrym źródłem informacji.
AShelly,
1

Wszystkie pozostałe odpowiedzi dają lepszy wynik, ale najtańszym (?) Sposobem uniknięcia pełnego grupowania jest po prostu dodanie losowego wektora, który może być 25% oryginalnego obliczonego wektora ruchu, aby obiekty odbijały się nieco w ogólnej grupie kropel . Nie powstrzyma to całkowicie od siebie, ale w zależności od tego, co próbujesz osiągnąć, stwierdziłem, że może to być odpowiednie. Przedmioty mogą nadal grupować się za pomocą tej metody, jeśli będziesz je otaczać, ale z czasem będą się rozpraszać.

Oto mała gra, którą stworzyłem kilka lat temu, która demonstruje tę metodę: http://deleter.phatcode.net/index.php?page=projects&p=4

Deleter
źródło
1

Ludzie zawsze przynoszą boidy, ponieważ daje to bardzo dobre wyniki, ale wdrażanie boidów może być przesadą w stosunku do konkretnego celu. W przeszłości osiągałem bardzo dobre wyniki, po prostu losując pozycję docelową w małym kółku.

Na przykład w przypadku wersji demonstracyjnej wbudowanej w Unity użyłem jej polecenia Random.insideUnitSphere, aby wykonać flokowanie dmuchawek

jhocking
źródło
+1 Zgadzam się, kolejny przykład tej strategii (z pewną lepszą gwarancją nie nakładania się) można znaleźć tutaj: Jednostki „Unclutter” w grze RTS
MichaelHouse