Hrátky s Unreal Engine Část IV: Skriptujeme s Kismet
i Zdroj: PCTuning.cz
Hry Článek Hrátky s Unreal Engine Část IV: Skriptujeme s Kismet

Hrátky s Unreal Engine Část IV: Skriptujeme s Kismet

Aleš Ulm

Aleš Ulm

25. 6. 2010 03:00 32

Ve čtvrté části seriálu o Unreal Development Kitu si posvítíme na skriptovací editor Kismet. Díky němu lze ve hře vytvářet nejrůznější události, určovat jak budou objekty reagovat na vaše počínání a vůbec určovat, jak bude hra fungovat. Je to mocný nástroj, který je ale překvapivě jednoduchý i díky přehlednému vizuálnímu zpracování vazeb.

Reklama

První díl série Hrátky s Unreal Engine - Část I: První krok do nereálna najdete zde.
Druhý díl Hrátky s Unreal Engine - Část II: Příběh dvou místností najdete zde.
Třetí díl Hrátky s Unreal Engine Část III: Konec modrobílých kachlíků najdete zde.
Čtvrtý díl Hrátky s Unreal Engine Část IV: Skriptujeme s Kismet najdete zde 
Pátý díl Hrátky s Unreal Engine Část V: Trocha pohybu neškodí najdete zde
Šestý díl Hrátky s Unreal Engine VI: Kamera, akce, jedem… najdete zde
Sedmý díl Hrátky s Unreal Engine VII: Klid před bouří najdete zde

Vítejte u čtvrtého dílu našeho seriálu o UDK. Minule jsem slíbil, že si připravíme vlastní interaktivní střelnici, takže toho musíme stihnout opravdu hodně. Dnes si vysvětlíme, co jsou a jak fungují triggery a ponoříme se do hlubin skriptovacího editoru

Kismet

. Díky tomu budeme moci na konci dílu likvidovat terče a připravíme si půdu pro díl příští, kde naší střelnici dopilujeme k úplné dokonalosti…

Hrátky s Unreal Engine Část IV: Skriptujeme s Kismet
i Zdroj: PCTuning.cz

Jestliže chceme, aby se v naší úrovni začalo dít něco zajímavého, musíme to nejdříve nějak spustit. K tomu slouží například trigger. Trigger (či česky nejblíže spínač) je neviditelný objekt, který umístíte do úrovně buď v editoru, nebo třeba i ze skriptu za běhu programu. Jeho funkce je prostá – kromě jiného detekuje, jestli do něj někdo nebo něco vstoupilo, případně ho naopak opustilo. Úmyslně nepoužívám slovo hráč, protože i když vaše postava bude zřejmě nejčastěji tím, kdo bude nějaký trigger spouštět, tak onen trigger může reagovat v podstatě na libovolný předem nastavený druh objektů. Jakmile zaregistruje, že objekt, který ho zajímá (tedy například hráč) provedl akci, kterou si hlídá (třeba že hráč opustil jeho prostor), může vyvolat jednu nebo celý sled akcí a událostí, které mu nastavíte. Ty se připravují zejména ve schematickém vizuálním skriptovacím editoru Kismet, na který dnes také dojde řada.

Takže začneme vytvořením triggeru. Na libovolné místo ve vaší úrovni klikněte pravým tlačítkem a zvolte Add Actor a následně Add Trigger. Seznamte se – ta zelená podivnost (tedy zelená, pokud ji máte označenou) je váš první trigger. Ikona představující spínač vám usnadňuje jeho identifikaci, protože trigger nemá žádný viditelný model. Ten válec kolem ikony je vlastní prostor triggeru – tedy oblast, kterou si “hlídá”. Pokud postava vstoupí do této oblasti, trigger zavolá odpovídající událost (Touched). Když postava opustí tento prostor, zavolá se událost opačná (Untouched). Co se jeho umístění týká, tak nám pro teď postačí vědět, že je dobře ho umísťovat tak, aby se dotýkal povrchu, po kterém se postava pohybuje. Pokud chcete být přesní, klikněte na vybraný trigger pravým tlačítkem a pomocí Transform → Snap To Floor ho nechte přesně dosednout na podlahu. V tomto případě ale není přesnost nijak zvlášť nutná – když ho umístíte manuálně a i třeba trochu zanoříte do podlahy, tak to ničemu nevadí.

