• Ei tuloksia

Animaatiotekniikat pelimoottorissa

N/A
N/A
Info
Lataa
Protected

Academic year: 2022

Jaa "Animaatiotekniikat pelimoottorissa"

Copied!
42
0
0

Kokoteksti

(1)

Mikael Toivola

Animaatiotekniikat pelimoottorissa

Metropolia Ammattikorkeakoulu Insinööri (AMK)

Tieto‑ ja viestintätekniikka Insinöörityö

10.6.2021

(2)

Tekijä: Mikael Toivola

Otsikko: Animaatiotekniikat pelimoottorissa

Sivumäärä: 38 sivua

Aika: 10.6.2021

Tutkinto: Insinööri (AMK)

Tutkinto‑ohjelma: Tieto‑ ja viestintätekniikka Ammatillinen pääaine: Mediatekniikka

Ohjaaja: Lehtori Antti Laiho

Insinöörityössä oli tarkoituksena perehtyä animaation tuotantoprosessiin valmiissa pelimoottorissa. Projekti oli reaaliaikaisen strategiapelin esittelyversio, joka demon- stroi animoituja hahmoja ja objekteja pelimaailmassa. Tavoitteena oli luoda elävä maailma animaation avulla. Projekti suoritettiin itsenäisesti. Valmiin pelimoottorin käyttö tarjosi hyvän lähtöpisteen ja nopeutti prosessia.

Videopelit ovat täynnä animaatiota. Animaatiot tarjoavat pelaajalle informaatiota ja te- kevät peleistä visuaalisesti kiinnostavampia.

3D‑mallit valmistettiin ja animoitiin bone‑based‑animaatiota käyttäen Blender‑ohjel- massa. Inverse kinematics ‑tekniikka, jota ei ole pelimoottorissa, nopeutti animointia.

Sitten mallit siirretiin Unity‑moottoriin, missä sen Mecanim‑kokonaisuutta ja omia skriptejä käytettiin animaatioiden ohjaamiseen. Animaatiosta toiseen siirtyminen ja usean animaation samanaikainen toistaminen saatiin toimimaan sulavasti. Hahmojen liike pelikentällä toteutettiin pelimoottorin navmesh‑tekniikalla. Partikkelijärjestelmää käytettiin sää‑ ja räjähdysefekteihin. Unity‑pelimoottorin fysiikkamoottoria hyödynnet- tiin hahmojen ragdoll‑animaatiossa, jossa pelimoottori luo proseduraalista animaa- tiota. Sen ennalta‑arvaamattomuus soveltui parhaiten hahmojen kuolema-animaa- tiohin.

Tulos on pelin esittelyversio, joka sisältää kaksi 3D‑tasoa animoiduilla hahmoilla ja taustaelementeillä. Hahmot liikkuvat orgaanisesti pelimaailmassa ja reagoivat pelaa- jan syötteeseen ja muihin hahmoihin.

Avainsanat: 3D‑animaatio, pelihahmo, pelimoottori, Unity

(3)

Author: Mikael Toivola

Title: Animation techniques in a game engine Number of Pages: 38 pages

Date: 10 June 2021

Degree: Bachelor of Engineering

Degree Programme: Information and communication technology Professional Major: Media Technology

Instructor: Antti Laiho, Senior Lecturer

The purpose of the engineering work was to get acquainted with the animation production process in a game engine. The project was a demo version of a real‑time strategy game that demonstrates animated characters and objects in the game world. The goal was to create a living world through animation inside a game engine.

The project was carried out independently. The use of a ready game engine provided a good starting point and speeded up the process.

Video games are full of animation. Animations provide the player with information and make the games more visually interesting.

3D‑models were fabricated and animated using bone‑based‑animation in the Blender‑program. Inverse kinematics ‑technology, which is not present in the game engine, accelerated the animation process. The models were then transferred to the Unity ‑game engine, where its mecanim‑system and scripts were used to control the animations. Switching from one animation to another and playing multiple animations simultaneously was made to work smoothly. The movement of the characters on the playing field was carried out with the game engines navmesh ‑technique. The particle system was used for weather and explosion effects. The physics engine of the Unity game engine was utilized in the ragdoll animation of the characters, where the game engine creates procedural animation. Its unpredictability was best suited to the death animations of the characters.

The result is a demo version of the game that includes two 3D‑levels with animated characters and background elements. The characters move organically in the game world and react to the player’s input and other characters.

Keywords: 3D animation, game character, game‑engine, Unity

(4)

Sisällys

1 Johdanto 1

2 Animaatiot pelimoottorissa 2

2.1 Varhaiset animaatiot peleissä 2

2.2 Pelimoottorien kehitys 4

2.3 Opinnäytetyössä käytetyt ohjelmat 6

2.4 Animaatiotyypit Blender‑ohjelmassa ja Unity‑pelimoottorissa 7 2.5 Animaatioiden hallinta Unity‑pelimoottorissa 13

3 Strategiapelin luontiprosessi 17

3.1 Pelin suunnitelma ja määrittely 17

3.2 3D‑hahmojen mallinnus ja teksturointi 17

3.3 Pelihahmon animaatioiden luominen 21

3.4 Pelimekaniikka ja koodi 23

3.5 Vaihtoehtoiset animaatiotekniikat 27

4 Pelin onnistuminen ja mahdolliset parannukset 32

5 Yhteenveto 35

Lähteet 37

(5)

1 Johdanto

Insinöörityöprojektin peli on kolmiulotteinen reaaliaikainen strategiapeli. Tavoit- teena oli luoda elävä virtuaalinen maailma animaation avulla. Pelin tärkeimmät osat ovat liikuteltavat yksiköt ja niiden toiminta. Hahmot tarvitsisivat liikkumiseen ja taisteluun animaatiot ja monimutkaisen mekaniikan animaatioiden hallintaan.

Pelin tason animaatiot ja pelimoottorissa luodut efektit parantavat pelin immer- siota ja selkeyttä.

Animaation toteuttaminen on monimutkainen ja haastava osa pelin kehitystä.

Animaatio on erittäin tärkeää pelien kannalta. Hahmojen liikkuminen ja efektit elävöittävät videopelejä. Ne parantavat pelikokemusta palkitsemalla pelaajan onnistuneen suorituksen. Palkinto voi olla esimerkiksi tason lopettaminen isolla räjähdyksellä tai vaikean liikkeen näyttävä animaatio. Videopelit ovat täynnä animaatiota. Pelihahmon siirtyminen pelimaailmassa ja hahmon kävelysykli ovat standardeja valtaosassa videopeleistä. Myös peliympäristö voi sisältää animaa- tiota tunnelmaa luovassa sään visualisoinnissa ja objektien, kuten aukeavien ovien, sekä tasohyppelypeleissä liikkuvissa tasoissa.

Insinöörityöraportissa perehdytään ensin animaation eri tekniikoihin, käyttötar- koituksiin ja kohteisiin pelien valmistuksessa. Aluksi käydään läpi videopelien historiaa ja tuodaan esille muutama kiintopiste pelien kehityksestä. Työssä kes- kitytään Unity 3D ‑pelimoottoriin ja sen animaatiotekniikoihin. Työssä vertaillaan myös pelimoottorissa tehtyjen valmisanimaatioiden, proseduraalisten animaati- oiden sekä muista ohjelmista tuotujen animaatioiden käyttöä pelimoottorissa.

Sitten selostetaan projektissa käytetyt tekniikat ja prosessit sekä miksi ne valit- tiin. Lopuksi käydään läpi insinöörityön onnistuneet puolet ja mahdolliset paran- nukset.

(6)

2 Animaatiot pelimoottorissa

2.1 Varhaiset animaatiot peleissä

