Godot je herní engine, který ze všeho nejvíc připomíná Unity. Stavba hry probíhá skládáním bloků – uzlů – do stromové struktury, přičemž jejich funkce lze rozšiřovat skriptovacím jazykem GDscript, který je inspirován Pythonem. Vývojové prostředí obsahuje editor skriptu s automatickým dokončováním, editor 2D scény, 3D scény, animací, shaderů a vizuální editor shaderů. Ty jsou kompilovány za běhu, takže je možné sledovat provedené změny přímo v editoru.

Užitečné jsou též rozsáhlé možnosti bakování light map (podpora global illumination) a debugování. Bohužel engine běží na OpenGL ES 2, který je oproti klasickému OpenGL omezený. I když je Godot open source, pořád na něm pracují vývojáři z Okam Studio. Do budoucna chtějí přepsat renderer do OpenGL ES 3 a rozšířit funkce enginu tak, aby byl vhodný i pro graficky bohatější projekty. Už teď se ale jedná o velmi propracovaný a komplexní nástroj, který některými funkcemi překonává komerční enginy.

Nástroj: engine

Grafika: 2D/3D

Programovací/skriptovací jazyk: GDscript

Licence: MIT License

Na platformy: Windows, Mac, Linux

Exportovat lze na: Windows, Mac, Linux, Android, iOS, Windows Phone, Nintendo 3DS, Wii, HTML5 (plánované), PS 3, PS Vita, PS 4

Web: http://www.godotengine.org/wp/

Dokumentace: https://github.com/okamstudio/godot/wiki

Fóra: http://www.godotengine.org/forum/

Další odkazy: https://github.com/okamstudio/godot

Přehlídka her: http://okamstudio.com/portfolio-items/

Poznatky

Nebudu začínat dlouhou obhajobou open source projektů. Je dobré vědět, že za enginem stojí vývojáři, kteří se mu plně věnují. Nesmíme ale zapomínat na to, že není raritou, když nějaký software zčistajasna zanikne. A v ten okamžik o něj nenávratně přicházíte. Čeká to i Unreal, Unity3D nebo GameMaker? Pravděpodobně ne, ale jeden nikdy neví. Když GameMaker změnil majitele, mnohým jistě zatrnulo.

Open source software už vám ale nikdy nikdo nevezme. Těžíte z práce komunity a vaši práci zase dáváte zpět. A kdyby komunita zanikla, bude to jedině proto, že software nejspíše za moc nestál. I tehdy nikomu licence nebrání vzít zdrojový kód a používat nástroj pro své účely. Problém je, že mnohé OS enginy trpí pomalým vývojem, jsou pořád silně rozpracované a nejsou vhodné pro seriózní použití.

Godot je ovšem jiný a po půl roce používání mohu říct, že podobným problémem netrpí. I když byly zdrojové kódy uvolněny relativně nedávno, engine byl šest let používán jako interní nástroj studia OKAM a za tu dobu si jeho architektura prošla několika změnami. Zvládl tedy zatěžkávací test a nejedná se o žádný hurá projekt, který bude použitelný možná až za několik let. Mezi 2D enginy nemá konkurenci. Jeho 3D renderer je ovšem pozadu a pokud nehodláte použít silnou grafickou stylizaci, poohlédněte se jinde. Alespoň dokud nevyjde Vulkan.

Za opravdu silnou stránku enginu považuji jeho přístupnost. Programovat můžete dobře, ale jakmile je editor nepřehledný a zahltí vás velkým množstvím informací, snadno se v něm ztratíte. Godot je velmi přehledný díky systému, jakým se hra tvoří. Na nováčky je shovívavý a zkušenější mohou velmi rychle uvádět do chodu své prototypy. Je ale také dostatečně propracovaný, takže až budete potřebovat pokročilé funkce, pravděpodobně je naleznete.

Ten systém, co jsem zmiňoval, je systém scén. Ta může být cokoliv. Level, charakter, inventář, nahrávací obrazovka, generátor dungeonu, GUI. Scéna může být jakýkoliv celek, co si dovedete představit. Uložíte je na disk a pak vhodně instancujete. Můžete je také vkládat do sebe a to jak v editoru, tak dynamicky v kódu. Projekt si tak můžete přehledně rozčlenit a na každé scéně může pracovat jiný vývojář.