S triggerem můžete pohybovat, rotovat s ním – a hlavně ho zvětšovat a zmenšovat. Jak velkou oblast má trigger pokrývat, záleží na tom, čeho s ním chcete dosáhnout. Někdy bude malý (třeba na dlaždici, jejíž sešlápnutí otevře nějaké dveře), jindy může být veliký (pokud chcete například vědět, kdy hráč vstoupil do nějaké rozlehlé oblasti v herním světě). Občas se vám může hodit zase spíš trigger vysoký. Schválně, zkuste ho pomocí transformačního pomocníka udělat vyšší… Hm, moc se to nedaří, co? To proto, že standardně probíhá zvětšování či zmenšování objektů stejně ve všech směrech. Kostka tedy zůstane vždycky kostkou, nikdy ji neprotáhnete do kvádru. Něco podobného by se nám ale právě teď hodilo. Kdo z vás má nějaké zkušenosti s prací s víceméně jakýmkoliv modelovacím nástrojem, tak už ví, o čem je řeč. Musíme přepnout na tzv. neproporcionální změnu velikosti – tedy režim, kdy zvětšování a zmenšování můžeme provádět na vybraných osách. Do tohoto režimu se přepnete tlačítkem v horní liště (ikona před pulldown menu s přepínáním Local / World). Až mód přepnete, zkuste objekt znovu zvětšit – pokud potáhnete za vertikální táhlo transformačního pomocníka, trigger se protáhne pouze do výšky (resp. nahoru a dolů).

Takže trigger je nastaven a umístěn. Když se teď objevíte v místnosti a začnete do něj vbíhat, nebude se nic dít. To pochopitelně proto, že jsme mu ještě neřekli, na co má vlastně reagovat a co má pak udělat. Ještě než to ale provedeme, tak si ukážeme jedno usnadnění. Trigger není při hraní vidět. Z toho důvodu může být občas jeho ladění problematické, protože v určitých případech si nemusíte být jistí, jestli tam třeba vůbec je, nebo kde přesně se nachází. Abychom věděli, že ho tam opravdu máme, můžeme otevřít jeho vlastnosti (pravé tlačítko a Trigger Properties nebo F4) a v části Display odškrtnout Hidden. Při hraní teď uvidíte ikonu na místě jeho středu

Co tedy udělat, aby na nás trigger zareagoval? Použijeme zmíněný Kismet. Nechte označený trigger a otevřete editor Kismet ikonou zeleně orámovaného písmene K. Tak to je on, Kismet. Teprve tady začíná ta opravdová zábava při tvorbě hry, ale to uvidíte brzy sami. Ke Kismetu se budeme vracet velmi často, pro teď se ale jen rychle naučíme a vysvětlíme základy jeho používání.


Klikněte do tmavě šedivého prostoru pravým tlačítkem a zvolte New Event Using Trigger_0 (jméno triggeru může být jiné – pokud tam takováhle volba není vůbec, nemáte nejspíš trigger označený). Následně vyberte Touch. Vytvořili jste nový objekt typu event – událost. Teď klikněte pravým tlačítkem někam kousek vedle a vyberte New Action → Voice/Announcement → Play Announcement. Tak a tím jste vytvořili objekt typu akce. Teď ještě klikněte na černý čtvereček označený Touched u eventu, potáhněte kurzor na černý čtvereček u objektu akce označený In a pusťte. Vytvořilo se spojení.

Pojďme se podívat, co jsme to vlastně stvořili. Abychom mohli pochopit základní principy fungování Kismetu, řekneme si hned teď, co to je událost (častěji však o ní budeme mluvit jako o eventu – budeme na ni narážet na různých místech, tak ať vždy víme, o čem je řeč) a co akce.

Event je událost vyvolaná nějakou akcí. Eh, dost kostrbaté a nesrozumitelné, že? Představte si, že se v herním světě něco stane – postava vstoupí do nějaké zóny, jedno auto narazí do druhého, dohoří oheň po výbuchu, hráč klikne na tlačítko v menu, nebo se třeba nahraje a začne nová úroveň hry. Když se některá z těchto nebo řady dalších dostupných událostí stane, počítač zjistí, jestli k ní neexistuje v Kismetu odpovídající event. Zjednodušeně řečeno – pokud třeba v našem případě hráč vstoupil do prostoru triggeru, engine to zjistí a provede některé úkony. Předně se podívá do jeho nastavení a zkontroluje, jestli má trigger reagovat na druh objektu, který do něj vstoupil. Pokud ano, pak zjistí, jestli v Kismetu existuje pro tento trigger event typu Touch. Protože jsme takový event vytvořili, engine ho aktivuje.

