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:
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.
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.
Objekt "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).
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.
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).
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).
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í.
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í.
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:
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.
Teď už jen stačí hru spustit a jsme hotovi.
Výsledek
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