Scény pak vytváříte z uzlů tím, že je skládáte do stromové struktury. Vaše hra tedy ve výsledku není nic jiného, než velký strom uzlů. Vztah rodič-dítě u každého uzlu znamená něco jiného. U některých určuje pořadí vykreslování, jindy vztahem přiřazujete kolizní geometrii a závisí na něm pořadí vykonávání skriptů. Pozice dítěte je také relativní vůči rodiči. Ne všechny zákonitosti jsou ovšem na první pohled zřejmé.

Uzel je základní stavební jednotka – objekt vykonávající specifickou funkci, který vývojáři zpřístupňuje funkce a vhodná data pomocí getterů  a setterů (funkce sloužící k nastavení či získání hodnoty či objektu). Je to černá krabička, do které přímo nevidíte, pokud se nezačnete šťourat ve zdrojovém kódu. Některé určitě napadlo, že tu popisuji třídu. Ano, uzel je vlastně jiné jméno pro třídu. Jen ji používáte v editoru. V něm dokonce vidíte posloupnost dědění a data, které tím získala. Speciálním typem uzlu jsou zdroje, což jsou kontejnery pro zdroje (textura, zvukový soubor, model,…).

Poslední důležitou součástí Godotu je skriptovací jazyk GDScript, který respektuje OOP a velmi se podobá Pythonu. Je dynamicky psaný a má podobnou syntaxi. Velmi rychle jsem si ho osvojil, i když mám mnohem raději staticky psaný jazyk. Oproti C++ je pomalejší (protože je sám napsán v C++), ale kritické části hry můžete přepsat do C++ jako modul a použít je v editoru jako uzel (což ale vyžaduje kompilaci celého enginu). Neobsahuje garbage collector, takže si musíte uzly uklízet sami (jednoduchou funkcí). Zdroje dědí ze třídy Reference, takže se samy uvolní, jakmile na ně neexistuje reference.

Vytvoření scén z uzlů je jen první krok. Musíte jim nějak dodat funkčnost. To se dělá pomocí skriptů, které si též můžete představit jako třídy. Ve skriptu dědíte, můžete ho instancovat v jiném skriptu a použít ho jako vlastní třídu. Druhou možností je přiřazení skriptu nějakému uzlu a řídit pomocí něj další uzly. Nemusí to být jen ten, kterému jste ho přiřadili. Je ovšem nutné dbát na to, že uzel který hledáte mimo scénu nemusí existovat. To záleží na struktuře vašeho projektu. Skripty se mohou spouštět každý snímek, nebo jen reagovat na callbacky signálů (v podstatě události).

Hru budete chtít před vydáním pravděpodobně co nejlépe odladit. Integrovaný editor skriptů vám už při jejich psaní pomůže pomocí funkce intellisense (automatické doplňování). Samozřejmě není tak propracovaná, jako ta ve Visual Studiu, a díky dynamické nátuře jazyka má své limity, ale je příjemné mít alespoň její základ. Do kódu můžete pokládat breakpointy a pak program krokovat. Debugger za běhu odchytává chyby a zobrazí zásobník v době chyby. Při testování je také možné si zobrazit celý strom uzlů a grafy sledovaných parametrů (fps, paměť, počet vykreslených objektů, počet uzlů,…). Ke svižnému vývoji pomáhá živé editování, kdy jsou změny parametrů a uzlů ihned přenášeny do spuštěné hry. Toto živé editování funguje i bezdrátově skrze wifi.

Godot odděluje 2D a 3D vývoj, což za výhodu musí považovat každý, kdo chtěl dříve udělat jednoduchou 2D hru v Unity3D. Má dva oddělené editory a tři typy uzlů – 2D, 3D a GUI. Existuje ovšem několik způsobů, jak je spojit dohromady. Viewport lze použít jako render target, vykreslit do něj 3D scénu, použít ho jako texturu do 2D scény a na ni použít shader jako postproces efekt. Podobným způsobem lze GUI vykreslit do textury a tu aplikovat na 3D objekt. Možností není málo.