Samotná aktivace eventu ale nic neudělá. Představte si to, jako že do objektu eventu engine vpustí proud. Pokud bychom neudělali vazbu na akci, nic by se nestalo. Protože jsme ale tento event propojili s akcí, v momentě kdy se aktivuje, pokračuje program (stejně jako by se spojem rozeběhl proud) po vytvořené vazbě dál, do akce.

Hrátky s Unreal Engine Část IV: Skriptujeme s Kismet
i Zdroj: PCTuning.cz

Blade & Soul - Korejská MMORPG

Možná se ptáte, proč má na sobě náš event tři černé čtverečky – různě popsané výstupy. Tohle je věc, která by vás mohla trochu zmást, ale přece jen už se trochu známe a vím, že o vás nemusím mít strach. I když jsme nechali vytvořit event typu Touch, ve skutečnosti vznikl souhrnný event, který se bude aktivovat nejen při dotyku (vstupu) do oblasti triggeru, ale i v různých souvisejících případech. Aktivuje se také, například pokud postava daný trigger opustí (untouched). Jakmile si eventy trochu „osaháte“ a pár jich projdete, rychle pochopíte, podle jaké logiky jsou seskupeny.

V našem případě se na eventu vyskytuje Touched, Untouched a Empty. K aktivaci tohoto eventu tedy může dojít více než jedním způsobem a „proud“ z něj pokračuje ven výstupem odpovídajícím způsobu jeho aktivace. Pokud je tento event aktivován, protože hráč vstoupil do oblasti triggeru, program bude z eventu (pokud nějaká vazba dál existuje) pokračovat vazbou vycházející z výstupu označeného Touched. Pokud hráč trigger opustí, aktivuje se ten samý event, ale „proud“ vyjede výstupem Untouched a bude aktivovat další do něj napojené objekty.


Event je tedy něco, co je aktivováno (až na výjimky) enginem. Akcemi na druhou stranu říkáme my enginu, že má něco udělat. Například objekt akce, který jsme vytvořili – Play Announcement – říká enginu, aby zobrazil hráči nějaké hlášení na obrazovce. Teď se tedy stane následující:

  • hráč vstoupí do triggeru
  • engine aktivuje námi vytvořený event
  • protože se jednalo o událost typu Touched, tak z eventu program pokračuje tímto výstupem dále do akce, která mu říká „přehraj hráči hlášení“

Dobrá, ale jaké že to je hlášení? Každý objekt vytvořený v Kismetu (event, akce,…) má u sebe různá nastavení, kterými ovlivňujete, jak se chová a co přesně dělá. Pokud označíte naši akci Play Announcement, uvidíte v okně Properties různé vlastnosti. Rozklikněte Announcement a do kolonky Announcement Text vepište text hlášení, který se má hráči zobrazit. Teď level spusťte a vejděte do oblasti triggeru.

Pokud jste udělali vše správně, tak se vám u pravého kraje obrazovky zobrazil vámi zadaný text. Pěkné, ne?

Otevřete znovu Kismet. Drobný postřeh – pokud jste okno kismetu nezavřeli, ale jen minimalizovali, vznáší se někde vlevo dole a kliknutí na ikonu Kismetu ho nemusí otevřít. Pokud se tedy snažíte Kismet zoufale a marně otevřít a nejde to, zkuste se podívat, jestli ho už nemáte minimalizovaný.

Teď vytvořte stejným způsobem spojení mezi výstupem Untouched a vstupem In u akce. Jestli jste porozuměli principu fungování Kismetu, tak už chápete, co se teď stane. Stejné hlášení se hráči zobrazí při vstupu do triggeru i při jeho opuštění. Hm, ale to asi není úplně dobrý nápad, co? Pro opuštění triggeru uděláme jiné hlášení. Takže teď nejdříve zrušíme vazbu, kterou jsme právě vytvořili. Zrušení vazby lze provést více způsoby – buď kliknete spolu s držením klávesy Alt na vstup nebo výstup odkud/kam vede (ale pozor, to zruší všechny vazby vedoucí do konektoru, na který jste kliknuli), nebo na některém z těchto dvou konektorů kliknete pravým tlačítkem a smažete vazbu pomocí Break Link To + odpovídající položka.

