Wstęp do state machine
A dokładniej finite-state machine (w skrócie FMS) to taki abstrakcyjny model, systemu składającego się ze stanów i przejść między nimi. Ważne jest to że taki system może ogarniać jednocześnie jeden stan. Jeżeli chcemy przejść do innego stanu potrzebny będzie nam jakiś sygnał, który dotrze do naszego systemu. I przejścia ze zdefiniowanymi warunkami które sprawią że stan się zmieni.
Temat jest trochę zawiły, ale jeżeli rozbijemy go na czynniki pierwsze to wszystko stanie się mega proste.
Zanim przejdziemy do teorii to jeszcze dwa słowa o zastosowaniu. W gamedevie najczęstszą reprezentacją FMS będą bloczki (z ang. state) i łączące je przejścia (z ang. transition). Najczęściej spotykamy się z reprezentacją wizualną, ale możemy to wszystko zaimplementować w kodzie, bez żadnych bloczków. Przykładem zastosowania tego konceptu może być system animacji czy AI. Implementując nasz koncept dostosowujemy go pod nasze potrzeby, ale podstawowe założenia zawsze są takie same. Możemy mieć interfejs, albo wszystko może dziać się za zasłoniętą kurtyną.


Jak działają State Machine?
Dobrze, jak już mniej więcej wiemy czym jest FMS i jakie są jego przykładowe zastosowania, to przydałoby się dowiedzieć jak on właściwie działa…
State machine jaki jest każdy widzi. Ale żeby go zrozumieć spróbujemy sobie to omówić na przykładzie. Mamy NPC w naszej grze i chcemy stworzyć AI, które będzie zarządzać jego zachowaniami w ciągu dnia. Jako system wybraliśmy sobie state machine. Definiujemy więc sobie stany (states): Praca, Szamka, Spanko.
Jak już wiemy czym ma się zajmować nasz NPC to teraz musimy to jakoś logicznie połączyć. Wychodzimy z założenia że NPC w naszej grze nie może spać bez zjedzenia kolacji i nie może iść do pracy bez zjedzenia śniadania. Dlatego połączymy sobie nasze stany w następujący sposób:

Następnym etapem będzie zaplanowanie pod jakimi warunkami nasz NPC będzie zmieniał stany. Chcemy aby do pracy szedł zawsze najedzony. Prace kończył jak będzie wygłodniały. Po kolacji kład się spać jak będzie zmęczony, a jak tylko się wyśpi, żeby wcinał coś na śniadanie.
Z tych założeń wyklarowały się nam dwa parametry:
- Czy jest najedzony?
- Czy jest wyspany?
Jeżeli te dwa parametry będą miały odpowiednią wartość, ma nastąpić zmiana stanu. Czyli jeżeli NPC pracuje i jest głodny to zajedzie przejście i nasz NPC uda się coś zjeść. Jeżeli jest wyspany to wróci do pracy, a jeżeli nie to pójdzie do spania.

Zmiana parametru jest sygnałem do naszej maszyny, że to najlepszy moment zmienić stan. Ustaliliśmy modyfikacja jednego z parametrów będzie sygnałem, ale możemy sobie taki sygnał sztucznie stworzyć dziać się to też przez wystąpienie jakiegoś wydarzenia (event). Jeżeli nasza postać jest w pracy, a my jako szef zamkniemy fabrykę to NPC pójdzie spać z pominięciem sprawdzania parametrów parametrów.

Podsumowanie
Nasze maszyny stanów jak sama nazwa wskazuje składają się ze stanów i połączeń jakie zachodzą miedzy nimi oraz sygnałów.
Sygnałami do zmiany stanu i odpalenia przejścia będzie zmiana stworzonych przez nas parametrów, którą możemy inaczej określić jako zajście danego warunku.
Sygnały do zmiany stanu możemy sobie wykreować sztucznie wtedy nazywamy je eventami.
To wszystko sprawia, że maszyny stanów to całkiem wdzięczna konstrukcja ale im więcej stanów mamy tym więcej połączeń/przejść musimy obsłużyć, dlatego w miarę szybko cały system nam się mocno komplikuje.
Jeżeli chcesz dowiedzieć się o innych podejściach do tematu AI w których nie będziemy musieli ustawiać setki połączeń i warunków, a decyzje mają być podejmowane bardziej autonomicznie, polecam zapoznać się tym artykułem o innych typach sztucznej inteligencji dla naszych NPC.



