Articles

Maszyny stanów skończonych [Część 1] – Zasoby programistyczne Unity od TKoU

Maszyny stanów skończonych to coś, co wszyscy programiści mogli usłyszeć przynajmniej raz w ciągu kilku lat tworzenia gier w Unity.

Co to w ogóle jest maszyna stanów skończonych? Cóż, jest wiele do omówienia, dlatego zrobimy co najmniej 3 części. Zasadniczo, maszyna stanów skończonych (lub FSM) jest wzorcem projektowym, w którym automatyzacja wchodzi w grę. Powszechnie używany w implementacjach AI dla pewnych zachowań. Ie: chodzenie, atakowanie, bieganie, itp. FSM może być również zaimplementowany w NPC i jest najczęściej spotykany w grach RPG z otwartym światem.

fsm1Traktujmy FSM jako nadzorcę:

Teraz, nadzorca sprawdza stan AI. W zależności od tego stanu, SI będzie na niego reagować. Również w zależności od typu SI (czy jest to typ latający, czy typ naziemny, czy typ pływający) jest akcja, którą wykona SI. W tym scenariuszu FSM mówi SI, że jest w „Stanie Patrolu” i każe jej „Przejść z punktu A do punktu B”. O ile nie nastąpi zmiana stanu, SI będzie tylko chodzić od A do B.

fsm2

Aby zmienić stan, najpierw musimy mieć warunek. Na obrazku po lewej, SI widzi gracza i mówi o tym nadzorcy. Teraz nadzorca zmieni stan SI i zacznie atakować.

1ZmLLoS1bAl71Ea_BNZzHWaja5YsjvqLa2z-ubNYPonownie SI zaczyna patrolować, ponieważ gracz nie jest w jego linii widzenia.

Jak widać na tych kiepsko wykonanych rysunkach, każdy stan ma swoje warunki zanim zmieni się na inny.

Spójrzmy na poniższy diagram.

sNz-b43jHw-bZzuRbNlrvHQ

Tutaj jest diagram stanów normalnej SI. Czerwone linie reprezentują fałsz na warunku, który jest wymagany do zmiany stanu. Diagram jest dość prosty. AI będzie w stanie bezczynności, jeśli dotrze do celu, i odwrotnie. Jeśli zobaczy wroga, zacznie atakować. FSM obsługuje teraz wszystkie przejścia między stanami i pomaga SI wykonać akcję, która jest dostępna dla danego stanu.

Teraz rozbijmy nasz system FSM.

  • Główny system FSM – To on będzie kontrolował stany SI i sprawdzał, czy warunki między stanami są spełnione. Główny FSM będzie zawierał wszystkie stany i będzie obsługiwał wywołania zdarzeń z FSM Actions.
  • FSM State – Określa aktualny stan SI i zawiera wszystkie akcje, które są nakładane na SI.
  • FSM Action – To będzie akcja, którą SI wykona, gdy SI będzie w określonym stanie.

Jak to zrobimy? Zmapujmy wszystko.

sV8-Gi7zqfM4YoWEXA-SCGw

To będzie pętla naszego FSM. Najpierw inicjalizujemy FSM, tworzymy stany, tworzymy akcje i mapujemy je wszystkie razem. Po zmapowaniu ich, teraz uruchomimy FSM i wskażemy stan, do którego SI zacznie działać. Teraz SI zmieni się na określony stan, a FSM zainicjuje akcję, będzie ją aktualizował aż do jej zakończenia i wyśle zdarzenie wskazujące, że akcja została zakończona. Na koniec FSM powróci i zmieni stan.

Inną rzeczą, która spowoduje zmianę stanu, jest wywołanie zdarzenia poza logiką SI. Na przykład, gdy stworzymy dowódcę i powiemy wszystkim żołnierzom, aby przestali się ruszać.

To kończy pierwszą część naszego samouczka FSM. Mam nadzieję, że dobrze wytłumaczyłem Ci FSM. Jeśli nadal tego nie rozumiesz, prawdopodobnie będziesz musiał najpierw zobaczyć wszystko w akcji i samemu wszystko zeskanować. Tak właśnie się tego nauczyłem.
W następnej części, najpierw omówimy ponownie niektóre proste implementacje FSM z prawdziwego życia, a następnie zaczniemy skryptować nasz cały silnik FSM od podstaw!