Teď tedy vytvoříme druhé hlášení. Postupujte buď stejným způsobem jako u prvního, nebo si první označte a vytvořte jeho kopii pomocí obvyklého CTRL-C / CTRL-V. Tomuto hlášení zadejte jiný text a napojte ho na výstup Untouched. Pokud se vám objekty na obrazovce překrývají, nezoufejte. Levým tlačítkem se posunujete oblastí Kismetu – když bude chtít s nějakým označeným objektem (či více objekty) pohnout, podržte při tažení zároveň CTRL.

Takže vzhůru do hry a naběhnout do triggeru. Ale co to… Při jeho opuštění se žádná hláška neukázala. Navíc se, když do něj vstoupíte podruhé, nezobrazí znova ani ta vstupní. Příčina je trochu zákeřná, tak se na ní pojďme podívat. Vraťte se do Kismetu, označte event a podívejte se do jeho vlastností. Vidíte položku Max Trigger Count? To je právě ta zákeřnost. Tohle číslo udává, kolikrát se může tento event aktivovat a jeho defaultní hodnota je 1. První aktivace proběhla, když jsme do triggeru vstoupili poprvé. Podruhé se engine pokusil event aktivovat, když jsme ho opustili, ale protože narazil na tuhle podmínku, k aktivaci nedošlo a tím logicky ani k navazující akci zobrazení hlášky. Když zadanou hodnotu změníte na nulu, podmínka se ignoruje a event se může aktivovat bez omezení – nebo si třeba zkuste zadat nějaké vyšší číslo a uvidíte, že to tak opravdu funguje.

Teď se sluší vám poblahopřát, protože jste úspěšně pronikli do základů skriptování v Kismetu. Ale když nám to tak pěkně, jde, tak by byla škoda přestat a proto si ukážeme ještě jeden nebo dva triky.


Vraťte se do Kismetu. Asi chápete, že aktivace eventu nemusí spouštět jednu akci ale celou řadu. Klidně si zkuste k výstupu Touched ještě jednu akci pro výpis textu a uvidíte, že se po vstupu do triggeru objeví oba texty. Existuje ale ještě druhá možnost, jak napojit více akcí. Vidíte výstup out na pravé straně našich akcí? Tam můžeme připojit akce další. Program pak z eventu vjede do první akce, provede ji, vyjede z jejího výstupu a pokračuje do další. Takže teď byste měli být schopni zobrazit dvě hlášení za sebou, že? Jenže se nám možná nelíbí, že takhle se objeví obě v podstatě okamžitě. V první akci totiž program na nic nečeká – pošle prostě text na obrazovku a okamžitě poté vstoupí do akce následující a provede to samé.

Řešení je prosté. Klikněte pravým tlačítkem na výstup první akce a vyberte Set Activate Delay. Sem můžete zadat v sekundách dobu, kterou má program na tomto výstupu čekat, než pojede dál. Takže když sem vložíte 2.5, zobrazí se následující hláška dvě a půl vteřiny po té první.

Že nám to jde s tím skriptováním ale od ruky, co? Když vidím, jak pěkně postupujeme dopředu, tak se dnes s Kismetem seznámíme ještě blíž.

V minulém díle jsem sliboval nějaké to střílení, takže se do toho pustíme. To, co jste udělali v úrovni do této chvíle, tam klidně nechte, ničemu to nepřekáží. Otevřete si Content Browser a nechte vyhledat cube. Asi na čtvrtém místě by se měl nacházet statický model Cube. Nenechte se zmást, že má stejnou texturu jako UCG tvary, které jsme vytvářeli v minulých dílech, jedná se opravdu o statický model. Tahle modrobílá šachovnice je víceméně upozornění, že nám ještě zbývají nějaké věci, kterým by bylo dobře nějakou texturu (resp. materiál) přiřadit.