Pong oli ensimmäisiä videopeleistä ja kaupallinen menestys videopelialalla (1).

Sen animaatio on hyvin minimaalista. Kuvassa 1 suorakaiteen muotoiset mailat liikkuvat pystysuunnassa, kun pelaaja yrittää osua sillä palloon. Neliön muotoi- nen pallo liikkuu laidasta laitaan pysty‑ ja sivusuunnassa ja vaihtaa suuntaa osuessaan mailaan. (2, s. 14.)

Kuva 1. Pong‑pelissä on kaksi mailaa kentän laidoilla. Pallo liikkuu verkkoa ku- vaavan katkoviivan yli. Ruudun yläreunassa näytetään pistetilanne.

Nintendon vuonna 1985 julkaisema Super Mario Bros ‑peli oli yksi parhaiten myydyistä videopeleistä (3). Se käyttää sprite‑animaatiota, jossa yksittäisiä ku- via toistetaan sarjassa. Nintendo Entertainment System ‑pelikonsolin maksimi- resoluutio on hyvin pieni, 256 x 224. Siitä syystä animaation kuvilla on niin ma- tala resoluutio, että yksittäiset pikselit erottuvat (kuva 2). Pelin grafiikka on 8‑bit- tistä, eli kuvilla oli 28 eli 256 väriä käytössä. Siihen verrattuna modernissa JPG‑kuvatiedostossa on 224 eli 16 777 216 väriä. JPG‑kuvatiedostossa ei ole

(7)

kuitenkaan mahdollisuutta läpinäkyvyyteen. Sitä varten pitää käyttää PNG‑ku- vatiedostoa. (4.)

Kuva 2. Super Mario Bros ‑pelin animaatioiden kuvat yhdellä sivulla (4).

Alone in the Dark ‑kauhupeli (5) on yksi varhaisimpia 3D‑malleja käyttäviä pe- lejä. Hahmot ovat yksinkertaisia animoituja polygonimalleja (kuva 3). Hahmoilla on suuri määrä eri animaatiota. Pelattavilla hahmoilla on liikkumiseen kävely‑ ja juoksuanimaatiot. Taisteluun hahmoilla on animaatiot lyömiseen ja aseella am- pumiseen.

(8)

Kuva 3. Alone in the Dark ‑pelin hahmot ovat 3D‑malleja. Tausta on kaksiulot- teinen kuva (5).

Lisäksi pelissä on animaatiota eri objektien kanssa vuorovaikutukseen. Näitä objekteja ovat esimerkiksi avattavat arkut ja siirrettävät huonekalut. Ne ovat myös animoituja polygonimalleja. Pelimaailma koostuu valmiiksi renderöidyistä kaksiulotteisista kuvista, jotka luovat kolmiulotteisen tilan illuusion. Hahmot ja objektit ovat kaksiulotteisen taustan edessä. (6, s. 1.)

2.2 Pelimoottorien kehitys

Id Software julkaisi Doom‑pelin vuonna 1993 (7). Se oli suuressa roolissa luo- massa perustaa ensimmäisen persoonan räiskintäpeleille. Kuvassa 4 näkyy, kuinka pelin hahmot ja objektit on toteutettu kaksiulotteisina kuvina. Kentät ovat kaksiulotteisia karttoja, jotka pelimoottori renderöi kolmiulotteisina. Doom‑peli toi pelimoottorin käsitteenä yleiseen tietoon.

(9)

Kuva 4. Vasemmalla on Doom‑pelin koordinaateilla piirretty kaksiulotteinen kartta. Oikealla on kolmiulotteinen pelinäkymä, jonka pelimoottori renderöi kar- tan perusteella. (7.)

Pelimoottori toimii kehyksenä videopelin tekoon. Doom Engine ‑pelimoottori erit- telee toimintoja, kuten käyttäjän syötteen tulkitsemisen, animoinnin ja renderöin- nin. Näin pelin tekninen puoli erotetaan luovista osa‑alueista. Hyötyjä ovat kehi- tysprosessin nopeuttaminen valmiin pohjan ja uudelleen käytettävien kompo- nenttien avulla, jotta joka peliä ei tarvitse aloittaa alusta. Pelimoottori voi myös helpottaa eri alustoille kehittämistä. Muut yritykset näkivät hyvän pelimoottorin hyödyt. Doom Engine ‑pelimoottori oli myös suosittu alusta modaukselle eli har- rastuspohjaiselle pelin muokkaukselle. Harrastelijat käyttivät pelimoottoria luo- dakseen lisäosia, parannuksia ja kokonaan omia pelejä. (2, s. 20.)

Pelimoottorit rakennetaan tiettyä pelikategoriaa varten. Ne on optimoitu katego- rian vaatimuksia varten. Lisensoitavat pelimoottorit soveltuvat laajempaan peli- kehitykseen, mutta siitä syystä optimointi kärsii. Esimerkiksi sisätiloja varten suunniteltu pelimoottori säästää resursseja jättämällä kauempana olevat huo- neet renderöimättä. Vastaavasti suureen avoimeen maailmaan suunniteltu moottori keskittyy kaukana olevien objektien mahdollisimman yksinkertaiseen renderöimiseen. (8, s. 9.)

Pelimoottorien kehittyessä monien helppokäyttöisyys on parantunut käyttöliitty- mien lisäyksellä. Pelimoottorien mukana tulevat editorit vaativat vähemmän osaamista pelin sisäisestä toiminnasta ja koodikielestä. Unreal Engine‑ ja

(10)

Unity‑pelimoottoreissa voi luoda toimivia pelejä ilman koodaustaitoja. Kuvassa 5 näkyy Unity‑pelimoottorin editori. Valmiiden komponenttien asetuksia voi säätää editorista koskematta koodiin.

Kuva 5. Unity‑editorin käyttöliittymä.

Jos kaikki projektin jäsenet ymmärtävät pelimoottorin editorin perusteet, ani- maattorit voivat tehdä työtään itsenäisemmin (9, s. 20).

2.3 Opinnäytetyössä käytetyt ohjelmat

Blender‑ohjelma on ilmainen avoimen lähdekoodin 3D‑mallinnusohjelma. Avoi- men lähdekoodin ohjelmana sen yhteisöllä on valtuudet tehdä muutoksia koodi- kantaan, mikä johtaa uusiin ominaisuuksiin, virheenkorjauksiin ja parempaan käytettävyyteen. Blender‑ohjelma tukee 3D‑materiaalin tuottamista alusta lop- puun saakka. Blender‑ohjelmassa voi 3D‑mallintaa, animoida, käyttää fysiikka- simulaatiota, renderöidä videota ja liikkeen seurantaa videosta erikoisefektejä varten. Blender‑ohjelma tukee jopa videoiden muokkausta ja pelien luomista.

Edistyneet käyttäjät voivat käyttää Python‑koodia käyttöliittymän muokkaami-

(11)

seen ja erikoistyökalujen kirjoittamiseen. Usein nämä lisätään Blenderin‑ohjel- man seuraaviin julkaisuihin. Blender‑ohjelma sopii hyvin yksilöille ja pienille stu- dioille, jotka hyötyvät sen yhtenäisestä ohjelmasta ja reagoivasta kehitysproses- sista. Blender‑ohjelma on alustojen välinen ja toimii yhtä hyvin Linux‑, Windows‑

ja Macintosh‑tietokoneissa. Sen käyttöliittymä käyttää OpenGL:ää yhtenäisen kokemuksen tarjoamiseksi. (10, s. 1.)

Isommat yritykset käyttävät esimerkiksi Substance Painter ‑ohjelmaa ja Maya‑mallinnusohjelmaa. Maya‑ohjelma muistuttaa paljon Blender‑ohjelmaa, mutta on maksullinen. Suurin ero on käyttöliittymä ja se, mihin artisti on tottunut.

