V této části seriálu o herním vývoji si ukážeme jak vygenerovat nepřátelskou hordu. Ta nás bude pronásledovat a bude schopna fyzicky interagovat s herním světem. Pro základní nastavení scény a animace se podívejte na
první část seriálu a pro ovládání postavy hráče na
část druhou. Pokud máte vše nastaveno, můžeme se do toho pustit!
Veřejný nepřítel #1
Nejprve si vytvoříme nový herní objekt, který pojmenujeme Enemy.
Balík 3D modelů
Synty, který jsme použili minule, obsahuje i herní charaktery. Jsou zde 4 "fazole" a normální muž a žena. Mít hordu modelů stejných jako používáme pro hráče, by byla nuda, takže volím "policejní fazoli". Model přetáhnu do scény.
Model přiřadíme pod objekt
Enemy.
Nyní vytvoříme skript, co bude nepřítele ovládat. Pojmenujeme ho taktéž
Enemy a přiřadíme
Enemy objektu.
Hledání cesty a pronásledování
Pro ovládání navigace nepřítele budeme potřebovat Navigační panel:
Po otevření panelu
Navigation zvolíme objekt
Plane, nastavíme
Navigation static a označíme celý Plane jako
Walkable - to zajistí, zjednodušeně řečeno, že ho nepřátelé budou chápat jako objekt, po kterém mohou chodit.
Navigaci také musíme tzv. "zapéct" (tlačítko
Bake).
Po zapečení vypadá herní plocha následovně:
Všechno označené modře je
"vkročitelné". Objekty domu a auto tedy označím jako
"Not-walkable" a zapeču změny ještě jednou.
Po zapečení vypadá scéna takto. Nepřátelé nebudou schopni vejít do domu, projít autem ani krabicí. Znají pouze "vkročitelné" oblasti.
Nepřítel také potřebuje základní inteligenci pro pronásledování hráče. Aby se mohl pohybovat na navigačním poli potřebuje tzv.
NavMeshAgent - navigačního agenta. Objektu
Enemy tedy přidáme novou komponentu
NavMeshAgent. Pokud bude ohraničující box agenta vyčnívat z modelu, upravte ho (sekce Obstacle Avoidance níže na obrázku).
Ve skriptu
Enemy.cs implementujeme jednoduchou logiku. V
pathfinder proměnné budeme držet referenci na komponentu navigačního agenta a jako target nastavíme hráčovu pozici. Jelikož se jedná o referenci na
transform hráče, jeho pozice bude automaticky updatována každý snímek hry a nepřítel tak bude schopen dynamicky měnit cestu podle toho, jak se hráč bude hýbat.
Po spuštění nás bude pronásledovat policejní fazole.
Spawner nepřátel
Spawner vytvoříme tak, aby vytvářel nepřátele na náhodných pozicích navigačního pole.
Nejprve vytvoříme tzv. prefab, což je "uložený" model se všemi jeho skripty a nastaveními. Lze ho pak přesně ve stejném nastavení používat znovu a znovu. Vytvoříme ho tak, že přetáhneme objekt
Enemy z
Hierarchy prohlížeče do
Assets.
Ve scéně dále vytvoříme nový objekt pro
Spawner. Přiřadíme mu nový stejnojmenný skript. Ten vytvoří jednoho nepřítele na souřadnicích (0,0,0).
Do skriptu přiřadíme referenci na Enemy prefab (ne model z Hierarchy, prefab z Assets). Teď už můžeme smazat původní
Enemy objekt ve scéně, protože se bude spawnovat přes
Spawner.
A teď ta nejdůležitější část: náhodné spawnování. K tomu použijeme funkci
RandomNavmeshLocation. Ta dokáže vybírat náhodné body na navigačním poli. Pokud je vybraný bod "walkable", vytvoříme na něm nového nepřítele. Pro omezení počtu nepřátel si uděláme proměnnou
numberOfEnemies a přes atribut
Range umožníme Editoru, aby s ní bylo možné manipulovat grafickým posuvníkem.
A vše je hotovo. Nepřátelská horda sta policejních fazolí nás neúprosně pronásleduje.
Se scénou si můžete dále pohrát, vyzkoušet různé počty nepřátel, přiřadit jim fyzikální model aby mohli tlačit do předmětů, měnit jejich rychlost nebo pro ně vytvořit nějakou formu útoku a jednoduchého systému zdraví.
V další částí implementujeme telekinezi, aby se hráč mohl proti policejním fazolím bránit.
Kód dostupný na mém
githubu.
Jan Jileček