Shadery jsou díky OpenGL ES 2.0 backendu poněkud omezené. Zapomeňte na vlastní struktury, smyčky i vlastní předávané parametry mezi typy shaderů (k dispozici jsou jen dva, ale data můžete nacpat do jiných předávaných parametrů, které nepotřebujete). Jazyk pro shadery používá Godot také vlastní. Na pozadí vám pomáhá s výpočty světel, takže například nemusíte zjišťovat směr bodového světla. Některé připravené parametry vám pak předá jako vstup do třetí části shaderů (Lighting). Užitečnou vlastností je, že se shadery kompilují přímo v editoru, takže každou změnu hned vidíte, pokud ovšem některé parametry nevkládáte ze skritpu. Parametry můžete exportovat přímo do editoru, takže se grafici nemusí zabývat psaním kódu. Shadery vlastně nikdo psát nemusí, protože máte k dispozici vizuální editor shaderů, který si do Unity3D musíte dokoupit jako plugin.

Godot bohužel neobsahuje postproces shadery. K dispozici máte speciální uzel s několika základními efekty (FXAA, mlha, ambientní světlo, pozadí, hdr,..), ale vlastní psát nejdou. Simulovat je můžete například tím, že 3D scénu vykreslíte do viewportu přepnutého do render target režimu a pak na texturu použít 2D shader, ale to má svá omezení.

Spoustu funkcí jsem ani nestihl pořádně vyzkoušet. Uzel AnimationPlayer například zvládne animovat jakoukoliv hodnotu. Velmi užitečné. Pro síťové projekty máte k dispozici nízkoúrovňové objekty pro posílání dat pomocí transportních protokolů UDP a TCP. Světla můžete pro lepší kvalitu zapéct do textur, stejně jako global illumination (zapékání ovšem běží na jednom jádru a je pomalé). Pro lokalizování můžete využít server překladů (v podstatě slovník, kdy klíč je unikátní id a hodnota pak string) a importování textů z CSV souboru.

I když Godot patří ke špičce mezi open source enginy a je konkurence schopný i mezi komerčními, má své nedostatky. 2D engine patří mezi ty pokročilejší, ale ten 3D je tak generaci až dvě pozadu. OKAM Studio se totiž specializuje na mobilní tituly a engine vyvíjeli takovým směrem, kterým potřebovali. Věřím tomu, že se silnou stylizací můžete vytvořit hezkou 3D hru, ale na technologickou špičku se Godot dívá z velké dálky. Generátor částic by také potřeboval renovaci a spokojit se musíte se základními shadery (žádné smyčky, žádné vlastní struktury, omezený počet předávaných parametrů, atd.).

Budoucnost enginu vypadá velmi dobře. V plánu je založit fond, který by platil vývoj, takže by Juan Linietsky nemusel pracovat na enginu jen ve volném čase. V přípravě je nový web a také obchod s asety. Druhá verze Godotu přinese přepracovaný editor, který nově bude podporovat editaci více scén zároveň. GDScript by ve vzdálenější budoucnosti měl podporovat statické psaní, čímž by se zrychlilo provádění skriptů, a není vyloučeno ani přidání vizuálního skriptovacího jazyku. Mluvilo se také o podpoře VR zařízení. Největším milníkem má být kompletní přepsání 3D renderu, který by tak měl konečně dohnat dobu. Čeká se ovšem na to, až budou vydány specifikace Vulkanu, což bude asi ještě nějakou dobu trvat.

Výhody

– elegantní systém scén

– přívětivý k nováčkům

– GDScript – velmi integrovaný, jednoduchá syntaxe

– vhodný pro rychlé prototypování

– zároveň má dostatek funkcí pro seriózní vývoj

– pokročilý 2D engine

– hardwarově nenáročný

Nevýhody

– GDScript – pomalejší provádění kódu

– 3D engine je o generaci pozadu

– na první pohled není jasné, jak v případě scén využít dědičnost (nelze, je nutné použít kompozici – dědičnost funguje na úrovni skriptů)

– dokumentace tříd by mohla být lepší