Jak w AI przeciwnik powinien szukać gracza?

0

Drodzy użytkownicy. Jestem żółtodziobem w Unity, próbuję zrobić AI proste, nieskomplikowane. Na razie wróg potrafi dostrzec gracza z pewnej odległości i biec do niego, czyli w przypadku gdy dostrzeże gracza, wróg dostaje współrzędne położenia gracza tam gdzie go zobaczył. Gracz może odbiec poza zasięg widzenia przeciwnika i przeciwnik jedynie dojdzie w miejsce, w którym ostatnio widział gracza i tyle, nie szuka go.

Chciałbym się dowiedzieć jak powinno wyglądać to poszukiwanie gracza od strony technicznej. Byłoby miło, gdyby ktoś kto miał styczność z Unity, wypowiedział się. Gra z "lotu ptaka", do pathfindingu używam NavMesh więc wrogowie przeszkody omijać potrafią.
Teoretycznie mógłbym zrobić tak, że gdy wróg dojdzie do miejsca, w którym ostatnio gracz był widziany, wylosuje sobie 4 punkty w promieniu 10 metrów i tam się uda po kolei, ale to może być kiepski pomysł, np. będzie to wnętrze budynku, a wylosowany punkt będzie poza budynkiem więc wróg wyjdzie z budynku niepotrzebnie zamiast buszować po korytarzach i pomiędzy skrzyniami w środku budynku.

Szukanie gracza wydaje się najbardziej skomplikowaną rzeczą w całym AI. Dziękuję każdej osobie, która spróbuje w jakiś sposób pomóc, doradzić.

0
Widze gracza!
Biegnę dopóki go widzę!
Biegne tam, gdzie widzialem go ostatni raz
szukam jego mozliwych drog ucieczki
sprawdzam okolice, w ktorych moglby byc
0

te dwa ostatnie punkty są problem, bo w jaki sposób ma znaleźć możliwe drogi ucieczki? Wyobraź sobie długi korytarz, wróg widzi gracza PRAWIE na jego końcu, przed rozgałęzieniem w lewo i prawo i gracz wrogowi znika z oczu, biegnie 2 metry i wybiera np. lewy korytarz, który z kolei może prowadzić do 8 pomieszczeń.
Przeciwnik nie miał takiego dobrego zasięgu widzenia by wiedzieć, w który korytarz na starcie gracz wbiegł, w lewy czy w prawy więc sobie losować musi, a później losować musi pomieszczenia. Ale wydaje się to trudne do realizacji bez podpowiedzi od was, czego użyć konkretniej? I w jaki sposób sprawdza okolicę? Jak wylosuję mu punkt (vector3) oddalony o 4 metry, to może się okazać, że prowadzi on za ścianę budynku lub do budynku obok i byłoby bez sensu, gdyby wróg cofnął się, wybiegł z budynku i wlazł do tego obok wiedząc, że tam na pewno gracza nie ma. Tu trzeba jakiegoś sensownego podejścia, jakiejś namiastki inteligencji w skrypcie i z tym jest największy problem.
Mam nadzieję, że jacyś użytkownicy z tego forum pisali kiedykolwiek grę z AI i będą potrafili udzielić paru rad konkretniejszych.

Narysowałem w paintcie jakikolwiek przykład planszy. Dwa budynki obok siebie, w każdym są pomieszczenia. Jest wróg z zasięgiem, polem widzenia niezbyt dużym i mamy gracza, który sobie gdzieś ucieka, wróg nie widzi gdzie skręcił, nawet nie zna kierunku, w którym gracz był zwrócony, bo nie widział go przy wybieraniu korytarza.
paint.jpg
I przypuśćmy, że wróg doszedł gdzieś na środek tego korytarza, bo tam ostatnio widział gracza i teraz musi dobrać sensowne punkty, które powinien odwiedzać w poszukiwaniu gracza. Jak te sensowne punkty wybrać? W teorii chyba gra nie wie co jest budynkiem więc może musiałbym stworzyć niewidzialnego Boxa (bez kolizji, np. jako wyzwalacz ustawionego) i sprawdzać, czy Vector3 (pozycja wylosowana) znajduje się w budynku, łatwo to sprawdzić?

1

A ty biegniesz 30 metrów na północny zachód w pomieszczeniu? Wiedza powinna być ograniczona, a nie jak ty próbujesz to interpretować - absolutna.

0

@spartanPAGE
mógłbyś rozwinąć myśl? Na obrazku specjalnie przedstawiłem sytuację, w której gracz ucieka do dalszego pomieszczenia (wróg nie wie o tym) i nie zależy mi by koniecznie tak daleko przeciwnik szukał gracza. Przeciwnik zatrzymując się w miejscu końca swojego zasięgu widzenia (bo załóżmy, że tam po raz ostatni widział gracza) rozpocznie poszukiwania gracza. Mógłbym wylosować 2, 4 punkty z jego promienia zasięgu i kazać mu iść do nich po kolei, jednak. W przypadku tego obrazka akurat zasięg w tym przypadku nie wychodziłby poza budynek więc wylosowane punkty znajdowałyby się w budynku, ale wyobraź sobie sytuację, że wróg ostatnio widział gracza w środku budynku przy oknie (zamkniętym) i gracz mu zwiał z pola widzenia uciekając korytarzem, wtedy trawa za ścianą budynku, będzie oddalona od przeciwnika np. o około metr i nie mogę pozwolić na to by wylosowany punkt właśnie tam prowadził, bo nie chcę by wróg tam daleko leciał. Teoretycznie mógłbym wysłać NavMesha (dynamicznie utworzonego) do tej trawy (dobiegłby natychmiastowo) i zmierzyłby przebytą drogę, jeśli przebyta droga nie mieściłaby się w promieniu widzenia wroga, to wróg nie szedłby tam, ale przecież sytuacja może być też inna, gracz zostaje dostrzeżony tuż za wejściem do budynku i nie mogę kazać wrogowi szukać gracza poza budynkiem wiedząc, że gracz wlazł do budynku na pewno i nie ma innego wyjścia z niego więc musi szukać w budynku. Analogiczna sytuacja jest przy opuszczaniu budynku, mamy korytarz, żadnych pomieszczeń w okolicach wyjścia i przeciwnik dostrzega gracza wybiegającego z budynku (nie wie, że wybiegł, bo w chwili widzenia go, gracz był metr przed wyjściem z budynku) i wtedy nie powinien szukać gracza w budynku, a powinien wyjść z niego i szukać go na zewnątrz.

@furious programming
tak, wiem, że jest linia, obrazek nie miał się prezentować jak w galerii z obrazami, miał to być machnięty w 4 sekundy obrazek do wglądu, dla zobrazowania. W przyszłości użyję tej linii i jak cię w realu spotkam, to postawię ci piwo w ramach przeprosin.

0

Nie jestem w stanie Ci powiedzieć dużo, żebyś zrozumiał - zamiast korzystać z gotowców do ruchu radziłbym Ci zagłębić się w matematyce dyskretnej - a konkretniej w grafach; Wtedy rozwiązanie samo powinno Ci przyjść do głowy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1