Gość: strzyka_w_kolanie
IP: *.neoplus.adsl.tpnet.pl
03.01.10, 04:17
AI w grach - dlaczego boty są głupie?
Cześć I,
Wszyscy o czymś robią tutoriale, zrobię i ja
Jakość AI w grach jest tematem wałkowanym od wielu lat. W tym poście chciałbym przybliżyć
typowe problemy związane z implementacją realnych zachowań przeciwników. Skupię się
głównie na tych grach, gdzie rzeczywiście mamy do czynienia z AI, a nie wyreżyserowanym
pojawieniem się aktora w punkcie X i odegraniu animacji Y bez głębszej logiki interakcji z
otoczeniem czy graczem (np. przygodówki, Heavy Rain taki np. czy inne point-and-clicki)
Nie będę tutaj za bardzo zagłębiał się w historię tematu, ponieważ zwyczajnie najfajniejsze
rzeczy dzieją się w nowożytnej historii gier: lata 2000-czne.
Generalnie rzecz biorąc AI w grach jest tematem bardzo szerokim, a przynajmniej takowym
było gdy na rynku istniało wiele gatunków gier. W tej chwili mówimy tak naprawdę dwóch
gałęziach, w których AI stanowi poważne wyzwanie dla programistów:
1) Strategie RTS i przede wszystkim AI grupowe
2) FPSy i TPSy
Zacznijmy jednak od czegoś prostego, np. takie Diablo. Typowy algorytm przeciwnika AI w
slasherze wygląda mniej-więcej tak:
a) znajdź gracza na mapie
b) zmierz odległość do niego i ustal czy zacząć atakować czy nadal odgrywać
animację "oczekiwania"
c) jeśli atakować to korzystając z algorytmów wyszukiwania ścieżki zmniejszaj odległość do
gracza
d) będąc w polu rażenia aktualnej broni sprawdź czy gracz nie walczy już z kimś innym
e) jeśli walczy: to albo używaj słabszego ataku albo "zakolejkuj" się czekając aż gracz pokona
aktualnego wroga
Najbardziej to można dzisiaj zaobserwować np. w Dante's Inferno, gdzie
przeciwnicy "tańczą" dookoła gracza czekając na okazję do ataku. Dlaczego nie atakują? Bo
zwyczajniej popsułoby to gameplay czyniąc grę trudniejszą i mniej przewidywalną dla gracza
(popsułoby, nie?). Z tego też względu AI sprawdza na bieżąco ile przeciwników zadaje
obrażenia graczowi w danej chwili. Zależnie od poziomu trudności (rzaaaaaaadko) i sztywnych
ustawień wynikających z określonego experiencu jaki gracze mają osiągać
(częęęęęęęęęęęęęęściej) AI albo pozwala na zadawanie obrażeń albo kolejkuje przeciwnika
aby się do czekał swojej szansy. Oczywiście gdy gracz zadaje atak grupowy to dostają
wszyscy, także ci w kolejce
f) jeśli gracz ucieka to podążaj za nim dopóki odległość nie zwiększy się do X jednostek (lub
ścigając go nie pokonasz X odległości) - wtedy zaprzestaj i przejdź w tryb oczekiwania.
Ten mechanizm ma za zadanie przede wszystkim stworzyć wrażenie presji na
gracza z jednej strony, z drugiej zaś minimalizować sytuacje gdzie za graczem podąża cała
horda, przez całą mapę (mało wydajne). W dzisiejszych grach jednak ten mechanizm jest
coraz rzadziej obserwowalny ponieważ gameplay tak naprawdę dzielony jest na poszczególne
areny walki, na których gracz jest przytrzymywany (np. zatarasowane przejście) po to aby
zwiększyć intensywność walki / doznań (nie możesz już uciekać przed Butcherem po całych
katakumbach) po drugie efektywnie zaimplementować wyreżyserowane przejścia pomiędzy
arenami, np.: przechodzisz dalej bo zatarasowane przejście nagle zostaje rozwalone przez
wielkiego kizia-mizia, z którym walczysz na następnej arenie.
Back-on-track, nazwijmy to algorytmem "Mięsa Armatniego", czyli ogólnie rzecz biorąc:
biegną ci pod topór tępe pały.
Jak widać jest to nieskomplikowany algorytm i w dużej mierze w podobnym kształcie był
stosowany w pierwszych FPSach lub w budżetówkach, np. Painkiller. Budżetowe FPSy z City-
Interactive to inna bajka gdyż korzystają oni z JupiterEx'a, który ma zaawansowane AI
(mechanizmy, a nie zaimplementowane przez CI), ale do tego jeszcze wrócimy.
Zajmijmy się na chwilkę RTSami. Jakie tam są największe wyzwania? W przeciwieństwie do
przypadku opisanego powyżej w RTSach dochodzi jeszcze jeden ważny element AI, który ma
wpływ na gameplay w stopniu bardziej zauważalnym niż w slasherach. Tym elementem jest
grupowa decyzyjność, działanie w grupie. Na czym to polega?
Otóż w RTSach przeważnie mamy do czynienia ze znacznie bardziej skomplikowaną strukturą
mapy, z punktu widzenia nawigacji AI, niż w slasherach, a czasami też i w FPSach. W tych
ostatnich walka jest praktycznie zawsze ograniczona do jakiegoś obszaru (patrz uwaga dot.
hord podążających za graczem przez całą mapę) zatem działania AI w dużej mierze są
lokalne, tzn. ograniczone do bezpośredniego sąsiedztwa gracza. W RTSach jest trudniej,
ponieważ "gracz", czyli cel ataku, to tak naprawdę każda jednostka przez "gracza" sterowana.
Po pierwsze mamy tutaj wiele lokalnych obszarów podejmowania decyzji przez AI - tak wiele,
jak wiele jednostek ma gracz. Dwa mapa jest bardziej złożona, bardziej dynamiczna (gracz
może postawić budowle praktycznie wszędzie i zablokować dany obszar mapy) i co więcej: w
tym przypadku jest porządane wręcz aby AI aktywnie poszukiwało jednostki / budowle gracza
na mapie i przeprowadzało ataki, nawet jeśli oznacza to przeprowadzić 20 zelotów na drugi
koniec mapy.
Teraz, jeśli zastosujemy patent ze slasherów ("Mięso Armatnie" to ruch takich jednostek będzie
wyglądał bardzo sztucznie, ponieważ będą np. iść gęsiego, krok w krok. Dlaczego? Bo każda
z nich wyliczyła tę samą, optymalną scieżkę dotarcia do gracza! W slasherach tego tak
bardzo nie widać ponieważ programiści załatwiają to początkowym rozstawieniem
przeciwników, np. w grupach po kilku do okoła gracza / miejsca, które wyzwala zdarzenie
generujące wrogów.
Co zatem możemy zrobić? Po pierwsze zróżnicować zachowanie AI: jeśli jednostka jest jedna
(np. special unit albo akurat gracz zaznaczył jedną) to stosujemy podobny algorytm do
slasherów. Jeśli gracz zaznaczył grupę jednostek to wykonuj obliczenia dla grupy, a nie
poszczególnych jednostek. Wiąze się to z następującymi problemami:
1) Rozmieszczenie jednostek w grupie tak, aby wyglądało to przekonowująco, np. żołnierze
ustawiają się w formacji, zeloty biegną w "kupie".
2) Wyszukanie jednej ścieżki dojścia do celu ataku dla całej grupy, biorąc pod uwagę wiele
czynników, np. to, że w grupie są jednocześnie jednostki lądowe jak i powietrzne; takie które
poruszają się szybko i takie, które poruszają się wolno, ale np. mogą niszczyć elementy
scenerii (takie jak drzewa), które te słabsze jednostki muszą omijać.
3) Zachować w miarę możliwości szyk formacji
Pierwszy problem jest kluczowy z kilku względów. Przede wszystkim gdy jednostki atakują w
grupie powinny ustawiać się tak, aby wyglądało, że każda z nich ma czyste pole strzału,
głównie po to aby uzyskać przekonujący efekt wizualny. Ten problem jest dość prosty do
rozwiązania: zajmij pozycję dookoła celu, w okreslonym promieniu zachowując
określoną "gęstość zaludnienia" na jednostce mapy: czyli zachowaj odpowiednią odległość od
sąsiada. W starcrafcie np. często widać jak atakujące zeloty pomimo tego, iż mają "manualny"
atak, a stojąc w pewnej odległości i tak zadają obrażenia. Dzieje się tak dlatego, iż algorytm
wyliczył, że nie da się "obstawić" cel ataku wszystkimi równo dookoła nie łamiąc w/w reguł,
zatem dopuszcza się pewne oszustwo: nawet ataki "manualne" mają pewien zakres
skuteczności, umożliwiający zadawanie obrażeń nawet gdy "nie dotykamy" wroga, ale
szczekamy w jego kierunku.
-