Kostku si vložíme do scény. Pokud byste ji teď popadli a do scény prostě přetáhli, sice by se tam model objevil, ale engine by ho logicky považoval za statický model. Díky tomu bychom ho například někdy později nemohli animovat, nemohl by reagovat na různé podněty atp. Proto ho vložíme jinak. Označte ho, do scény klikněte pravým tlačítkem a proveďte Add Actor → Add InterpActor StaticMesh EngineMeshes.Cube. Tím enginu říkáme, aby do scény vložil statický model, ale aby s ním pracoval jako s tzv. InterpActorem, objektem, se kterým lze provádět různé interakce. Pokud vás zajímá proč tomu tak je, tak vydržte do příštího dílu, kde si tohle rozebereme. To, že je objekt správně vložený, poznáte hned už třeba z jeho názvu, který uvidíte po jeho výběru ve středu spodní lišty nebo například v nadpisu okna s jeho vlastnostmi. Pokud je to první objekt tohohle typu ve scéně, bude se jmenovat InterpActor_0.

Ve scéně nám leží kostka, do které budeme střílet. To by samozřejmě ničemu nevadilo, ale realističtější bude, když z kostky uděláme tenkou desku, na kterou pak v budoucnu dáme texturu terče (nebo siluetu postavy, to už závisí na míře vaší militantnosti). Protože už umíme měnit neproporcionálně rozměry objektu, neměl by to být žádný problém. Máte? Výborně…


Kostka, kterou jsme do scény vložili, slouží jen jako jakýsi pomocný model, proto není ani nijak pořádně otexturovaná. Přestože u těchto importovaných statických modelů se texturování provádí v externím editoru (Max, Maya), můžeme texturu upravit i tady, byť to není úplně čisté řešení. V Content Browseru si najděte nějaký materiál, jehož textura se vám bude líbit a pusťte ho do scény na model kostky. Její textura se změnila. Výsledek zřejmě vypadá sice relativně dobře, ale to jen proto, že náš statický model je úplně primitivní. U jakéhokoliv komplikovanějšího objektu by výsledek nebyl nijak zvlášť pěkný. Pro teď nám to ale postačí.

Pokud máte desku stále ještě označenou, vstupte do Kismetu pomocí pravého tlačítka a vytvořte event tímto způsobem: New Event Using InterpActor_0 → Take Damage. Tento event se aktivuje v momentě, kdy způsobíme objektu nazvanému InterpActor_0 (tedy naší desce) nějaké poškození. A protože už umíme udělat akci, která něco vypíše na obrazovku, tak toho hned využijeme. Vytvořte ji, vložte do ní nějaký text („Deska zasažena!“ atp.) a napojte na výstup eventu Out. Jediný výstup se u tohoto eventu jmenuje Out a nikoliv třeba Damage Taken právě proto, že je jediný – event se aktivuje vždy pouze způsobením poškození, takže má jediný výstup. Teď se ještě podíváme na nastavení našeho nového eventu. Předně tam opět vidíme Max Trigger Count s hodnotou 1. Díky tomu by deska na zásah zareagovala pouze poprvé. Změníme hodnotu na 0. Druhou editací, kterou provedeme, je snížení položky Damage Treshold. Tato položka udává velikost poškození, které je třeba, aby se event aktivoval. Protože ale v tuhle chvíli nevíme, jaké poškození naše výstřely způsobují, raději hodnotu snížíme na 1.

Když tohle máme, vyzkoušíme si náš výtvor hned naživo. Spusťte hru a střelte do desky. A protože život by byl příliš nudný, kdyby všechno fungovalo hned a samo, tak se nic neděje. Někteří z vás si i možná všimli proč. Střela deskou prolétá. To proto, že objekty třídy IntepActor nemají defaultně zapnuté kolize a když střela do desky nenarazí, ani ji „nezraní“. Otevřete okno s vlastnostmi desky a v oddílu Collision změňte Collision Type z COLLIDE_NoCo­llision (objekt nekoliduje s ničím) na COLLIDE_BlockWe­apons (objekt koliduje pouze se střelami). Znovu desku otestuje pořádnou dávkou ze své energetické zbraně. Pěkné, ne?

Co dál? Když už jsme tak zběhlí ve skriptování Kismetu, mohli bychom třeba nechat desku po zásahu zmizet a po nějaké době objevit. Když uděláme pak takových desek víc, budeme mít vlastně už základ takové malé střelnice.