Substance Painter ‑ohjelma on suunniteltu 3D‑teksturointiin. Teksturoinnin voi tehdä mallinnusohjelmassa, mutta yhteen tarkoitukseen luotuna Substance Painter ‑ohjelmalla on etunsa.

Unity‑pelimoottori on Unity Technologies ‑yrityksen kehittämä helppokäyttöinen alusta pelien ja sovellusten luomiseen. Se on maksullinen tuote, mutta siitä on myös ilmainen versio. Tämä versio mahdollistaa sen käytön harjoittelun ja pro- jektiin sopivuuden testauksen. Ammattiversioon pitää siirtyä, jos yhtiön tai hen- kilön tulot ylittävät rajan. Siitä syystä Unity‑pelimoottori soveltuu hyvin pienelle tiimille tai yksittäisille henkilöille. Valmis pelimoottori mahdollistaa vaadittavan koodauksen määrän minimoinnin ja nopeuttaa kehitysprosessia huomattavasti.

Unity‑pelimoottorilla voi luoda yksinkertaisia pelejä täysin ilman koodaustaitoja käyttäen pelkkää käyttöliittymää. (11.)

2.4 Animaatiotyypit Blender‑ohjelmassa ja Unity‑pelimoottorissa

Yhteistä kaikille animaatiolle on muutos ja aika. Perinteinen 2D‑animaatio on liikkeen luomista vaihtamalla kuvia ketjussa (12, s. 1). Yksinkertaistettuna 3D‑animaatio on objektin sijainnin, rotaation tai koon muuttamista. Animaa- tio‑ohjelmissa nämä muutokset tallennetaan aikajanalle. Tätä tallennettua posi- tiota kutsutaan avainkehykseksi (keyframe). Termi tulee perinteisestä animaa- tiotekniikasta, jossa animaation tärkeimmät kuvat piirrettiin ensin ja lopuksi täy-

(12)

tettiin kuvia niiden väliin. Tietokoneella animoitaessa avainkehykset tehdään kä- sin ja animaatio‑ohjelma laskee niiden perusteella välianimaatiot. Kuvassa 6 nähdään aikajana, jossa näkyvät mustilla pisteillä tallennetut avainkehykset.

Pisteiden välillä menevät kaaret kuvaavat välianimaatiota. (13, s. 2.)

Kuva 6. Blender‑ohjelman aikajana. Mustat pisteet ovat tallennettuja avainke- hyksiä (keyframe).

Animaatiota voi tuottaa täysin tai osaksi koodin avulla pelimoottorissa. Esimerk- kikoodissa 1 liikutetaan pelihahmoa pelimaailmassa pelaajan syötteen mukaan.

character.transform.Translate(Vector3.forward * Input.getAxis("Vertical") * Time.deltaTime)

Esimerkkikoodi 1. Ote objektia liikuttavasta C#‑skriptistä.

Rigidbody‑animaatio on tekniikka, joka käyttää valmiiksi tehtyjä animaatioita. Se liikuttaa tai muokkaa objektia kokonaisuutena ilman pienempiä liikkuvia osia.

Sitä käytetään ovien ja muitten yksinkertaisten objektien liikuttamiseen. (13, s.

4.)

Muotoaan muuttavien aineiden kuten veden animoiminen käsin ei ole erityisesti 3D‑ympäristöissä käytännöllistä. Unity‑pelimoottori sisältää fysiikkaan perustu- via animaatiotekniikoita. Nämä proseduraaliset vesi‑ ja kangassimulaatiot luo-

(13)

daan reaaliajassa peliympäristön mukaan. (11.) Kangassimulaatiolla voi toteut- taa laskostuvan viitan tai muun vaatekappaleen luomisen pelimoottorissa. Si- mulaatiolla kankaan saa reagoimaan hahmon liikkeisiin ja pelimaailman muihin järjestelmiin. Pelihahmo voi vaihtaa valmiista animaatioista käyttämään pro- seduraalista animaatiota ragdoll‑tekniikalla, jossa hahmon raajat liikkuvat täysin pelimoottorin fysiikan mukaan. Näin Trials Fusion ‑pelissä (14) pelaajan kaatu- essa moottoripyörällä hahmon putoaminen näyttää joka kerta erilaiselta.

Partikkelijärjestelmä on yleinen työkalu monissa eri pelimoottoreissa. Sillä tuote- taan monimutkaisia liikkuvia savu‑ ja räjähdysefektejä. Partikkelijärjestelmä tuottaa kaksiulotteisia partikkeleita (kuva 7). Partikkeleille annetaan tekstuuri ja sen ominaisuuksia, kuten nopeutta, suuntaa ja väriä, voi muuttaa partikkelin eliniän mukaan. (11.)

Kuva 7. Tulta simuloiva partikkeliefekti (11).

Shader‑skriptit laskevat pikseleiden värejä koodin ja algoritmien avulla. Ne ovat tärkeä osa 3D‑grafiikkaa. Skripti laskee, miten valo reagoi objektin tekstuurin kanssa. (11.)

(14)

Rigged‑ ja bone‑based‑animaatioilla ohjataan objektin useita liikkuvia osia, ku- ten hahmon raajoja. Kuvassa 8 näkyy, kuinka luut ovat ketjussa. Kun ketjun alussa olevaa luuta muokkaa, se vaikuttaa myös kaikkiin sen alla oleviin luihin.

Tällaista animaatiota kutsutaan forward kinematics ‑tekniikaksi. Luiden nivelien rotaatioita muuttamalla hahmo asetellaan eri asentoihin. Forward kinematics

‑tekniikassa siis säädetään niveliä, jotta saadaan luut haluttuihin paikkoihin.

Vaihtoehtoinen tapa animoida on inverse kinematics ‑tekniikka. Siinä luiden ket- julle määritellään yksi luu, jota koko ketju seuraa. Tätä luuta siirretään haluttuun paikkaan ja ohjelma laskee nivelten kulmat automaattisesti. Lopputulos para- nee, jos nivelille antaa rajoitteita, jotka estävät niitä taipumasta liikaa mihinkään suuntaan.

Kuva 8. Haarautuva ketju luita. Ketju alkaa vasemmalta, ja animoitaessa mo- lemmat haarat liikkuvat hierarkiassa ensimmäisen luun mukana. (16.)

Malliin liitetään luita, joille määritellään vaikutusalueet. Se voidaan tehdä auto- maattisesti tai käsin käyttämällä weight painting ‑tekniikkaa. Tekniikan nimen mukaisesti jokaiselle luulle maalataan kuvassa 9 näkyvällä tavalla vaikutusalue mallin pinnalle. Mallinnusohjelma tulkitsee värin sävyn perusteella, kuinka vahva vaikutus luulla on alueeseen.

(15)

Kuva 9. Weight paint ‑tekniikka. Punaisella merkitty alue on vahvin vaikutusalue ja sininen on heikoin. Mustalla maalattuihin alueisiin valitulla luulla ei ole vaiku- tusta. (16.)

Animaatio muuttaa objektiin liitettyjen luiden koon, rotaation ja sijainnin arvoja, mikä liikuttaa luun vaikutusalueeseen kuuluvia mallin osia. Unity 3D ‑pelimoot- tori käyttää Mecanim‑ohjelmaa monimutkaisten animaatioiden hallitsemiseen.

Kuvassa 10 Unity‑pelimoottoriin on tuotu humanoidimalli, johon on liitetty luu- ranko. (13, s. 5.)

(16)

Kuva 10. Kolmiulotteinen humanoidihahmo, jolle on asetettu luut animoimista varten (11).

