Telekineze pro začátečníky
22.07.2020
Telekineze pro začátečníky

V této části seriálu o herním vývoji si vytvoříme speciální schopnost, telekinezi.

Pokud jste někdy přemýšleli nad tím, jak to hry jako Control, Bioshock nebo Psi Ops: Mindgate conspiracy dělají, pak jste na správném místě. Vytvoření telekineze je snadnější, než to vypadá!

V tomto díle budeme replikovat herní mechaniku telekineze, jak ji vidíme např. ve hře Control:

control.gif

Nastavení scény

V minulých dílech jsme do scény přidali krabici, objekt Box. Unity teď jen řekneme, že se ke krabici má chovat jako k fyzikálnímu objektu, a to přidáním komponenty Rigidbody.

 telekineze

Nyní krabici vytvoříme a přiřadíme nový tag, který pojmenujeme "Box". Skript telekineze se bude orientovat podle tohoto tagu a bude schopen ovládat jen takto označené objekty.

telekineze

telekineze  

telekinezeObjekt "Box" teď jen párkrát duplikujeme, aby si hráč měl na čem otestovat svoji novou schopnost (Duplikace: pravé tlačítko na objekt -> duplikovat).

tk-5.jpg

Dále si vytvoříme prázdný objekt, a pojmenujeme ho HoldPosition. Přiřadíme mu objekt hráče jako rodičovský objekt a jeho pozici nastavíme před hráče - tento objekt bude sloužit jako záchytný bod, kam bude Box přitahován telekinetickou silou. Měl by proto být umístěn v zorném poli kamery hráče.

telekineze

Funkce Telekineze

Vytvoříme si nový skript, Telekinesis. (Veškerý kód je mimochodem dostupný na mém githubu, odkaz níže).

Chci přitahovat objekty, na které namířím bodem ve středu obrazovky. To provedu pomocí metody ViewportPointToRay, které předám souřadnice středu obrazovky (0.5 x, 0.5 y). Z tohoto bodu bude "vystřelován" paprsek, u kterého mohu detekovat, do jakého objektu naráží.

Pokud narazím do objektu, co je dostatečně blízko, zkontroluji, zda má tag "Box". Pokud má, tak mu nastavím jako rodičovský objekt námi vytvořený HoldPosition. Pak zmrazím fyzikální objekt na místě (jeho rotaci a pozici) a zavolám funkci pro rotaci drženého objektu (rotaci implementuji na konci, prozatím je to prototyp funkce).

telekineze

Funkce CheckDistance níže pouze kontroluje vzdálenost mezi přitahovaným objektem a cílovou pozicí HoldPosition. Funkce MoveObjectToPosition lineárně interpoluje pozici objektu až do cílové HoldPosition. Pro uvolnění objektu je použita jednoduchá funkce ReleaseObject, která pouze dereferencuje všechny proměnné. A poslední funkce ShootObject vystřelí objekt směrem pohledu kamery tím, že objektu přidá fyzikální sílu (v režimu impulzu).

telekineze

Efekt rotace předmětu provedeme pomocí náhodné rotace objektu. Pro každou osu zvolíme náhodnou hodnotu, při každém přitáhnutí bude pak rotovat jiným směrem a rychlostí.

telekineze

Máme vše připraveno k použití, teď jen hráči musíme umožnit samotnou telekinezi používat. Namapujeme funkce na vstupní ovládání.

Ve funkci Start  inicializujeme hodnotu throwForce a ve funkci Update se postaráme o vstup. Při stisku levého tlačítka myši hráč přitáhne objekt. Při držení pravého tlačítka "nabije" telekinezní schopnost a vrh bude silnější, čím déle bude držet. Při pouhém stisku hráč vrhne objekt defaultní silou. A při stisku F objekt upustí.

telekineze

 

Poslední úpravy

Nás skript Telekinesis přidáme hráčovi - Player - a přiřadíme nutné proměnné jako Camera, HoldPosition a hodnoty pro sílu vrhnutí a vzdálenost přitahování.

Pro snadnější míření na objekty si ještě vytvoříme primitivní UI zaměřovač. Vytvoříme nový objekt - Image (plátno Canvas se vytvoří automaticky).

Obrázek Image připneme do středu obrazovky:

telekineze

Jeho pozici nastavíme na (0,0,0), aby se zarovnal přímo do středu. A jeho výšku a šířku změníme na 10. Source Image nastavíme na Knob. Ve středu obrazovky bychom měli mít malou tečku.

telekineze 

telekineze

Teď už jen stačí hru spustit a jsme hotovi.

Výsledek

telekineze

Pro kompletní funkční kód navštivte můj github. Doufám, že jste si tvoření nové schopnosti užili. V dalším díle se podíváme na to, jak můžeme naši nově nabytou schopnost použít na hordu nepřátel ze třetího dílu.

Jan Jileček