10. Aug 2023
AndroidZvýš atraktivitu svojej aplikácie: Vstavané hry v mobilných aplikáciách (embedded games)
Prvok gamifikácie je zaujímavou cestou, ako zvýšiť príťažlivosť aplikácie pre používateľa. Či už sa jedná o vášnivého zberateľa ocenení, človeka súťaživého, znudeného alebo pre niekoho, kto si hraním chce zarobiť na nejakú zľavu. Gamifikačných ciest existuje mnoho. Už len vytvorenie avatara, či sledovanie progresu je pre mnohých používateľov postačujúce, aby dosiahli ciele, ku ktorým ich aplikácia nabáda. Teraz sa však budeme baviť výlučne o hrách.
Ak by bol vyvíjaný produkt výlučne hrou, pre jeho vývoj by sme použili existujúce herné frameworky akými sú napríklad Unity, Unreal Engine, či trošku menej známy Godot alebo Cocos2D. Týchto frameworkov je veľa a ešte viac by sme našli knižníc. My sa však skúsime povenovať trochu špecifickejšej téme: Ako vložiť hru do už existujúcej aplikácie?
* Rozdiel medzi frameworkom a knižnicou je výborne popísaný v tomto článku.
Čo je vstavaná (embedded) hra?
Od vstavanej hry budeme očakávať viacero špecifických vlastností/schopností:
- hru otvoríme z ktoréhokoľvek miesta aplikácie,
- hra bude bežať v rámci aplikácie - nespustí sa nová samostatná aplikácia,
- obojstranná komunikácia medzi hrou a aplikáciou - možnosť poslať dáta z natívnej aplikácie do hry a naopak.
Samozrejme nás vedia napadnúť aj ďalšie otázniky… Bude hra zaberať iba časť obrazovky alebo bude fullscreen? Bude 3D, 2D, či využívať fyziku vo forme kolízii, či voľného pádu?
Natívny vývoj
Klasickým problémom natívneho vývoja je zdvojená implementácia. Všetko, čo naprogramujeme pre Android, musíme naprogramovať aj pre iOS. Zároveň ak by sme chceli robiť aplikáciu, čo len o trochu zložitejšiu ako pexeso, museli by sme použiť pomocnú knižnicu (alebo si celý herný cyklus a fyzický engine napísať sami). Tieto pomocné knižnice majú rozdielne rozhrania pre mobilné platformy, pretože sú špecifické pre jazyk. Android by musel použiť napríklad LibGDX, či Korge, iOS by využil zrejme SpriteKit.
Toľko krátko k obmedzeniam, či skôr nevýhodám. Výhodou je samozrejme extrémne dobrá previazanosť medzi aplikáciou a hrou. V podstate máme neobmedzené možnosti. Niektoré z nich si vyžadujú len malé úsilie, no z niektorých by sme ošediveli.
Multiplatformový vývoj (Flutter)
Alternatívou proti natívnemu vývoju je multiplatformový vývoj. Osobne za schodné multiplatformové riešenia považujem len Flutter, Kotlin Multiplatform a v niektorých prípadoch React Native. React Native nie je vždy vhodná voľba kvôli výkonu (diskutabilné), Kotlin Multiplatform je vhodný pre zdieľanú aplikačnú logiku a hoci už máme k dispozícii Compose Multiplatform, rozhodne nemôžeme hovoriť o vhodnej podpore pre vývoj hier. Takouto rýchlou vylučovacou metódou nám zostáva len Flutter a herná knižnica Flame.
Multiplatformový vývoj vyrieši problém s počtom programátorov pracujúcich na hre. Pri skúsenom programátorovi aj čas potrebný pre vývoj, avšak má to háčik:
- Ťažšia zastupiteľnosť programátora. Flutter programátorov je menej ako natívnych.
- Veľkosť multiplatformovej aplikácie je o niečo väčšia (článok k tejto téme pre framework Flutter).
- Pridanie hry do už existujúcej natívnej aplikácie je problematickejšie (dokumentácia pre framework Flutter).
Z časového hľadiska je však multiplatformový vývoj hry výhodný. Ale v prípade, ak si nie sme istí spomínanou zastupiteľnosťou, plne sa mu vyhýbame.
Herné engines (Unity)
Ak by sme chceli použiť viac známe nástroje pre vývoj hier, siahnuť by sme mali po herných engines. Poďme sa teda pozrieť po alternatívach.
A nebudeme hľadať dlho. Možno ma niekto opraví, pretože touto cestou som sa ešte nevybral, ale do úvahy zdá sa pripadá len Unity Framework. Do úvahy pripadá z toho titulu, že ako jediný je schopný fungovať ako vstavaný engine s obojstrannou komunikáciou s natívnou aplikáciou. Ostatné engines nedokážu prijímať príkazy z natívnej aplikácie, posielať výsledky z hry do natívnej aplikácie alebo ani jedno ani druhé.
Tak teda Unity a jeho nevýhody:
- Unity musí zobrazovať logo UNITY pri spúšťaní,
- veľkosť aplikácie je najväčšia oproti ostatným možnostiam,
- je zbytočne rozsiahly pre menšie hry.
V tomto frameworku však dokážeme vytvoriť čokoľvek, jazyk C# je príjemnejší ako Dart vo Flutter a nadšencov, ktorí v Unity vytvorili aspoň základnú hru je dosť. Prečo ho nevolíme my, je obvykle veľkosť aplikácie, zbytočná rozsiahlosť a tak trochu aj neznalosť jazyka.
Záver
Ak chceme hru vložiť do už existujúcej aplikácie, máme k dispozícii 3 alternatívy:
- Natívny vývoj (Android - Kotlin, iOS - Swift)
- Multiplatform (Flutter)
- Herný engine (Unity)
Po natívnom vývoji siahame, ak je hra veľmi úzko prepojená s aplikáciou a môžeme si dovoliť vyťažiť dvoch ľudí na “duplicitnú prácu”. Akonáhle je hra o čosi zložitejšia, programátori oboch platforiem zrejme stratia aj schopnosť vzájomnej kontroly, kvôli obrovskej rozdielnosti používaných nástrojov.
Flutter je prostredná cesta, ktorou sme sa párkrát vydali aj my. Zbavíme sa duplicitnej práce, aj veľkého kladiva v podobe obrovských herných frameworkov. Trpieť však budeme na ťažkopádnosť jazyka a učenie pomerne neznámeho herného engine.
Unity je výborné riešenie, ak sa hra má stať základným prvkom aplikácie alebo má byť zložitejšia. Zastupiteľnosť programátora nemusí byť katastrofa, avšak pre väčšinu vstavaných hier je Unity zbytočne rozsiahle. Ak chcete robiť hru v 3D, Unity sa zrejme nevyhnete.
Jednoznačného víťaza pre všetky typy aplikácii nemáme, avšak máme aspoň približnú predstavu, ako sa máme rozhodnúť. Ak máte ku vstavaným hrám osobné príspevky, budeme radi za každú konštruktívnu myšlienku.