Vytvořte si nepřátele. V Unity
24.06.2020
Vytvořte si nepřátele. V Unity

​​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.

Picture 1.png

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.

Picture 2.pngModel 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.  

Picture x.png  

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.

 Picture 5.png

Navigaci také musíme tzv. "zapéct" (tlačítko Bake).

 Picture 6.png

Po zapečení vypadá herní plocha následovně:

Picture 7.png

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.

 Picture 8.png

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.

Picture 9.png

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.

Picture 11.png

Po spuštění nás bude pronásledovat policejní fazole.

 unity3D.gif

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.

Picture 12.png  

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).

Picture 13.png

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.

 

Picture 16.png

A vše je hotovo. Nepřátelská horda sta policejních fazolí nás neúprosně pronásleduje.

 2.gif

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