Kasvojen animointi tehdään 3D‑mallinnusohjelmassa. Kasvojen animointiin voi luoda oman hallintamekaniikan. Sen voi toteuttaa luilla, kuten hahmon vartalon animaatiot. Animoitavien kasvojen mallinnuksessa polygonit pyritään asetta- maan muotoon kasvojen piirteiden ympärille (kuva 11). Kasvot liikkuvat ja veny- vät luonnollisemmin, kun polygonit myötäilevät silmiä ja suuta. Puheen animaa- tiota kutsutaan lip sync ‑tekniikaksi. Puheen animointi aloitetaan valmiin äänen tuomisella animointiohjelmaan ja animaatio tehdään äänen perusteella. Ääni on aikajanalla, jota voidaan kelata ja pysäyttää. Animaattori asettaa eri äänteiden mukaiset suun asennot ajoitettuna äänipätkän mukaan. Yleinen tapa lip sync

‑tekniikkaa suorittaessa on tehdä ensin valmis äänteiden ja ilmeiden kirjasto (15, s. 428). Animaattori valitsee ilmeitä ketjuun aikajanalle ja hienosäätää ne tilanteeseen sopivaksi.

(17)

Kuva 11. Kasvojen malli myötäilee liikkuvia piirteitä, kuten oikeat kasvojen lihak- set (16).

Uutta teknologiaa on mocap‑tekniikka, jossa käytetään kameroita ja sensoreita näyttelijän vartalon ja kasvojen liikkeiden tallentamiseen. Näin saadaan luonnol- lista ja realistista animaatiota. Mocap‑tekniikalla saadut animaatiot vaativat vielä animaattorin viimeistelemään ne käsin.

2.5 Animaatioiden hallinta Unity‑pelimoottorissa

Unity‑pelimoottorin sisäinen Mecanim‑kokonaisuus käyttää animaatiopätkiä, jotka voivat olla peräisin 3D‑mallinnusohjelmasta tai Unity‑pelimoottorin omalla editorilla tehtyjä. Animaatiopätkät järjestetään kaaviomaiseen animaattoriin. Sen sisällä asetetaan animaatioiden välillä polut, jotka näkyvät kuvassa 12 sinisinä nuolina. Pelin käynnistyessä animaattori aloittaa vihreästä neliöstä ja siirtyy pol- kua pitkin ensimmäiseen animaatioon.

(18)

Kuva 12. Animaattori hahmon liikkeiden ohjaamiseen. Ensimmäinen toistettava animaatio on merkitty oranssilla.

Animaatiosta toiseen siirtymistä hallitaan polkuihin lisättävillä ehtolauseilla. Eh- tolauseet käyttävät animaattoriin määriteltyjä muuttujia (kuva 13). Muuttujiin pääsee käsiksi koodilla ja editorin sisäisillä metodeilla. Animaattorilla on mah- dollista säätää animaation nopeutta ja sitä, toistetaanko animaatio vain kerran vai pyöritetäänkö siihen asti, kunnes animaattori siirtyy toiseen animaatioon (11). Jatkuvasti toistuvia animaatioita käytetään esimerkiksi hahmon kävelyyn (12, s. 52).

(19)

Kuva 13. Animaatioiden välinen polku, jolle on asetettu parametriä käyttävä eh- tolause. Takaisin tuleva polku ei tarvitse ehtolausetta.

Blend tree ‑mekaniikka on kehittynyt tapa siirtyä animaatiosta toiseen. Sitä käy- tetään esimerkiksi kävelystä juoksuun siirtymiseen tai suunnan vaihdon tekemi- seen sulavammaksi (kuva 14). Mekaniikassa on mahdollista asettaa rajat, joissa animaation vaihtuu toiseen. Monimutkaisemmat versiot voivat käyttää suuria listoja, joista lasketaan pyörivä animaatio.

Kuva 14. Blend tree ‑mekaniikkaa käytetään kolmen animaation transitioihin.

(20)

Useampaa animaatiota voidaan pyörittää samaan aikaan eri kerroksia käyttä- mällä. Eri animaatioiden toistoa hallitaan maskien avulla. Maskilla valitaan tietyt ruumiinosat, joihin animaation on tarkoitus vaikuttaa. Yksi kerros ohjaa esimer- kiksi ylävartaloa, kun toinen animoi jalkoja.

(21)

3 Strategiapelin luontiprosessi

3.1 Pelin suunnitelma ja määrittely

Insinöörityöprojektin peli on kolmiulotteinen reaaliaikainen strategiapeli. Pelaa- jan on tarkoitus ohjata omia sotilaita tason läpi ja tuhota vihollissotilaat. Omien yksikköjen liikuttaminen tehdään valitsemalla ne hiirellä ja antamalla liikekomen- toja. Pelaaja voi hidastaa aikaa välilyöntinäppäimellä ja antaa monelle yksikölle komentoja samaan aikaan.

Pelin tärkeimmät osat ovat liikuteltavat yksiköt ja niiden toiminta. Pelaajan ja vi- hollisen sotilaiden taistelun suunniteltiin tapahtuvan suureksi osaksi automaatti- sesti. Pelaaja liikuttaa sotilaita parhaaksi näkemällään tavalla, jotta ne voittaisi- vat viholliset. Sotilaat tarvitsisivat siis liikkumiseen ja ampumiseen animaatiot.

Eri efektit parantavat taistelun näyttävyyttä ja selkeyttä. Seuraavaksi tärkein osa peliä oli peliympäristö. Se on suurimmaksi osaksi staattinen malli, jonka elävöit- tämiseen suunnittelin käytettävän monia luvussa 2 esiteltyjä animaatiotyyppejä.

Käyttöliittymään kuuluvat valikot sekä valitun yksikön korostamisen ja tietojen näyttäminen.

3.2 3D‑hahmojen mallinnus ja teksturointi

Projekti alkoi Blender 3D ‑ohjelmalla mallinnuksella ja animoinnilla. Projektin kaikki osat tehtiin joko Unity‑ tai Blender‑ohjelmalla. Työkalujen määrä saatiin pidettyä mahdollisimman pienenä, ja näin säästettiin myös aikaa.

Pelin tärkein osa on sotilashahmo. Se toimii sekä pelaajan ohjaamina yksik- köinä ja vastustajina. Sotilas on tyypillinen polygonimalli. Polygonit ovat koordi- naattipisteiden välisiä sivuja. Sivut muodostavat yhdessä objektin. Lisäämällä mallin ympäröiviä reunoja (edge‑loop) sivujen määrää kasvatetaan ja mallista tulee yksityiskohtaisempi. Hahmon luominen aloitettiin yksinkertaisesta kuuti- osta. Muokkaamalla sivuja ja reunoja kuutiosta saatiin ihmisen muotoinen malli (kuva 15). Apuna käytettiin referenssikuvia ihmisen anatomiasta.

(22)

Kuva 15. Mallinnus alkaa yksinkertaisesta kuutiosta, johon lisätään reunoja. Si- vuja ja reunoja siirretään ja venytetään, kunnes malli saadaan haluttuun muo- toon.

Blender‑ohjelmalla on peilaustoiminto, joka pitää mallin symmetrisenä valittujen akselien molemmin puolin. Se nopeutti mallinnukseen kuluvaa aikaa puolella.

(Kuva 16.)

(23)

Kuva 16. Blender‑ohjelmalla tehty polygonimalli ihmisestä. Hahmon yksi puoli on peilattu ajan säästämistä varten ja symmetrian parantamiseksi.

Hahmon vartalo on yksi objekti. Varusteet ja ase ovat erillisiä objekteja. Se aut- taa mallinnuksen myöhemmissä vaiheissa. Niistä tehtiin erillisiä myös, koska haluttiin, että ne ovat muokattavissa jälkeenpäin. Muokkaukset tai erillisen ob- jektin korvaaminen toisella objektilla eivät häiritse vartalon mallia tai animaati- oita. (Kuva 17.)