Vstupte do Kismetu a vytvořte akci New Action → Toggle → Toggle Hidden. Tím vznikne trochu komplikovaně vyhlížející akce, který umožňuje zobrazovat a skrývat objekty v úrovni. Pokud nám v tuhle chvíli eventy a akce různě „přelézají“ přes sebe tak nezapomeňte, že pomocí držení CTRL si v nich můžete udělat rychle pořádek.

Hrátky s Unreal Engine Část IV: Skriptujeme s Kismet
i Zdroj: PCTuning.cz

Vytvořte vazbu z výstupu z eventu do vstupu Hide naší nové akce. Díky tomu se po aktivaci eventu nejen vypíše naše hlášení, ale objekt se zároveň skryje. Tedy – měl by se skrýt, ale nestane se to. Problém je v tom, že program dorazí v nějaký moment do akce, která mu říká „skryj objekt“, jenže bohužel netuší, jaký objekt máme na mysli. Ano, do akce vstoupil z eventu, který vyvolalo střelení do desky a tento event „ví“ jaký objekt ho aktivoval. Jenže program nemůže tušit, že chceme skrýt právě tenhle objekt. Co kdybychom třeba střelením do desky chtěli nechat zmizet něco úplně jiného?


To nám krásně nahrává na to, abychom si ukázali další ze základů fungování Kismetu. Vidíte na naší nové akci růžový vstup pojmenovaný Target? Jeden ze způsobů, jak akci „říct“, na jaký objekt má vlastně působit, je nechat ten příslušný objekt vstoupit do akce přes tento konektor. Postup je velmi prostý. Jestli máte ve scéně označenou naši desku, klikněte do Kismetu pravým tlačítkem a vyberte New Object Var Using InterpActor_0 (název může být jiný – podle toho, jak se jmenuje vaše deska). Tím jsme v Kismetu vytvořili objekt (proměnnou) který tu představuje naši desku. Teď můžete z konektoru Target vytáhnout vazbu do tohoto objektu a pak zkusit hru spustit. Jeden výstřel a objekt je pryč. Zkuste vystřelit ještě jednou…

„U Joviše! Holmesi, deska je pryč ale výstřely se o ní dál zaráží. Jako by byla… neviditelná!“ Slavný detektiv se pobaveně usmál, láskyplně odložil své vzácné housle a významně vztyčil ukazovák jako vždy, když se chystal svého přítele začít poučovat. Což bylo, jak si Watson dobře uvědomoval, bohužel až příliš často. „Ale vždyť je to tak prosté, drahý Watsone. Akce, která v Kismetu proběhla, desku nezničila, jen ji skutečně skryla, takže není vidět. Její model však ve scéně nadále zůstává a střely se o něj logicky dál zaráží.“ „Zatraceně… Co s tím tedy provedeme?“ Holmes se nepřestával usmívat. Netrpělivost jeho druha ho dokázala vždy pobavit.

Vytvořte další akci: New Action → Actor → Change Collision. Její pomocí změníme po zásahu nastavení desky tak, aby znovu nekolidovala s ničím, a střely jí budou prolétat. Tuto akci můžeme umístit na stejnou úroveň jako tu, která desku skryje (a tedy ji navázat přímo na výstup z eventu), nebo jí můžeme napojit na výstup “skrývací” akce, takže proběhne hned po ní – což nám ale nijak nevadí. V nastavení akce vyberte jaký druh kolize má akce vlastně nastavit (COLLIDE_NoCo­llision) a pak je třeba – jak už to dobře známe – určit, na jaký objekt akce působí. Proměnnou s objektem nemusíte vytvářet znova, stačí z konektoru Target vyvést spoj do objektu, který už jsme vytvořili. Asi si všimnete, že se situace v Kismetu začíná zvolna znepřehledňovat. Není ale nutné zoufat, někdy příště si ukážeme pár triků, které nám pomohou udržet si ve skriptech pořádek.

Jestli jste se drželi správně všech pokynů, máte teď ve scéně desku, která po zásahu zmizí a přestane blokovat střely (stejně jako v jiných případech se toho dá docílit i jinak, ale snažíme se obsáhnout co nejvíc různých funkcí v Kismetu).

