Articles

Konečné stavové stroje [1. část] – zdroje pro vývoj Unity od TKoU

Konečné stavové stroje jsou možná něco, co všichni vývojáři alespoň jednou slyšeli během několika let, kdy začínali s vývojem her v Unity.

Co je to vlastně konečný stavový stroj? No, je toho hodně, co bychom měli probrat, proto si uděláme alespoň 3 díly. V podstatě je Finite State Machine (neboli FSM) návrhový vzor, kde do hry vstupuje automatizace. Běžně se používá v implementacích umělé inteligence pro určité chování. Tj. chůze, útok, nečinnost atd. FSM lze implementovat také v NPC a nejčastěji se vyskytuje v RPG hrách s otevřeným světem.

fsm1Považujme FSM za dohlížitel:

Nyní dohlížitel kontroluje stav UI. V závislosti na stavu na něj bude UI reagovat. Také v závislosti na typu UI (zda je to létající typ, nebo pozemní typ, nebo plovoucí typ) je akce, kterou UI provede. V tomto scénáři FSM řekne UI, že je ve stavu „hlídka“, a řekne UI, aby „šla z bodu A do bodu B“. Pokud nedojde ke změně stavu, bude AI pouze chodit z bodu A do bodu B.

fsm2

Chceme-li změnit stav, musíme mít nejprve podmínku. Na obrázku vlevo AI vidí hráče a řekne to dohlížiteli. Nyní dozorce změní stav UI a začne útočit.

1ZmLLoS1bAl71Ea_BNZzHWaja5YsjvqLa2z-ubNYUI opět začne hlídkovat, protože hráč není v jejím zorném poli.

Jak je vidět na těchto špatně provedených nákresech, každý stav má své podmínky před změnou na jiný stav.

Podívejme se na diagram níže.

sNz-b43jHw-bZzuRbNlrvHQ

Tady je diagram stavů normální AI. Červené čáry představují nepravdu o stavu, který je třeba změnit ve stavu. Diagram je poměrně přímočarý. UI bude ve stavu nečinnosti, pokud dosáhne svého cíle, a naopak. Pokud uvidí nepřítele, začne útočit. Systém FSM nyní zpracovává všechny přechody mezi stavy a pomáhá UI provést akci, která je pro daný stav k dispozici.

Nyní si rozebereme náš systém FSM.

  • Hlavní systém FSM – To bude ten, který bude řídit stavy UI a kontroluje, zda jsou splněny podmínky mezi stavy. Hlavní FSM bude obsahovat všechny stavy a bude zpracovávat volání událostí z FSM Akce.
  • FSM Stav – Určuje aktuální stav UI a obsahuje všechny akce, které jsou na UI umístěny.
  • FSM Akce – To bude akce, kterou UI provede, když je UI v určitém stavu.

Teď jak to budeme dělat? Vše si zmapujeme.

sV8-Gi7zqfM4YoWEXA-SCGw

Toto bude smyčka našeho FSM. Nejprve inicializujeme FSM, vytvoříme stavy, vytvoříme akce a všechny je zmapujeme. Po jejich namapování nyní spustíme FSM a uvedeme stav, do kterého se UI spustí. Nyní UI přejde do určitého stavu a FSM inicializuje akci, aktualizuje ji, dokud akci nedokončí, a odešle událost oznamující, že akce byla dokončena. Nakonec se FSM vrátí zpět a změní stav.

Další věc, která způsobí změnu stavu, je vyvolání události mimo logiku UI. Jako když vytvoříme velitele a řekneme všem vojákům, aby se přestali pohybovat.

Tímto končí první část našeho výukového kurzu FSM. Doufám, že jsem vám FSM vysvětlil dobře. Pokud to stále nechápete, pravděpodobně budete muset nejprve vidět vše v akci a prohlédnout si skenování všeho na vlastní oči. Tak jsem se to naučil já.
V příštím díle si nejprve znovu probereme několik jednoduchých reálných implementací FSM a pak se pustíme do skriptování celého našeho FSM enginu od nuly!

.