(24)

Kuva 17. Hahmon varusteet erillisinä objekteina.

Sama prosessi tehtiin robotin toteutuksessa. Kuvassa 18 näkyy robotin malli.

Robotin suunnitelma on yksinkertainen, jotta sen animointi olisi nopeaa.

Kuva 18. Vihollisrobotti koostuu renkaasta ja sivuilla olevista aseista.

Mallinnuksen jälkeen tuli teksturointi. Tekstuuri on kaksiulotteinen kuva, joka kääritään kolmiulotteisen objektin ympärille (kuva 19). Näin 3D‑malli saa värit ja

(25)

yksityiskohdat. Jokaisella objektilla on oma tekstuuri. 3D‑malli vaatii UV‑kartoi- tusprosessin ennen tekstuurin liittämistä.

Kuva 19. Vasemmalla on 3D‑malli. Oikealla on sen kaksiulotteinen tekstuuri.

Valituista polygoneista näkyy, kuinka kolmiulotteinen malli avataan kaksiulottei- selle pinnalle.

Prosessi alkaa asettamalla saumoja sivujen väliin. Saumat toimivat leikkaus- kohtina, joihin tekstuuri katkeaa, joten ne pyritään asettamaan mahdollisimman huomaamattomiin paikkoihin. Mitä yksinkertaisempi malli on tai mitä enemmän saumoja käytetään, sen vähemmän malli vääristyy avattaessa kaksiulotteiseksi.

Pelin tasot luotiin samalla prosessilla.

3.3 Pelihahmon animaatioiden luominen

Hahmoon käytettiin Blender‑ohjelman sisältämää valmista luurankoa (kuva 20).

Luurangon asettelu mallin sisälle oli kohtalaisen nopeaa. Polvi‑ ja kyynärniveliin lisättiin rajoitteet, jotta ne eivät taitu mahdottomiin asentoihin (16, s. 363). Sitten lisättiin ylimääräisiä apuluita käsien ja jalkojen päihin. Jokaiseen apuluuhun yh- distetään yksi raaja, jotta koko raajaa voi ohjata yhtä luuta siirtämällä (17, s.

65). Tämä tekee animointiprosessista nopeampaa ja luonnollisempaa. Kun luu- ranko oli valmis, se liitettiin hahmoon.

(26)

Kuva 20. Blender‑ohjelman valmis humanoidiluuranko.

Animointi aloitettiin kävelysyklistä. Kuvassa 21 näkyy, kuinka kävelyanimaatio tehtiin viidellä avainkehyksellä (keyframe). Ensimmäisessä on vasen jalka edessä oikea takana. Käyttämällä apuluita jalkojen asettelu on kohtalaisen no- peaa. Vastakkainen asento saatiin peilaamalla ensimmäisen avainkehys. Viimei- nen asento on taas kopio ensimmäisestä. Lopuksi lisättiin väleihin asennot, joissa eteenpäin liikkuva jalka nousee ja sen polvi taittuu. Ohjelma laskee auto- maattisesti, mitä tapahtuu niiden välissä.

Kuva 21. Blender‑ohjelmassa tehty kävelysykli.

Valmiit hahmot ja ympäristöt siirrettiin Unity‑pelimoottoriin. Mallien siirtäminen ohjelmien välillä on hyvin helppoa. Unity‑pelimoottori tunnistaa mallien

(27)

blend‑formaatin ja animaatioiden fbx‑formaatin ilman minkäänlaista kääntöpro- sessia. Unity‑pelimoottorin käyttämä perusmateriaali sisältää tekstuurin ja sha- der‑skriptin. Kun malli siirrettiin, Blender‑ohjelman tekstuuri meni automaatti- sesti uuteen pelimoottorin materiaaliin. Materiaali sai standardin shader‑skriptin.

Pelimoottorissa rakennettiin animaattorikontrolleri hahmolle. Unity‑pelimoottorin animaatiokontrolleriin kuuluu äärellinen automaatti, joka hallitsee animaatioiden välillä siirtymistä. Kontrollerille asetetaan oletusanimaatio, joka pyöritetään pelin käynnistyessä. Muihin animaatioihin siirtyminen toteutetaan polkujen avulla.

Kontrollerille asetetaan parametreja, joita muutetaan skriptien ja editorin si- säisien metodien avulla. Polkuihin asetetaan parametreja käyttäviä ehtolau- seita. Jos yksi parametri on hahmon nopeus, niin paikallaoloanimaatiosta me- nevä polku kävelyanimaatioon voi esimerkiksi sisältää ehtolauseen nopeus on suurempi kuin 0. Jos ehtolause toteutuu, hahmo siirtyy kävelyanimaatioon (10).

Jos minkään animaatiosta johtavien polkujen ehtolauseet eivät toteudu, ani- maatio joko toistuu kerran ja pysähtyy tai toistuu siihen asti, kunnes parametrit muuttuvat. Muokattavissa ovat toistuvuuden lisäksi erikseen jokaisen animaa- tion nopeus ja peilaus. Polkuihin voi asettaa siirtymäaikaa. Siirtymäaika sulaut- taa yhteen 3D‑animaatiot. Tämä ei toimi perinteisten täysin valmiiksi luotujen animaatioiden kanssa. Jos siirtymisaika asetetaan nollaan, äärellinen auto- maatti siirtyy animaatiosta toiseen heti polun ehtolauseiden toteutuessa.

3.4 Pelimekaniikka ja koodi

Hahmojen liikkuminen toteutettiin Unityn‑pelimoottorin navmesh‑agentilla. Se on Unity‑pelimoottorin valmis komponentti, jonka voi lisätä mihin tahansa objektiin.

Pelin ympäristöön luodaan navmesh‑rakenne, joka määrittelee kuvassa 22 nä- kyvät siniset pinnat, joissa agentti voi liikkua. Agentilla on myös valmis pathfin- ding‑skripti. Reitin laskenta on tärkeä osa pelin tekoälyä. Pelin pitää laskea re- aaliajassa paras reitti lähtöpisteestä toiseen pisteeseen navmesh‑rakenteen pinnalla. Jotta reitin laskeminen veisi mahdollisimman vähän resursseja, Unity‑pelimoottori käyttää yleistä A*‑algoritmia. Projektissa käytettiin vain yksit- täisten hahmojen reitittämistä. (18, s. 22.)

(28)

Kuva 22. Pelin tasoon luotu navmesh‑rakenne. Pinnat, jolla hahmo pystyy liik- kumaan, on merkitty sinisellä.

Kameran liikettä ja kääntymistä ohjaa skripti. Hiiren lähestyessä näytön reunaa kameran positio muuttuu. Nuolinäppäimillä pelaaja voi kääntää kameraa Y‑akse- lin ympäri.

Osoittimeen skripti käyttää raycast‑toimintoa hahmojen tai koordinaattipisteiden valitsemiseen. Raycast‑toiminto lähettää suoran vektorin osoittimen koordinaa- teista kameran suuntaan. Skripti tarkistaa objektin, johon säde osuu ensimmäi- senä. Pelaajan ohjaamilla hahmoilla ja vihollisilla on omat tag‑ominaisuutensa, jotta pelaaja voi hallita vain omia hahmoja. Hahmoilla on liikeskripti, jonka meto- diin hiiren skripti pääsee käsiksi ja voi antaa määränpään koordinaatit. Hahmon liikeskripti antaa koordinaatit eteenpäin Unity‑pelimoottorin valmiille navmesh‑agentille.