Teď se vrhneme na znovuzobrazení desky a znovunastavení způsobu jejího kolidování na kolizi se zbraněmi. Taková akce by ale neměla smysl, kdybychom mezi skrytí a znovuzobrazení nedali žádnou časovou prodlevu a proto znovu využijeme toho, co jsme si ukázali v začátku článku. Vytvořte druhou akci typu Toggle Hidden. Teď chceme, aby objekt naopak odhalila, proto vyvedeme vazbu z výstupu poslední akce (nebo, pokud jsou všechny na stejné úrovni tak libovolné z nich) do vstupu UnHide a akci znovu přiřadíme příslušný objekt do vstupu Target. Pravým tlačítkem klikněte na výstup akce, ze které program do té nově vytvořené vstupuje a pomocí Set Activate Delay nastavte počet vteřin, který má program počkat. Za novou akci pak napojte druhou akci Change Collision pomocí které nastavíte kolizi zpět na COLLIDE_ BlockWeapons.


V tuto chvíli máme desku, kterou když zasáhneme, tak zmizí a objeví se po pevně daném čase. To je ale trochu nudné a předvídatelné. Nebylo by možné to upravit tak, aby byl ten čas čekání náhodný? Asi nečekáte, že bych vám teď řekl, že to nejde, že? Způsobů je víc, tak si jeden ukážeme.

Tím způsobem, kterým zadáváme dobu, kterou bude program na výstupu z nějakého objektu čekat, náhodný čas nedocílíme. Existuje však jiná možnost, jak donutit program počkat. Existuje speciální akce, která sama o sobě dělá to, že v sobě běh programu pozdrží a teprve po zadané době pustí dál. Tuhle akci vytvoříme pomocí New Action → Misc → Delay. Tato akce defaultně pozdrží běh programu o 1 vteřinu. Zrušte to naše čekání na výstupním konektoru (zadáním doby čekání 0) a vazbu mezi skrytím a objevením desky „protáhněte“ skrze akci delay – do vstupu Start (tím se delay rozběhne) a z výstupu Finished (ten se aktivuje, když se delay dokončí) do akce zobrazení desky.

Když se teď podíváte do vlastností akce Delay, uvidíte, že jsme si zatím moc nepomohli. Délka čekání se opět zadává v sekundách a po možnosti nastavit nějakou náhodnost tu není ani památky. Zapátráme tedy přímo na zobrazení objektu – vidíte ten modrý vstup označený Duration? To je další možnost, jak do akce vložit informaci o tom, jak dlouho má čekat. Jak na to?

Při kliknutí do Kismetu pravým tlačítkem máte v nabídce položku New Variable. Tím vytvoříte novou proměnnou. Protože se čas zadává jako desetinné číslo, pokračujeme do Float a protože chceme, aby bylo náhodné, tak na závěr odklikneme Random Float. Vytvoří se objekt, který představuje náhodně vytvořené desetinné číslo. V jeho vlastnostech pod Min a Max nastavíme minimální a maximální hodnotu čísla (a tedy doby, po kterou zůstane deska skrytá). Zkusíme třeba 2 a 5. Objekt připojíme do vstupu Duration akce Delay – čas uvedený přímo v nastavení akce Delay se teď bude ignorovat.

A je to! Deska se už po zásahu objevuje v náhodném intervalu od dvou do pěti vteřin.

Jestli jste dočetli až sem a všechno pochopili, tak si můžete gratulovat, protože jste zvládli základy skriptování v Kismetu. Ta spousta věcí, které jsme se dnes naučili, už vám nepochybně stačí k tomu, abyste si začali se skriptováním hrát. Teď by pro vás neměl být problém udělat objektů víc a pořádně si zastřílet. A aby nezůstalo jen u střílení – co si udělat někde dveře a nechat je zmizet když vstoupíte do nějakého triggeru? To přece zvládnete, ne? Ještě vám do příště poradím jeden důležitý event – pokud budete chtít něco spustit hned při startu úrovně (třeba rovnou něco skrýt nebo zobrazit), využijte pro to event Level Startup, který se zavolá při každém startu úrovně.

V příštím díle dovedeme naší střelnici k dokonalosti. Ukážeme si další zajímavé akce v Kismetu a také jak docílit toho, aby se deska při zásahu položila a jak ji donutit, aby scénou projížděla. Začneme si také počítat a zobrazovat skóre,

Reklama
Reklama

Komentáře

Nejsi přihlášený(á)

Pro psaní a hodnocení komentářů se prosím přihlas ke svému účtu nebo si jej vytvoř.

Rychlé přihlášení přes:

Google Seznam
Reklama
Reklama