Co właściwie jest maszyna stanów skończonych
Maszyna stanów skończonych (FSM) to jedna z najstarszych i najbardziej wiarygodnych narzędzi do symulowania zachowania: entitet może być w dokładnie jednym z ustalonego zbioru nazwanych stanów na dany moment, a przechodzi on między stanami tylko po jasno zdefiniowanych przejść. Nie ma tu żadnego ukrytego pola średniego i nie ma niejasności co do tego, co aktualnie robi entitet — jest deterministyczna ze względu na konstrukcję, co jest dokładnie tym powodem, dla czego FSMy pozostają domyślnym wyborem w celu symulowania zachowania NPC w czasie rzeczywistym, sterowania semaforami, logiki podniesienia windy i automata sprzedawczego.
Konkretne prototyp Unity (AI przeciwnika dla gry akcji z perspektywy trzeciej osoby) ułatwia zrozumienie pojęcia siedmioma stanami: Idle, Patrol, Alert, Chase, Attack, Retreat i Die. Każdy stan posiada trzy zachowania — co się dzieje podczas wejścia, co się dzieje w każdym klatkowym cyklu gdy jest aktywny, oraz co się dzieje podczas wyjścia — a sterownik przechowuje tylko pojedynczą zmienną stanu aktualnego i mały ilość kontekstu (aktualny cel, ostatnia znana pozycja, zegar stanu).
Siedemkrotne pętlowanie przeciwnika
Logika przejścia jest bardzo podobna do tego, jak prawdziwy ostrożny przeciwnik się zachowuje:
Uwaga: przejścia są warunkowe dla prostych i ekonomicznych sprawdzeń — odległość, linię pola widzenia, zegara lub procentu zdrowia — nie wymagają one skomplikowanego planowania. Ta ekonomiczność jest kluczem: FSZ może oceniać dziesiątki agentów na klatkę bez stania się brzmiącym problemem wydajnością simułacji.
Dlaczego nie użyć tylko jednego dużego skryptu?
Alternatywą dla maszyny stanów (FSM) jest monolityczny metoda Update() pełna bloków if/else wciętych, które sprawdzają każdą możliwą warunek na każdym klatce. To działa dla kilku zachowań, ale szybko się zepsuje: warunki zaczynają interagować w sposób, który nikt nie przewidział, naprawa jednego błędu otwiera inny, a myślenie o tym,
%A co może nastąpić dalej
%A
wymaga czytania całego kodu. Językowy FSM ogranicza przestrzeń do osiągniętych stanów — z ataku jedynymi legalnymi kolejnymi stanami są cofnięcie lub śmierć, aż do momentu. Ten ograniczony jest superwyzwaniem do debugowania: jeśli wrogi zachowuje się nieprawidłowo, musisz sprawdzić tylko bieżący stan i jego zdefiniowane przejścia, a nie całą przestrzeń kodu.
Ten wzorzec generalizuje się daleko poza gry. Maszyna stanów skończona jest naturalnym modeliem w każdym momencie, gdy system ma niewielkie liczebne liczby kwalifikacyjnie różnych trybów i dobrze zdefiniowane reguły przechodzenia między nimi: kontroler sygnałów ruchu cykliczny czerwony/zółty/green, cykl waszkownika, stan handshaking połączenia sieciowego lub uproszczona model epidemiologiczny przesuwający osoby między stanem zaraźliwej, zarażonej i odurzonej. Jakiekolwiek symulacje opisane jako
%A system jest dokładnie w jednym z tych stanów, a tutaj są reguły, które spowodują jego zmianę
%, są kandydatami do użycia maszyny stanów skończonej.
Gdzie maszyny stanów skończonych dochodzą do granic
FSMs skali się źle, gdy liczebność stanów lub zasady przejść rośnie, ponieważ tabela przejść wzrasta w przybliżeniu kwadratowo ze względu na liczbę stanów — każdy stan może potencjalnie przechodzić do każdego innego stanu, a ktoś musi określić (lub wykluczyć) każdą parę. Gry z prawdziwie skomplikowanym rozumowaniem — „czy powinnam atakować flankując, czy wezwać wsparcie, czy cofnąć się i odnowić?” — zwykle przechodzą na drzewo zachowania, które komponuje małe, powtarzalne węzły decyzyjne hierarchicznie zamiast wymieniać każdą parę stanów, lub do systemu użyteczności, który ocenia każdy możliwy działanie za pomocą kombinacji wagowych czynników i wybiera najbardziej ocenione na każdym ticku. Oba są bardziej wyrażające, ale również kosztowniejsze w zakresie rozumowania i debugowania, co powoduje to, że gry produkcyjne często mieszają podejścia: FSM dla zewnętrznej pętli (żywy/nadludzki, w walce/za granicami walki) z drzewem zachowania lub systemem użyteczności włożonym wewnątrz stanu „w walce” do wyboru taktów.
Nauka dla każdego, kto buduje symulację, polega na dopasowaniu narzędzia do czynniku gałęzi: jeśli modelowany obiekt rzeczywiście ma tylko kilka modele i jasne przejścia między nimi, FSM jest prostszy, szybszy i łatwiejszy w zweryfikowaniu niż coś bardziej złożonego — używaj cięższego narzędzia tylko po tym, gdy sama tabela stanów staje się źródłem błędu.
Często zadawane pytania
Czy maszyna stanów skończonych jest taka sama jak drzewo zachowania?
Nie. Maszyna stanów skończonych przechowuje tylko bieżący stan i stałą tabelę przejść między stanami, podczas gdy drzewo zachowania ocenia hierarchię węzłów warunkowych i akcji od korzenia na każdym ticku. Drzewa zachowania łatwiej łączą się wraz z wzrostem skomplikowania, ale maszyny stanów skończonych są mniej kosztowne do obliczeń i znacznie prościejsze do wizualizacji i debugowania dla małej, dobrze zrozumianej zestawu trybów.
Dlaczego używać agenta NavMeshAgent razem z maszyną stanów skończonymiami zamiast pisania własnych kodów ruchu?
Agent z mapą nawigacyjną handluje ścieżkowaniem wokół przeszkód i terenu, co to oddzielna problem. Rozdzielenie tych dwóch spraw oznacza, że maszyna stanów skończonych musi tylko mówić 'poruszaj się w kierunku tego punktu' lub 'zatrzymaj poruszczenie', podczas gdy system ścieżkowania się martwi, jak dokładnie tam dotrzeć.
Czy maszyna stanów skończonych może modelować zachowanie więcej niż jednego entyta jednocześnie?
Typowo każdy agent uruchamia własną niezależną instancję maszyny stanów skończonych. Simulacja z wieloma agentami (wyrabianie wrogów, systemy tłumu, modele ruchu) wykonuje wiele małych maszyn stanowych równolegle. Ta niezależność na poziomie agenta, podwójnie kombinowana z niskim kosztem ticku dla maszyny stanów skończonych, jest dokładnie tym, dlaczego wzorzec skaluje do setek agentów w czasie rzeczywistym.
Co spowoduje przejście do trybu Odwrotu zamiast po prostu umrzeć?
Próg procentowy zdrowia, który jest zwykle sprawdzany raz na tick podczas stanów Atak lub Dążenie. Gdy aktualne zdrowie spadnie poniżej tego progu, przejście przewyższa wszystko, co się działo wcześniej, co prowadzi do czytelnego i nie samobójczego zachowania przeciwnika, który zaczyna odwlek przed utratą życia.
▶ Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Finite-State Machines: How Games Simulate an Opponent's Decisions i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.