Kun pelaaja valitsee yksikön, hiiren skripti aktivoi hahmon highlight‑objektin. Sa- malla UI‑elementti, joka kertoo hahmon tiedot, tulee näkyviin.

Pelaaja ohjaa hahmojen liikettä, mutta hahmot tähtäävät ja ampuvat vihollisia au- tomaattisesti. Pelimaailmassa on skripti, joka pitää listaa kaikista pelaajan hah- moista sekä vastustajan hahmoista. Hahmot pääsevät käsiksi tähän listaan. Ku- vassa 23 ne tarkistavat raycast‑toiminnon avulla, onko vihollisia näkyvissä. Jos raycast‑sensori osuu viholliseen ilman välissä olevia objekteja, vihollinen lisätään näkyvissä olevien vihollisten listaan. Jos listalla on yksi tai useampia vihollisia,

(29)

hahmo alkaa ampua niistä ensimmäistä. Ampuessa hahmo toistaa ampumisani- maatiota. Joka laukauksella hahmon piipun kohdalle luodaan suuliekkiobjekti.

Kun listan ensimmäinen vihollinen kuolee tai poistuu näkyvistä, se poistetaan lis- talta ja seuraava mahdollinen vihollinen siirtyy ensimmäiseksi.

Kuva 23. Vektorit hahmojen välillä ottavat selvää, ovatko viholliset näkyvissä. Jos vihollisen ja pelaajan hahmojen välillä ei ole objekteja, hahmot alkavat taistella.

Jos vihollinen on hahmon sivulla, sotilas kääntää ylävartalonsa ja aseen vihol- lista kohti. Esimerkkikoodin 2 skripti laskee vihollisen suunnan hahmon katseen suuntaan verrattuna.

float angle = Vector3.Angle(dir, transform.forward);

Vector3 localTragetPos = this.transform.InverseTransformPoint(target);

if (localTragetPos.x < 0) angle *= ‑1;

anim.SetFloat("aimAngle", angle);

Esimerkkikoodi 2. Ote laskee tähtäyskulman animaattorin parametrille.

Kuvassa 24 suunta annetaan asteina tähtäysanimaatiota ohjaavalle blend tree

‑mekaniikalle animaattorissa. Animaattorin kerros (layer), jossa tähtäysanimaa- tiot ovat, ohjaa vain hahmon ylävartaloa. Kävelyanimaatio jatkaa pyörimistä sa- maan aikaan. Kun hahmo on aloittanut ampumisen, se alkaa kääntyä kokonaan vihollista kohti. Navmesh‑agentti liikkuu vielä kohti annettua päämäärää. Tilan-

(30)

teissa, joissa hahmo kävelee sivusuunnassa, kävelyanimaation blend tree ‑me- kaniikka toimii samalla tavalla kuin tähtäyksen. Animaattorin parametri kävelyn suunnalle lasketaan objektin suunnan ja päämäärän suunnan väliltä.

Kuva 24. Ylävartalon itsenäinen liike hahmon ampuessa eri suuntaan, kuin mi- hin hahmo osoittaa. Animaatio valitaan oikealle, vasemmalle ja eteenpäin kat- sovista animaatiosta.

Hahmoilla on elämäpisteet, jotka vähenevät hahmojen saadessa osumia. Kun elämäpisteet laskevat nollaan ja hahmo kuolee, skripti luo uuden version

3D‑mallista ja deaktivoi varsinaisen objektin. Uusi malli ei sisällä animaatiokont- rolleria, eikä se tarvitse valmiita animaatioita.

(31)

3.5 Vaihtoehtoiset animaatiotekniikat

Fysiikkamoottorin tärkeimmät osat ovat rigidbody‑ ja collider‑komponentit. Ri- gidbody‑komponentti antaa objektille massan ja määrittelee sen kitkan. Colli- der‑komponentti määrittelee fysiikkaobjektin reunat. Nimen mukaisesti yleisin käyttö collider‑komponentille on törmäyksen havaitseminen. Kun objektilla on myös rigidbody‑komponentti, fysiikkamoottori lisää voimaa objektiin ja estää sitä menemästä toisen objektin collider‑komponentin läpi. Ragdoll‑tekniikka käyttää niitä proseduraalisen animaation luomiseen (19, s. 7). Unity‑pelimoottori sisäl- tää myös fysiikkamoottorin nivelen, jolla kaksi rigidbody‑komponenttia saadaan yhdistettyä (17, s. 204). Kuvassa 25 näkyy, kuinka koko objektin sijaan hahmon yksittäisille luille annetaan molemmat komponentit. Collider‑komponentti estää raajojen vajoamisen toistensa ja lattian läpi. Nivelet pitävät osat tietyllä etäisyy- dellä toisistaan. Blender‑ohjelmassa asetetut luiden rajoitteet eivät vaikuta fy- siikkaan perustuvaan animaation, joten uusille nivelille asetettiin uudet rajoitteet.

Collider‑komponenttien ja nivelten liittäminen on manuaalinen prosessi ja vaatii paljon hienosäätöä. Se pitää toistaa uudelleen jokaiselle mallille. Aikaa säästyi käyttämällä samaa mallia kaikille sotilaille ja muuttamalla tekstuureja.

(32)

Kuva 25. Hahmon tärkeimpiin osiin on kiinnitetty collider‑komponentit.

Line renderer ‑komponentti piirtää annettujen koordinaattien väliin räätälöitävän viivan. Se renderöidään aina aktiiviseen kameraan päin. Sitä käytettiin sotilait- ten lasertähtäimiin. Viiva piirtyy sotilaan aseesta viholliseen.

Trail renderer ‑komponentti on uusi lisäys Unity‑pelimoottoriin ja toimii hyvin sa- malla tavalla kuin line renderer ‑komponentti. Se piirtää polygoneilla räätälöitä- vän jäljen objektin perään algoritmia käyttäen. Trail renderer ‑komponentilla voi säätää efektin väriä, leveyttä ja materiaalia kurvien avulla (kuva 26). Sitä käytet- tiin luotien graafiseen representaatioon. Se on liitetty objektiin, joka luodaan aseen koordinaatteihin. Objekti lentää suoraan eteenpäin ja vetäen läpinäkyvää viivaa perässään. Trail renderer ‑komponentilla on helppo ja nopea tehdä hy- vännäköisiä efektejä, joiden luominen vaatisi muuten paljon koodia.

(33)

Kuva 26. Trail renderer ‑komponentin muokattavat asetukset.

Ympäristö ei tarvinnut animaatiota pelin toiminnan puolesta, mutta pienet yksi- tyiskohdat tuovat mielenkiintoisuutta muuten yksitoikkoiseen ympäristöön. Peli- maailma on futuristinen kaupunki, joka seisoo veden yllä tukipylväiden varassa.

Unity‑pelimoottorissa on tekstuureilla tehty valmis vesiefekti. Animaatio luodaan shader‑skriptiä käyttäen. Liikuttamalla kahta läpinäkyvää tekstuuria eri suuntiin saadaan aikaan aallokon illuusio. Koska vesi on taustalla, kolmiulotteinen ani- moitu vesi olisi resurssien hukkaa. Shader‑skriptillä voi myös muokata kameran näkymää. Pelin kameraan lisättiin esimerkkikoodi 3. Skripti tekee näkymästä mustavalkoisen ja matkii lämpökameran näkymää.

Shader "Hidden/NightVisionShader"

{

float4 frag(v2f_img i) : COLOR {

float4 c = tex2D(_MainTex, i.uv);

float lum = c.r*0.3 + c.g*0.59 + c.b*0.11;

float3 bw = float3(lum, lum, lum);

float4 result = c;

result.rgb = lerp(c.rgb, bw, _bwBlend);

return result;

}

Esimerkkikoodi 3. Ote mustavalkoisesta shader‑skriptistä.

(34)

Sotilashahmolla on oma skripti, joka vaihtaa sen 3D‑mallin materiaalia. Kun pe- laaja aktivoi lämpökameraefektin, vartalon materiaali vaihtuu toiseen, jolla on kirkas tekstuuri. Kuvassa 27 näkyy, kuinka hahmon vartalo erottuu kaikesta muusta pelimaailmassa.

Kuva 27. Shader‑skriptillä aikaan saatu lämpökameraefekti.

Välkkyviin neonvalokyltteihin käytettiin perinteistä frame by frame ‑animaatiota.

Kuvat (frame) siirrettiin yhdessä png‑tiedostossa pelimoottoriin. Unity‑pelimoot- torissa on Sprite Editor ‑ohjelma, jolla leikattiin ja nimettiin yksittäiset kuvat (kuva 28). Yksittäisillä kuvilla luodaan sprite‑animaatio, joka toistaa kuvia sar- jassa jatkuvasti.

(35)

Kuva 28. Sprite Editor ‑ohjelma Unity‑pelimoottorissa.

Lisää tunnelmaa saatiin sateen avulla. Sade on yksinkertainen partikkeliefekti.

Se tuottaa tason yläpuolella sijaitsevasta kuutiosta pitkiä partikkeleita, jotka pu- toavat suoraan alaspäin. Toinen partikkeliefekti on osumaindikaattori. Kun soti- las ampuu ja osuu toiseen hahmoon, osumakohdasta lentää kipinöitä kartion muotoisella alueella. Kipinäpartikkelit venyvät poispäin lähtöpisteestä antaen vauhdintunnetta. Räjähdysefekti tehtiin käyttäen useaa eri partikkelijärjestel- mää, jotka luovat tulen, paineaallon, savun ja kipinät. Ensimmäinen partikke- liefekti on liekit. Partikkeleilla on tulitekstuuri. Ne kohoavat hitaasti ylös satun- naiseen suuntaan. Paineaalto on yksi partikkeli, joka pysyy paikallaan. Sen koko kasvaa, kunnes se katoaa. Savupartikkelit kasvavat ja muuttuvat läpinäky- vämmiksi ajan myötä. Savuefektistä tuli huomattavasti vakuuttavampi, kun par- tikkelit ovat niin isoja, että ne menevät päällekkäin toistensa kanssa. Näin efek- tistä ei erota yksittäisiä partikkeleja.

(36)

4 Pelin onnistuminen ja mahdolliset parannukset

3D‑hahmon mallinnus onnistui suunnitellusti. UV‑kartoitus oli kohtalaisen help- poa mallin yksinkertaisuuden vuoksi. Hahmojen varusteet lisäävät riittävästi yk- sityiskohtia ylhäältäpäin näkyvään malliin. Ajan säästämiseksi kaikki ihmishah- mot käyttävät samaa mallia. Vihollisten mallit kaipaavat lisää erottavia piirteitä tai jopa useamman eri mallin.

Hahmon animaatiot olivat riittäviä, mutta hieman huomaamattomia. Yksi ani- maation tärkeimmistä periaatteista on liioittelu (12, s. 38–48). Pelin teema nojaa realismiin päin, mutta jälkeenpäin katsottuna animaatiot olisivat hyötyneet isom- mista liikkeistä. Hahmon tähtäysanimaatiot ja niiden hallinta onnistuivat hyvin.

Samanlaista blend tree ‑tekniikka käyttivät myös liikkumisanimaatiot. Kun hahmo näkee vihollisen, hahmo alkaa kääntyä sitä kohti. Hahmo jatkaa kuiten- kin liikettä kohti pelaajan antamaa määränpäätä. Hahmon kääntyessä pois kul- kusuunnasta animaattori vaihtaa sivusuunnassa liikkumisanimaatioon. Liikkeen animaattori on monimutkainen, ja animaation laatu ei ole samalla tasolla. Sen vuoksi hahmon jalat usein luistavat maata pitkin. Kulkusuunnan laskemisessa aiheutuvat virheet käynnistävät joskus väärän animaation.

Hahmon jalkojen luistamista voisi ehkäistä root motion ‑tekniikalla. Siinä hah- mon liike määrittyy animaation perusteella. Mallinnusohjelmassa luu on luuran- gon hierarkiassa ensimmäisenä. Ilman root motion ‑tekniikkaa hahmo pysyy paikallaan kävelysyklin aikana. Kaikki liike tulee koodista. Root motion ‑teknii- kalla liike tehdään mallinnusohjelmassa siirtämällä root‑luuta. Unity‑pelimootto- rille kerrotaan, mikä luista on root‑luu, ja se osaa siirtää hahmoa animaation mukaan. Tekniikan mukana tulee omat ongelmansa. Animaation pysyy parem- min tahdissa pelin kanssa, mutta peli käyttää nyt animaatiota osana pelimeka- niikkaa, mikä asettaa enemmän vaatimuksia animaation laadulle.

Pelaajan ohjaamilla hahmoilla on kolme luokkaa. Ne ovat assault‑, rifleman‑ ja sniper‑luokat. Suurin ero niissä on tulinopeus ja tarkkuus eri etäisyyksillä. Luok-

(37)

kien tarkoitus on tuoda peliin lisää strategiaa. Hahmon nimen näkee käyttöliitty- mässä, kun pelaaja valitsee sen, mutta luokat olisivat kaivanneet enemmän vi- suaalisesti erottavia piirteitä. Kuten kuvasta 29 näkyy, vain tarkka‑ampujan erot- taa muista erilaisen aseen avulla.

Kuva 29. Kun pelaaja valitsee hahmon, käyttöliittymä kertoo sen nimen ja kun- non. Sininen ympyrä merkitsee valitun tarkka‑ampujahahmon.

Kenttiä pelin esittelyversiossa on vain kaksi lyhyttä tasoa tutoriaalin lisäksi. En- simmäiseen tasoon luotiin tunnelmaa käveltävän tason alla näkyvällä vedellä ja yksityiskohdilla, kuten silloilla ja rakennuksien neonkylteillä. Välkkyvät kyltit oli- vat nopeita tehdä ja muokata erivärisiksi ja ‑kokoisiksi. Kyltin animaatio ei kui- tenkaan onnistunut halutusti. Animaatio näytti hajonneelta tekstuurilta. Se saa- tiin näyttämään siedettävältä hidastamalla animaatiota yli puolella, mutta suurin osa tason neonkylteistä ei ole animoituja. Uudelleen tehtäessä kyltit voitaisiin tehdä kolmiulotteisena. Ne sopisivat paremmin kenttään muiden 3D‑mallien kanssa. Kylttejä voisi parantaa kipinäpartikkeliefekteillä ja valaisuobjektien avulla. Nämä vaatisivat kuitenkin huomattavasti resursseja. Toinen taso sisältää sisätilan, mutta jäi vajaaksi yksityiskohdista. Partikkeliefekteillä luotiin sade ja

(38)

räjähdys animaation robotille. Sade on sopivan yksinkertainen ja toimiva toteu- tus. Räjähdys jäi kaipaamaan lisää näyttävyyttä. Efektien animointi on oma am- mattialansa.

(39)

5 Yhteenveto

Pelimoottorit ovat kehittyneet nopeasti. Kuten muidenkin teknologioiden, niiden käyttöystävällisyys paranee jatkuvasti. Avoimen lähdekoodin ohjelmat ja pienille tiimeille kohtuuhintaiset teknologiat ovat yleistyneet. Nämä työkalut antavat pie- nille kehittäjille mahdollisuuden tuottaa omia pelejä ilman julkaisijaa ja sen mu- kana tulevia rajoituksia. Valmis pelimoottori nopeuttaa kehitysprosessia valmiilla komponenteilla. Editorien käyttö toimii yhdistävänä siltana ohjelmoijan ja artistin välillä. Unity‑pelimoottori tekee pienelle tiimille helpoksi tuottaa toimivia kokonai- suuksia nopeasti. Mallien ja animaatioiden tuominen muista ohjelmista on yksin- kertaista ja kätevää.

Unity 3D ‑pelimoottori sisältää monia animaatiotekniikoita ulkopuolisissa ohjel- missa tuotettuihin ja dynaamisempiin animaatioihin. Kaikilla on omat tarkoituk- sensa ja etunsa. Erillisessä ohjelmassa animaation tuottamiselle on enemmän apuvälineitä. Työssä käytettiin Blender‑ohjelman inverse kinematics ‑tekniikkaa, jota ei löydy pelimoottorista. Se nopeutti animointiprosessia ja teki luonnollisten liikkeiden käsin animoimisesta helpompaa.

Laajemmassa projektissa kannattaa yhdistellä eri tekniikoita parhaan tuloksen saavuttamiseksi. Pelisuunnittelijan pitää valita, sopiiko pelin ulkonäköön fysiik- kaan perustuva tekniikka, joka voi monesti näyttää epärealistisemmalta kuin kä- sin tehty animaatio. Vastaavasti valmiit animaatiot joustavat vähemmän ja vaati- vat sitä enemmän työtä, mitä monipuolisempi peli on. Fysiikkaan perustuva peli- mekaniikka aiheuttaa ennalta‑arvaamattomia ongelmia ja voi rikkoa pelaajan immersion.

Insinöörityöprojektissa päätettiin käyttää fysiikkaan perustuvaa animaatiota lä- hinnä hahmojen kuolema‑animaatioihin, sillä ne eivät vaikuta suoraan varsinai- seen pelimekaniikkaan. Jos kuollut hahmo päättää lentää ulos pelialueelta, se ei estä pelin etenemistä. Tähtäysanimaation tai ampumisefektin hajoaminen voisi tehdä pelaajalle vaikeammaksi ymmärtää, mitä pelissä tapahtuu, jos peli- mekaniikka ja animaatio näyttävät eri asioita.

(40)

Satunnaisuus sopii ymmärrettävästi räjähdysefekteihin. Partikkelijärjestelmä on suunniteltu savun ja räjähdysten luomiseen. Se hoitaa asiansa hyvin. Näyttävät efektit palkitsevat pelaaja onnistumisesta.

Peliä testatessa pienten visuaalisten yksityiskohtien ja efektien tärkeys tuli jat- kuvasti vastaan. Ilman selkeitä indikaattoreita siitä, mitä konepellin alla tapah- tuu, pelaaja helposti turhautuu. Niin yksinkertaiset asiat kuin valitun yksikön ko- rostaminen ja animaatio päämäärän asettamiselle parantavat pelaamiskoke- musta huomattavasti.

(41)

Lähteet

1 Brunshnell, Nolan. 1972. Pong. Videopeli. Atari.

2 Ylönen, Jani. 2014. Videopelien historia ja pelinkehitys: 2D‑pelimoottorei- den vertailu. Pro gradu ‑tutkielma. Jyväskylän yliopisto. JYX-julkaisu- arkisto.

3 Super Mario Bros. 1985. Videopeli. Nintendo.

4 Goodnight, Eric. 2011. What Can Super Mario Teach Us About Graphics Technology? Verkkoaineisto. How‑To Geek. https://www.how-

togeek.com/howto/44230/what‑can‑su-

per‑mario‑teach‑us‑about‑graphics‑technology/. Luettu 10.5.2021.

5 Alone in the Dark. 1992. Videopeli. Infogrames.

6 Loguidice, Bill & Barton, Matt. 2009. Vintage Games: An Insider Look at the History of Grand Theft Auto, Super Mario, and the Most Influential Games of All Time. Routledge.

7 Doom. 1993. Videopeli. id Software.

8 Gregory, Jason. 2018. Game Engine Architecture. Third Edition. CRC Press.

9 Cooper, Jonathan. 2019. Game Anim: Video Game Animation Explained.

CRC Press.

10 Flavell, Lance. 2011. Beginning Blender: Open Source 3D Modeling, Ani- mation, and Game Design. Apress.

11 Unity User Manual. 2019. Verkkoaineisto. Unity Technologies.

https://docs.unity3d.com/Manual/ Luettu 10.10.2020.

12 Eskelinen, Herkko. 2008. Animaatioaapinen. Joensuu: Kustannusyhtiö Ilias.

13 Thorn, Alan. 2015. Unity Animation Essentials. Packt Publishing.

14 Trials Fusion. 2014. Ubisoft.

15 Reinhardt, Robert & Dowd, Snow. 2007. Adobe Flash CS3 Professional Bible. John Wiley & Sons.

(42)

16 Blender 2.92 Reference Manual. Verkkoaineisto. Blender Documentation Team. https://docs.unity3d.com/Manual/index.html. Luettu 1.4.2021.

17 Dean, Jamie. 2015. Unity Character Animation with Mecanim. E‑kirja.

Packt Publishing.

18 Botea, Adi; Bouzy, Bruno; Buro, Michael; Bauckhage, Christian & Nau, Dana. 2013. Pathfinding in Games. Verkkoaineisto. Schloss Dagstuhl – Leibniz Center for Informatics. https://drops.dag-

stuhl.de/opus/volltexte/2013/4333/pdf/4.pdf. Luettu 1.5.2021.

19 Watkinson, Mark. 2009. Real time character animation: a generic ap- proach to ragdoll physics. Verkkoaineisto. Birmingham: Coventry Univer- sity. https://citeseerx.ist.psu.edu/viewdoc/down-

load?doi=10.1.1.455.2606&rep=rep1&type=pdf. Luettu 1.5.2021.

Viittaukset

LIITTYVÄT TIEDOSTOT

Opinnäytetyötä varten tein tutkimuksen, missä mitattiin tietokoneen näytönohjaimen ja suorittimen tarvitsemaa aikaa näyttääkseen yhden pelin ruudun.. Tutkimuksen

TH: Kyllä, ja nyt sitten Peeti [peet] on saanut tuon tarkkuuskiväärin itselleen käteen, sillä to- dellakin pelottavasti on viime kierroksia pelannu, aika hajallaan, no nyt

Voi olla, että joitain kylän toimintoja on jäänyt mainitsematta, mutta älköön kukaan pahastuko jos näin on käynyt. M issä

Nimensä mukaan yksisivu-applikaatiot toimivat siten, että palvelimelta ladataan kaikki tarvittava yhdellä kertaa, jonka jälkeen käyttäjän toimintoja ohjataan vain selaimen

Seinäjoen ammattikorkeakoulun, kuten myös SeAMK Tekniikan, sisäisen asiak- kuuden toimintaprosessien tunteminen, tunnistaminen ja tunnustaminen olisi erit- täin

Laajemmin ymmärrettynä käyttökelpoisena kehyksenä toimii Forbes ja Ma- hanin (2005) formuloimat uskonnon ja populaarikulttuurin neljä suhdetta, jotka kuvastavat hyvin

Peltoenergia Kainuussa -hankkeen tarkoituksena on ollut edistää ruokohelven ja muun peltoenergian tuotantoa Kainuun alueella.. Tiloja on aktivoitu tiedottamalla peltoenergian ja

Puettavat laitteet muun muassa keräävät sensoreillaan tietoa, joka liittyy suoraan käyttäjän terveyteen ja elintoimintoihin, kuten esimerkiksi käyttäjän sydä- men