Unity 2: infinite 2D scroller

Seuraava peli jonka teemme, on infinite 2D scroller. Eli teemme ns. loppumattoman pelin, joka jatkuu niin pitkään kuin pelaaja pystyy sitä pelaamaan. Mitä meidän pitää etukäteen tehdä on 2D spriteja joita käytämme pelin animaatioissa. Tarvitsemme siis juoksuanimaation, hyppyanimaation, sekä liukuanimaation, sekä jos haluatte, kuolemisanimaation. Lisäksi tarvitsemme jonkin kerättävän asian, sekä lentävän vihollisen. Nämä kaikki ovat löydettävissä myös ohjaajien tekemänä Google Classroomista oppimateriaaleistamme.

Sanasto

Sprite=2D kuva, joista luodaan animaatioita.

Materiaalit

Jos haluatte ladata valmiit spritet, menkää classroom.google.com, ja avatkaa TIETOJA välilehti, ja avatkaa sieltä sellainen kohta kuin spritet. Teille pitäisi avautua uusi välilehti jossa on lista asioista joita spritet-tiedostosta löytyy. Painakaa oikeasta yläkulmasta alasnuolta  ladataksenne tiedostot. Menkää sitten tietokoneenne ladatut tiedostot-kansioon, ja etsikää juuri lataamamme spritet tiedosto. Painakaa siitä hiiren oikealla, ja valitkaa pura kaikki. Tämän jälkeen painakaa vain pura ilmestyneestä valikosta. Nyt teille pitäisi avautua kansio jossa on spritet kansio, jossa on kaikki tarvitsemamme spritet omissa kansioissaan.

Projektin luominen

Avataan Unity, ja luodaan uusi projekti. Voimme antaa sille minkä nimen haluamme, mutta ohjeissa sille annetaan nimeksi Infinite Scroller. Painakaa myös oikealta 2D kohta päälle, koska teemme 2D peliä 3D pelin sijaan. Sitten vain Create Project.

Kun projektimme on auki, se näyttää hieman erillaiselta kuin mitä olemme aijemmin nähneet. Esimerkiksi jos liikumme Scene näkymässä, pystymme liikkumaan vain ylös ja alas sekä sivuttain. Tämä johtuu siitä että teemme 2D-peliä, joten meidän ei tarvitse edes nähdä maailmaa 3D näkymässä, joten Unity antaa meidän liikkua vain 2D-näkymässä.

Jos katsomme Hierarchy näkymään vasemmalla, huomaamme ettei meillä ole scenessä myöskään valoa, ainoastaan kamera. Tämä johtuu siitä että 2D-peleissä käytämme spriteja, joihin valo ei vaikuta ollenkaan, vaan ne ovat aina saman näköisiä valosta huolimatta. valonlähde olisi siis turha, joten Unity ei edes lisää sitä scenen alussa peliin.

Myös kamera toimii hieman eri tavalla kuin 3D projektissa, mutta en mene siitä sen enempää yksityiskohtiin.

Siirretään aivan aluksi spritemme projektiin. Jos meillä on auki kansio, jossa on spritet kansio, otetaan kansiosta hiiren vasemmalla kiinni, ja vedetään se Project näkymään joka on unityn alhaalla.

nyt kaikki kuvamme ovat käyttövalmiita unityssa, joten voimme luoda ensimmäisen animaation.

Paina aivan ylhäältä Window kohtaa, ja paina auenneesta valikosta Animation. Tämä avaa meille uudenlaisen näkymän. Se avaa se kuitenkin eri ikkunalle, ja nyt ne menevät päällekkäin mikä ei ole hyvä. Otetaan näkymästä Animation-sanasta kiinni, ja vedetään se Scene, Asset Store, ja Game sanan perään. Nyt se käyttää hyödyksi samaa ikkunaa kuin nekin.

Tässä ikkunassa voimme rakentaa 2D-animaatioita aijemmin tehdyistä kuvista. Nämä kuvat voidaan tehdä missä tahansa kuvan muokkaus ohjelmassa, tai niinkuin me olemme tehneet, Blenderin 3D-mallista Renderöimällä. Luomme animaatioit vain asettamalla kuvat aikajanalle, mutta meidän on ensin luotava objekti johon animaation rakennamme.

 Avataan Project näkymässä spritet kansio, ja sieltä juoksu kansio. Tässä näemme kaikki juoksu-animaatioon tarvittavat kuvat. Otetaan kiinni ensimmäisestä kuvasta nimeltään 0001, ja vedetään se Hierarchy-näkymään.

Nyt Animation-näkymä ehdottaa animaation luomista, ja antaa napin Create. Painetaan siitä, ja se haluaa meidän luovan uuden tiedoston. Annetaan tiedostolle nimeksi Juoksu, ja painetaan save.

Nyt olemme luoneet uuden animaation, mutta siinä ei ole vielä mitään. Luomme animaation helpoiten valitsemalla kaikki kuvat, ja vetämällä ne samalla kertaa aikajanalle. Valitaan siis kaikki kuvat valitsemalla ensimmäinen kuva hiiren vasemmalla, ja shift pohjassa painamalla viimeistä kuvaa. Tämä valitsee kaikki tiedostot näiden kahden välillä. Meillä on kuitenkin yksi tiedosto joka ei ole kuva, nimeltään 0001. Pidetään Ctrl pohjassa, ja painetaan tästä 0001, niin sen valinta poistuu. Painetaan hiiren vasen nappi sitten pohjaan kuvien päällä ja vedetään kaikki kuvat Animation-näkymän aikajanalle.

Unity asettaa kaikki kuvat framen välein aikajanalle ja oikeaan järjestykseen. Nyt jos kokeilemme peliä painamalla oikeaa nuolta aivan yläreunasta, näemme miten hahmomme juoksee pelissä. Painetaan nuolesta uudestaan niin pääsemme pois testistä.

Tehdään sama mitä tehtiin edellisessäkin pelissä, ja liitetään kamera pelihahmoomme. Tämä onnistui ottamalla hiiren vasemmalla kiinni kamerasta Hierarchyssa, ja vetämällä se pelihahmon nimen päälle. Tällöin kamerasta tulee pelihahmon lapsi, ja se liikkuu samoin kuin pelihahmommekin.

Valitaan seuraavaksi pelihahmomme painamalla sen nimestä. Painetaan oikealta alhaalta Add Component, ja valitaan siitä avautuneesta valikosta Physics 2D, ja Box Collider 2D. Näin lisäämme pelihahmollemme neliön 2D Colliderin. Tästä tulee pelihahmomme hitboxi, eli mihin kaikki asiat pelihahmoomme törmäävät.

Oikealla näemme Box Collider 2D-komponentin tiedot. Muutetaan täällä Size-arvoja siten että ne ovat juuri hahmon kokoiset. Tällä hetkellä ne ovat nimittäin liian isot. Arvojen muuttaminen toimii painamalla arvosta ja kirjoittamalla jokin toinen arvo, tai ottamalla hiiren vasemmalla kiinni joko X tai Y kohdasta ja vetämällä se joko oikealle tai vasemmalle.

Lisätään sitten pelihahmoomme myös painovoima, ja tämähän onnistui lisäämällä Rigidbody komponentti objektiimme. Eli valitaan taas Add Component, Physics 2D ja tällä kertaa Rigidbody 2D joka on ylin vaihtoehto.

Muutetaan kopmonenttia taas samoin kuin aijemmassakin pelissä, eli avataan Constraints kohta Rigidbody 2D:n valikosta, ja painetaan Freeze Rotation päälle. Nyt hahmomme ei voi kaatua kumoon.

Lisätään seuraavaksi ns. maa peliimme. Käyttäkää itse tekemäänne maata, tai etsikää Project näkymästä sellainen kuva kuin talo. Otetaan kuvasta kiinni, ja vedetään se Hierarchyyn. Kuva menee automaattisesti keskelle Sceneä, joten painetaan W, ja vedetään vihreästä nuolesta taloa alaspäin, että se olisi juuri pelaajahahmon ala puolella. Voimme myös suurentaa tai pienentää taloa oman maun mukaan. Tämä onnistui painamalla R, ja sitten vetämällä valkoisesta neliöstä objektin keskellä.

Lisätään sitten myös taloon Box Collider 2D samalla tavoin kuin pelaajahahmoommekin, eli Add Component, Physics 2D  ja sitten Box Collider 2D. 

Nyt jos kokeilemme peliä, näyttää siltä kuin pelaaja juoksisi talon päällä, mutta se pysyy vielä paikallaan. Tehdään tämä siis seuraavaksi koodissa. Eli painetaan Project näkymää hiiren oikealla, painetaan Create, ja valitaan C# script, ja annetaan tiedostolle nimeksi vaikkapa liike, mutta voitte nimetä sen kyllä miksi ikinä haluatte. Otetaan Scriptistä kiinni hiiren vasemmalla ja vedetään se Hierarchy-näkymään pelaajahahmomme nimen päälle. Näin olemme lisänneet Scriptin peliobjektiin. Avataan Scripti sitten kaksoiklikkaamalla siitä Project-näkymässä.

Kirjoitetaan Scriptiin näin:

//Nämä 3 riviä ovat koodissa jo valmiina

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

//Tämäkin on koodissasi jo valmiina, ja "liike" sanan tilalla pitäisi olla scriptisi nimi. Jos ei ole, niin kirjoita se siihen.

public class liike : MonoBehaviour {

//luodaan tämän jälkeen kaikki muuttujat

float nopeus = 0.01f;

//Tämä tapahtuu joka frame, tähän kannattaa laittaa kaikki liikkuminen

void FixedUpdate()

{

//liikutetaan pelihahmoamme oikealle

transform.position += Vector3.right * nopeus;

//suurennetaan nopeus arvoa, että pelihahmo nopeutuu pelin edetessä koko ajan hieman

nopeus += 0.0001f;

}

}

Mitä teemme, niin luomme float muuttujan nimeltään nopeus, ja annamme sille arvon. Sitten FixedUpdate:n aaltosulkeiden sisällä siirrämme pelihahmoamme, ja kasvatamme nopeutta hieman, että peli hahmomme liike nopeutuisi koko pelin ajan hieman suuremmaksi. Tämä tekee pelistä vaikeamman mitä pidemmälle mennään. Tallennetaan CTRL+S näppäinyhdistelmällä ja kokeillaan peli.

Luodaan seuraavaksi peliin liukuminen. Aloitetaan tämä luomalla uusi animaatio. Tämä onnistuu valitsemalla pelaajaobjektimme, ja menemällä Animation näkymään painamalla siitä. Näemme Animation näkymän vasemmassa yläkulmassa ensimmäisen animaatiomme nimen, tässä tilanteessa juoksu. Painetaan siitä, ja meille aukeaa valikko kaikista luomistamme animaatioista, joita on tällä hetkellä vain yksi. Listan alimpana on myös vaihtoehto Create New Clip. Painetaan siitä, ja annetaan uudelle animaatiollemme nimi. Esimerkissä annamme nimen liukuu. Animaatio kannattaa tallentaa samaan kansioon kuin animaation kuvat, eli tällä kertaa liukuu kansioon.

Nyt Animation-näkymän tulisi näyttää tyhjältä, koska kyseessä on uusi animaatio. Etsitään Project-näkymästä sellainen kansio kuin liuku, jossa tulisi olla vain yksi kuva. Tämä on vaatimaton liukumisanimaatiomme. Painetaan kuvasta hiiren vasemmalla, pidetään se pohjassa ja vedetään kuva Animation-näkymän aikajanalle. Tässä on uusi animaatiomme.

Painetaan yläpalkista Window, ja valitaan tällä kertaa Animator-kohta. Meille tulee taas uudenlainen näkymä esille. Tämä on valmiiksi samassa ikkunassa kuin Animation, ja löytyykin sen vierestä.

katsotaan Animator-näkymää hieman tarkemmin. Sen tulisi näyttää tällä hetkellä jokseenkin tällaiselta:

Jos Animator ei näytä samalta kuin kuvassa, valitkaa pelaajaobjektimme vasemmalta listasta.

Animator on graafinen näkymä jolla määräämme miten luomiamme animaatioita pyöritetään pelissä. Toisin sanoen, voimme vetää täällä nuolia animaatioista toisiin, ja peli ymmärtää siirtyä siihen. Voimme antaa myös ehtoja milloin toiseen animaatioon tulisi siirtyä.

Tällä hetkellä pitäisi täällä näkyä neljä eri laatikkoa jotka ovat Entry, Any State, Juoksu ja Liuku, sekä yksi nuoli joka menee Entry-kohdasta Juoksu-kohtaan. Tämä tarkoittaa sitä, että pelin alussa menee peli heti pyörittämään Juoksu-animaatiota.

Painetaan hiiren oikealla Juoksu-kohdan päältä, ja valitaan Make Transition. Tämän jälkeen painetaan hiiren vasemmalla Liuku-kohtaa. Nyt laatikoita yhdistää nuoli. Painetaan hiiren oikealla nyt Liuku-kohtaa, valitaan Make Transition, ja painetaan hiiren vasemmalla Juoksu-kohtaa. Nyt animaatiot voivat liikkua toistensa välillä.

Jos kokeilemme peliä nyt, ne kuitenkin vaihtuvat toistensa välillä koko ajan. Tämä johtuu siitä ettemme antaneet vielä mitään arvoa jonka mukaan animaatiot vaihtuvat. Animator-näkymässä hieman vasemmassa yläkulmassa pitäisi näkyä sellainen kohta kuin Parameters. Painetaan siitä. Meillä pitäisi nyt näkymässä vasemmalla lukea The list is empty, eli meillä ei ole mitään arvoja luotuna joiden mukaan animaatiot muuttuisivat. Etsitään pieni + (plus) merkki, ja painetaan siitä, niin meille avautuu pieni valikko. Valitaan sieltä Bool, ja annetaan sille nimeksi liuku.

Nyt meillä on bool arvo jota voimme käyttää. Valitaan nuoli joka osoittaa Juoksu animaatiosta liuku animaatioon painamalla siitä hiiren vasemmalla. Katsotaan sitte Inspector-näkymää, jonka tulisi näyttää jokseenkin tältä:

Mitä haluamme tehdä, niin poistetaan ruksi Has Exit Time-kohdasta. Tämä tarkoittaa sitä, että vasta animaation lopussa siirrytään seuraavaan animaatioon, mutta me haluamme että hahmo menee liukuun heti nappia painettua, joten otimme ruksin pois. Tämän jälkeen katsotaan alas, jossa lukee List Is Empty. Painetaan pientä plussaa oikealta, ja meidän juuri luomamme Bool arvo ilmestyy sen paikalle, ja sen vieressä lukee True. Eli nyt, aina kun bool-arvomme on totta, muuttuu animaatio liukumiseksi.

Valitaan sitten nuoli joka osoittaa Liuku animaatiosta Juoksu animaatioon. Tehdään sama kuin edellisellekkin kohdalle, eli poistetaan ruksi Has Exit Time-kohdasta, ja painetaan plussaa alhaalta. Taas ilmestyy Bool arvomme nimi, sekä sen viereen True. Mutta tällä kertaa painetaan True-kohdasta, ja valitaankin False. Eli nyt kun arvo ei olekkaan totta, animaatio palaa takaisin juoksuun.

Palataan scriptin joukkoon.

//Nämä 3 riviä ovat koodissa jo valmiina

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

//Tämäkin on koodissasi jo valmiina, ja "liike" sanan tilalla pitäisi olla scriptisi nimi. Jos ei ole, niin kirjoita se siihen.

public class liike : MonoBehaviour {

//luodaan tämän jälkeen kaikki muuttujat

float nopeus = 0.01f;

Animator anim;

void Start(){

                //Annetaan muuttujalle arvoksi objektin oma komponentti, jolloin meidän ei joka kerta tarvitse kirjoittaa GetComponent<Animator>() jos haluamme päästä käsiksi siihen.

        anim=GetComponent<Animator>();

}

//Tämä tapahtuu tasan joka frame, tähän kannattaa laittaa pelaajan nappien painallukset

void Update(){

//jos painetaan hiiren vasenta, tai kosketetaan kännykän näyttöä, niin päästään aaltosulkeiden sisään.

        if(Input.GetMouseButton(0) || Input.touchCount > 0){

//Luodaan uusi Vector3, johon tallennamme mihin kohtaan peliä pelaaja painoi

                Vector3 kohta;

//Jos pelaaja pelaakin kännykällä, saadaan tästä pelaajan kosketuksen kohta

                if(Input.touchCount>0){

                        kohta=Input.touches[0].position;

                }

//Jos pelaaja ei pelaakkaan kännykällä, pelaa hän tietokoneella, joten otetaankin hiiren kursorin kohta

else{

                        kohta=Input.mousePosition;

                }

                    //Jos pelaaja painaa ruudun alapuolelle, laitetaan pelihahmo liukumaan.

                    if (kohta.y < Screen.height / 2)

                    {

                                //Määritellään että Animator-komponenttiin luomamme bool-muuttujan arvo on True

                                anim.SetBool("liuku", true);

                    }

                    //jos kohta on ruudun yläpuolella, laitetaan pelaaja hyppäämään

                    else if (kohta.y > Screen.height / 2)

                    {

                    }

}

else

{

                        //Määritellään että Animator-komponenttiin luomamme bool-muuttujan arvo on False

anim.SetBool("liuku", false);

}

}

//Tämä tapahtuu joka frame, tähän kannattaa laittaa kaikki liikkuminen

void FixedUpdate()

{

//liikutetaan pelihahmoamme oikealle

transform.position += Vector3.right * nopeus;

//suurennetaan nopeus arvoa, että pelihahmo nopeutuu pelin edetessä koko ajan hieman

nopeus += 0.0001f;

}

}

Tässä on taas paljon asiaa, joten kirjoittakaa rauhassa. Kommentteja, eli vihreällä kirjoitettuja kohtia ei ole pakko kirjoittaa, ne vain kertovat mitä koodissa tehdään.

Mitä aivan aluksi teemme on se, että luomme uuden Animator-muuttujan, jolle annamme Start() aaltosulkeiden sisällä arvoksi objektin oman Animator-komponentin. Tämä on helppo tapa yksinkertaistaa koodia, ettei meidän joka kerta tarvitse kirjoittaa GetComponent<komponentinnimi>() jos haluamme päästä käsiksi komponenttiin. Voimme vain luoda oikeanlaisen muuttujan, johon otamme komponentin ns. muistiin. Kaikki muuttujalle tehdyt muutokset menevät automaattisesti myös komponenttiin.

Luomme myös Update()-methodin, johon siis keräämme kaikki käyttäjän antamat syötteet. Siellä teemme if-lausekkeen, joka tarkistaa onko hiiren vasenta painiketta painettu, tai onko touch:eja enemmän kuin 0. Touch tarkoittaa siis näytön kosketusta jos pelaamme älylaitteella, ja koska teemme pelin toimimaan myös kännykällä, tarkistamme molemmat.

Jos jompikumpi on totta, pääsemme aaltosulkeiden sisään, jossa luomme uuden Vector3 muuttujan. Tämän jälkeen tarkistamme pelaako pelaaja siis kännykällä vai tietokoneella, ja riippuen siitä, annetaan Vector3-muuttujalle arvoksi joko kosketuksen kohdan, tai kursorin kohdan.

Tämän jälkeen tarkistamme, onko Vector3-muuttujan Y-arvo pienempi tai suurempi kuin näytön korkeus jaettuna kahdella, eli painaako pelaaja näytön ylä- vai alareunasta. Jos hän painaa alareunasta, asetetaan Animator-muuttujaan luomamme bool-muuttujan arvoksi True. Tämä tarkoittaa sitä että painamme alaspäin, eli haluamme liukua, jolloin liukumis animaatio lähtee pyörimään.

Jos pelaaja ei painakkaan hiiren vasenta tai kosketa näyttöä, pääsemme else:n aaltosulkeiden väliin, jossa asetammekin Animator-muuttujaan luomamme bool-muuttujan arvoksi False. Eli koska emme paina enää alaspäin, niin tulisi animaation palata takaisin juoksuun.

Tallennetaan taas CTRL+S näppäinyhdistelmällä. Nyt voimme kokeilla peliä. Pelaaja lähtee juoksemaan ja liikkuu ihan normaalisti. Jos painamme näytön keskikohdan alapuolelta, niin huomaamme että pelihahmo lähteekin luisumaan juuri kuten halusimmekin. Mutta vaikka pelihahmo liukuukin, sen Box Collider 2D pysyy samana kuin aijemmin, eli objektin hitboxi on vielä pystyssä. Tämä on korjattava.

Ellemme menneet jo, niin palataan Unityyn, ja valitaan pelaajahahmomme Hierarchy-näkymässä. Painetaan Add Component taas Inspector-näkymässä aivan oikealla, valitaan Physics 2D, ja taas Box Collider 2D. Eli nyt objektissamme onkin kaksi Box Collider 2D-komponenttia. Painetaan Scene kohdasta että pääsemme taas Scene-näkymään, ja muokataan jälkimmäistä siten, että se olisi suunnilleen liukuvan hahmomme levyinen ja korkuinen, ja pienennetään sen Offset Y arvoa jotta collider olisi hyvällä korkeudella.

Testataan peliä tarkistaaksemme että colliderit ovat varmasti hyvin, ja palataan sen jälkeen scriptiin. Tehdään seuraavat muutokset sinne:

//Nämä 3 riviä ovat koodissa jo valmiina

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

//Tämäkin on koodissasi jo valmiina, ja "liike" sanan tilalla pitäisi olla scriptisi nimi. Jos ei ole, niin kirjoita se siihen.

public class liike : MonoBehaviour {

//luodaan tämän jälkeen kaikki muuttujat

float nopeus = 0.01f;

Animator anim;

//Tämä on hieman erillainen muuttuja kuin muut, koska siinä on [] muuttujan tyypin perässä. Mitä tämä tarkoittaa selitetään alempana, sekä c# materiaaleissa kohdassa Array.

BoxCollider2D[] colliderit;

void Start(){

                //Annetaan muuttujalle arvoksi objektin oma komponentti, jolloin meidän ei joka kerta tarvitse kirjoittaa GetComponent<Animator>() jos haluamme päästä käsiksi siihen.

        anim=GetComponent<Animator>();

                //Annetaan muuttujalle arvoksi objektin kaikki BoxCollider2D komponentit. Huomaa, että se on GetComponents, eli S-kirjain perään.

        colliderit=GetComponents<BoxCollider2D>();

                //Asetetaan jälkimmäinen box collider, eli se joka tulee luisuun, pois päältä ettei se törmää mihkään silloin kun hahmomme juoksuu pystyssä.

        colliderit[1].enabled=false;

}

//Tämä tapahtuu tasan joka frame, tähän kannattaa laittaa pelaajan nappien painallukset

void Update(){

//jos painetaan hiiren vasenta, tai kosketetaan kännykän näyttöä, niin päästään aaltosulkeiden sisään.

        if(Input.GetMouseButton(0) || Input.touchCount > 0){

//Luodaan uusi Vector3, johon tallennamme mihin kohtaan peliä pelaaja painoi

                Vector3 kohta;

//Jos pelaaja pelaakin kännykällä, saadaan tästä pelaajan kosketuksen kohta

                if(Input.touchCount>0){

                        kohta=Input.touches[0].position;

                }

//Jos pelaaja ei pelaakkaan kännykällä, pelaa hän tietokoneella, joten otetaankin hiiren kursorin kohta

else{

                        kohta=Input.mousePosition;

                }

                    //Jos pelaaja painaa ruudun alapuolelle, laitetaan pelihahmo liukumaan.

                    if (kohta.y < Screen.height / 2)

                    {

                                //Määritellään että Animator-komponenttiin luomamme bool-muuttujan arvo on True

                                anim.SetBool("liuku", true);

                                //Asetetaan pystyssä oleva collider pois päältä, ja kumossa oleva collider päälle, jolloin tulee vaikutelma että hitbox muuttuu hahmon mukana

                                colliderit[0].enabled = false;

                                colliderit[1].enabled = true;

                    }

                    //jos kohta on ruudun yläpuolella, laitetaan pelaaja hyppäämään

                    else if (kohta.y > Screen.height / 2)

                    {

                    }

}

else

{

                        //Määritellään että Animator-komponenttiin luomamme bool-muuttujan arvo on False

anim.SetBool("liuku", false);

                        colliderit[0].enabled = true;

                        colliderit[1].enabled = false;

}

}

//Tämä tapahtuu joka frame, tähän kannattaa laittaa kaikki liikkuminen

void FixedUpdate()

{

//liikutetaan pelihahmoamme oikealle

transform.position += Vector3.right * nopeus;

//suurennetaan nopeus arvoa, että pelihahmo nopeutuu pelin edetessä koko ajan hieman

nopeus += 0.0001f;

}

}

Mitä nyt koodissa teimme, niin loimme uuden BoxCollider2D-muuttujan nimeltään "colliderit", mutta se ei ole ihan tavallinen muuttuja, sillä tyypin perässä oli vielä [ ]. Tämä tarkoittaa sitä, että muuttuja on Array. 

Array

Array tarkoittaa ohjelmoinnissa jonoa samankaltaisia muuttujia jotka ovat kaikki yhdessä muuttujassa. Eli voimme asettaa monta eri arvoa yhteen muuttujaan, ja päästä halutessamme niihin kaikkiin käsiksi milloin haluamme. Pääsemme muuttujiin käsiksi kirjoittamalla muuttujan nimen, ja sitten monennenko arvon muuttujasta haluamme siten, että 0 on ensimmäinen arvo. Tästä selitetään tarkemmin c#-materiaaleissa, joten kannattaa lukea sieltä.

Start-methodissa asetamme muuttujalle arvon GetComponents, eli se ottaa kaikki haluamamme kaltaiset muuttujat objektista ja asettaa ne jonoon. Eli tässä tapauksessa se ottaa objektistamme molemmat BoxCollider2D, ja asettaa ne jonoon meille. Koska se ottaa nämä komponentit järjestyksessä, ensimmäisenä pitäisi olla pystyssä oleva collider ja toisena on kumossa oleva. Koska aloitamme pelin juoksemalla, asetetaan toisen colliderin enabled-arvo falseksi, eli objekti lopettaa toistaiseksi toimintansa.

Tämän jälkeen vaihtelemme molempien komponenttien enabled arvoja, jotta kun toinen on päällä, toinen menee pois päältä. Joten nyt kun kokeilemme peliä, aina kun liu'umme, menee toinen Collider päälle, ja toinen pois, ja kun lopetamme niin tapahtuu taas sama mutta päin vastoin.

Eli nyt kannattaa kokeilla peliä että se varmasti toimii oikein.

Luodaan seuraavaksi peliin hyppiminen, ja aloitamme sen samalla tavalla kuin luisumisenkin, eli luomalla animaatiot. Tähän meille on varattu 3 eri animaatiota, joten tehdään ne kaikki samantien.

Siirrytään Animation-näkymään, ja painetaan tämän hetkisen animaation nimestä vasemmasta yläkulmasta, ja valitaan taas Create New Clip. Annetaan sille nimeksi hyppy, ja tallennetaan se hyppy-kansioon. Etsitään hyppy-kansio Project-näkymästä alhaalta, valitaan taas kaikki kuvat, ja vedetään ne animaatioon. Hyppy-kansiossa pitäisi olla myös hyppy-tiedosto. Se on juuri luomamme animaation tiedosto. Painetaan siitä hiiren vasemmalla, ja katsotaan oikealle Inspector-näkymään. Siellä pitäisi olla sellainen ruksi kuin Loop Time. Otetaan tämä ruksi pois, jolloin hyppyanimaatiomme ei looppaa, eli toista itseään loputtomiin. Näyttäisi hassulta jos hahmomme hyppää kerran, ja jatkaa hyppyponnistusta vielä ilmassakin.

Valitaan pelihahmomme taas Hierarchy-näkymästä. Nyt voimme luoda uuden animaation, eli taas, painetaan vasemmalta ylhäältä animaation nimestä, ja valitaan Create New Clip. Annetaan sille tällä kertaa nimeksi alas, ja tallennetaan se alas kansioon. Etsitään taas kyseinen alas-kansio, valitaan kaikki kuvat ja asetetaan ne animaatioon. Tehdään tälle animaatiolle myös sama kuin edellisellekkin, eli etsitään kyseinen tiedosto, ja painetaan Loop Time pois päältä.

Toistetaan sama vielä kerran, ja laitetaan sen nimeksi osuu (niin kuin osuu maahan(en ole mestari nimeämisessä)). Ja taas, etsi tiedosto, Loop Time pois päältä. Nyt meillä on hyppyyn tarvittavat animaatiot, joten siirrytään Animator välilehteen.

Siellä pitäisi näkyä kaikki 3 uutta animaatiotamme. Meidän kannattaa hieman siirrellä niiden paikkoja että ne ovat hyvin. Voimme siirrellä laatikoita ottamalla niistä hiiren vasemmalla kiinni ja vetämällä ne eri paikkaan.

Mitä tehdään seuraavaksi, on yhdistää animaatiot oikein. Eli painetaan hiiren oikealla juoksu-laatikosta, valitaan Make Transition, ja painetaan sitten hiiren vasemmalla hyppy-laatikkoa, jolloin nuoli yhdistyy laatikoiden välille. Painetaan hiiren oikealla nyt hyppy-laatikkoa, valitaan Make Transition, ja painetaan sitten alas-laatikkoa. Sama vielä uudestaan, hiiren oikealla alas-laatikkoa, Make Transition, ja painetaan osuu-laatikkoa. Ja VIELÄ kerran, hiiren oikealla osuu-laatikkoa, Make Transition ja painetaan se juoksu-laatikkoon. Eli nyt meillä pitäisi olla tämän näköinen ympyrä tehtynä.

Seuraavaksi, vasemmalla pitäisi näkyä vielä Bool-muuttujamme, liuku. Jos ei näy, niin painetaan Parameter-kohdasta hieman sieltä oikealla. Painetaan pientä valkoista +(plus) merkkiä, ja valitaan taas Bool. Annetaan sille tällä kertaa nimeksi hyppy. Painetaan +(plus) merkkiä vielä kerran, valitaan vielä kerran Bool, ja annetaan sille nimeksi maassa.

Painetaan nuolta juoksu ja hyppy laatikoiden välillä. Katsotaan oikealle, ja otetaan has exit time-ruksi pois päältä. Painetaan myös plussaa alhaalta Conditions-kohdasta. Tähän pitäisi ilmestyä liuku ja true. Painetaan alaspäin nuolta liuku kohdan vierestä, ja valitaan hyppy.

Painetaan nyt nuolta hyppy ja alas laatikoiden väliltä. Otetaan taas has exit time-ruksi pois päältä, ja painetaan alhaalta plussaa. Painetaan taas alaspäin nuolta, ja valitaan hyppy. Vaihdetaan True arvo myös False arvoksi.

Painetaan nyt nuolta alas ja osuu-laatikoiden väliltä. Taas, has exit time pois päältä, ja alhaalta plussaa. Valitaan tällä kertaa hyppy kohdan sijaan maassa.

Nyt meillä pitäisi olla hyppyyn animaatio valmiina, joten siirrytään taas koodin puoleen. Tehdään nämä muutokset koodiin:

//Nämä 3 riviä ovat koodissa jo valmiina

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

//Tämäkin on koodissasi jo valmiina, ja "liike" sanan tilalla pitäisi olla scriptisi nimi. Jos ei ole, niin kirjoita se siihen.

public class liike : MonoBehaviour {

//luodaan tämän jälkeen kaikki muuttujat

float nopeus = 0.01f;

Animator anim;

//Tämä on hieman erillainen muuttuja kuin muut, koska siinä on [] muuttujan tyypin perässä. Mitä tämä tarkoittaa selitetään alempana, sekä c# materiaaleissa kohdassa Array.

BoxCollider2D[] colliderit;

bool hypitty = true;

public LayerMask taso;

void Start(){

                //Annetaan muuttujalle arvoksi objektin oma komponentti, jolloin meidän ei joka kerta tarvitse kirjoittaa GetComponent<Animator>() jos haluamme päästä käsiksi siihen.

        anim=GetComponent<Animator>();

                //Annetaan muuttujalle arvoksi objektin kaikki BoxCollider2D komponentit. Huomaa, että se on GetComponents, eli S-kirjain perään.

        colliderit=GetComponents<BoxCollider2D>();

                //Asetetaan jälkimmäinen box collider, eli se joka tulee luisuun, pois päältä ettei se törmää mihkään silloin kun hahmomme juoksuu pystyssä.

        colliderit[1].enabled=false;

}

//Tämä tapahtuu tasan joka frame, tähän kannattaa laittaa pelaajan nappien painallukset

void Update(){

//jos painetaan hiiren vasenta, tai kosketetaan kännykän näyttöä, niin päästään aaltosulkeiden sisään.

        if(Input.GetMouseButton(0) || Input.touchCount > 0){

//Luodaan uusi Vector3, johon tallennamme mihin kohtaan peliä pelaaja painoi

                Vector3 kohta;

//Jos pelaaja pelaakin kännykällä, saadaan tästä pelaajan kosketuksen kohta

                if(Input.touchCount>0){

                        kohta=Input.touches[0].position;

                }

//Jos pelaaja ei pelaakkaan kännykällä, pelaa hän tietokoneella, joten otetaankin hiiren kursorin kohta

else{

                        kohta=Input.mousePosition;

                }

                    //Jos pelaaja painaa ruudun alapuolelle, laitetaan pelihahmo liukumaan.

                    if (kohta.y < Screen.height / 2&&hypitty)

                    {

                                //Määritellään että Animator-komponenttiin luomamme bool-muuttujan arvo on True

                                anim.SetBool("liuku", true);

                                //Asetetaan pystyssä oleva collider pois päältä, ja kumossa oleva collider päälle, jolloin tulee vaikutelma että hitbox muuttuu hahmon mukana

                                colliderit[0].enabled = false;

                                colliderit[1].enabled = true;

                    }

                    //jos kohta on ruudun yläpuolella, laitetaan pelaaja hyppäämään

                    else if (kohta.y > Screen.height / 2&&hypitty)

                    {

                        //Nämä 3 riviä ovat samat kuin elsessä hieman myöhemmin. Syy miksi ne ovat myös tässä on siksi, koska muuten pelaaja voisi glitchata pelin ja hypätä, vaikka hän onkin vielä liukumassa. Nyt peli ei glitchaannu.

        anim.SetBool("liuku", false);

                                colliderit[0].enabled = true;

                                colliderit[1].enabled = false;

                        //Lisätään rigidbodyyn ylösmenevää voimaa hypyn saamiseksi

                        GetComponent<Rigidbody2D>().velocity = Vector3.up * 10;

                        //Asetetaan hyppy bool oikein että hyppy animaatio lähtee pyörimään, sekä hypitty bool vääräksi ettei ilmassa voi yhtäkkiä hypätä uudestaan. Asetetaan myös maassa bool väärin, että tiedämme milloin osumme maahan ja lähtee oikea animaatio pyörimään.

                        anim.SetBool("hyppy",true);

                        hypitty=false;

                        anim.SetBool("maassa",false);

                    }

}

else

{

                        //Määritellään että Animator-komponenttiin luomamme bool-muuttujan arvo on False

anim.SetBool("liuku", false);

                        colliderit[0].enabled = true;

                        colliderit[1].enabled = false;

}

//kun hahmo on hypännyt aivan ylös, ja painovoima vetääkin sitä alaspäin, laitetaan seuraava animaatio pyörimään.

if (GetComponent<Rigidbody2D>().velocity.y < 0)

{

        anim.SetBool("hyppy", false);

}

}

//Tämä tapahtuu joka frame, tähän kannattaa laittaa kaikki liikkuminen

void FixedUpdate()

{

//liikutetaan pelihahmoamme oikealle

transform.position += Vector3.right * nopeus;

//suurennetaan nopeus arvoa, että pelihahmo nopeutuu pelin edetessä koko ajan hieman

nopeus += 0.0001f;

}

void OnCollisionEnter2D(Collision2D col)

{

RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, 3, taso);

if (hit.transform != null)

{

anim.SetBool("maassa", true);

hypitty = true;

}

}

}

Teemme tässä taas paljon uutta, joten kirjoittakaa rauhassa, kaikki selitetään kyllä. Luomme kaksi uutta muuttujaa, toinen on Bool jolla tarkistamme on pelaaja hypännyt vai ei, ja pidetään huoli ettei pelaaja voi hypätä kahdesti. Luomme myös julkisen LayerMask muuttujan.

LayerMask

LayerMask on layer eli taso, ja toimii hieman samalla tavalla kuin layerit esimerkiksi kuvanmuokkaus ohjelmissa. Voimme laittaa objekteja eri layereille, ja ne toimivat hieman eri tavalla. Tässä tarvitsemme sitä Raycast:in takia. Raycast tarkistaa osuuko suora säde johonkin, kun se liikkuu paikasta A paikkaan B. Jos osuu, se ottaa sen tiedot muistiin. Voimme laittaa Raycastin osumaan vain tietyn Layerin objekteihin, jolloin se ei välitä muista kuin vain yhden layerin objekteista. Selitän miksi teemme näin myöhemmin.

Seuraavaksi käytämme koodissa juuri luomaamme hypitty boolia hyödyksi. Jos hypitty on totta, tarkoittaa se silloin sitä ettei pelaaja ole vielä hypännyt, eli hän voi joko mennä nyt luisuun, tai hypätä.

Nyt jos pelaaja painaa ruudun yläosasta pelissä, pelaaja hyppää. Laitoimme aivan alkuun varmistuksen että oikeat colliderit ovat käytössä. Tämän jälkeen lisäämme objektiin ylösmenevää voimaa että saamme hypyn tehtyä. Asetamme animaation hyppy boolin trueksi, että animaatio menee nyt hyppyanimaatioon. Asetamme myös animaation maassa boolin falseksi, että silloin kun osumme maahan, oikea animaatio lähtee pyörimään. Asetamme myös hypitty booli falseksi, koska hyppäsimme juuri, emmekä halua tuplahyppyä peliin.

Seuraavaksi teemme tarkistuksen koodissa onko objektissa alasmenevää voimaa, eli toisin sanoen liikkuuko objekti tällä hetkellä alaspäin painovoiman takia. Jos liikkuu, mennään seuraavaan animaatioon.

OnCollisionEnter2D

Koska teemme 2D peliä, ja käytämme 2D fysiikoita, jotta saamme törmäyksen tiedot, pitää meidän käyttää myös 2D methodeja. OnCollisionEnter2D toimii siis täysin samalla tavalla kuin OnCollisionEnter edellisessä pelissä, mutta vain 2D-objekteilla ja komponenteilla.

Teemme siis samalla tavalla kuin edellisessäkin pelissä, ja tarkistamme Physics.Raycast:in avulla onko osuttu objekti pelaajan alapuolella, paitsi että sekin on tietenkin Physics2D.Raycast, koska 2D peli. Käytämme tässä myös juuri asettamaamme layeria, jotta osumme vain tietyllä layerilla oleviin objekteihin. Jos objekti on pelaajan alla, pyörittää animaatio taas yhden osan, ja menee sitten juoksuanimaatioon.

Painetaan taas CTRL+S, ja palataan Unityyn. Valitaan maa objektimme (meillä se on talo) Hierarchysta vasemmalla. Katsotaan sitten Inspectoriin oikealle yläkulmaan. Siellä on Layer kohta, jonka arvo on default. Painetaan defaultista,         ja valitaan alin vaihtoehto joka on Add Layer…. Tämä vie tämän näköiseen näkymään:

Täällä on noin 7 layeria varattuna Unitylle itselleen, joten luodaan oma Layeri 8 kohtaan. Painetaan tyhjästä laatikosta 8 vieressä, ja kirjoitetaan siihen maa .

Valitaan talo taas Hierarchysta, valitaan taas Layer kohdan default, ja tällä kertaa siellä on uusi valinta nimeltään maa. Painetaan siitä, niin talon Layeriksi muuttuu maa.

Valitaan nyt pelaaja hahmomme, ja katsotaan Inspector-näkymään. Siellä pitäisi olla scriptimme tiedot jossakin. Sen pitäisi tällä hetkellä näyttää tältä:

Siellä on public muuttujamme, joka oli nimeltään taso, sekä sen vieressä lukee Nothing. Painetaan Nothing kohdasta, ja valitaan siihen juuri luomamme Layer, eli maa. Nyt jos kokeilemme peliä, pelaajan pitäisi toimia täydellisesti!

Meillä on kuitenkin vielä ongelma. Talomme loppuu erittäin nopeasti, eikä pelaajalla ole mitään mihin juosta! Tämä korjataan koodissa! Eli palataan taas scriptiin, ja tehdään nämä muutokset:

//Nämä 3 riviä ovat koodissa jo valmiina

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

//Tämäkin on koodissasi jo valmiina, ja "liike" sanan tilalla pitäisi olla scriptisi nimi. Jos ei ole, niin kirjoita se siihen.

public class liike : MonoBehaviour {

//luodaan tämän jälkeen kaikki muuttujat

float nopeus = 0.01f;

Animator anim;

//Tämä on hieman erillainen muuttuja kuin muut, koska siinä on [] muuttujan tyypin perässä. Mitä tämä tarkoittaa selitetään alempana, sekä c# materiaaleissa kohdassa Array.

BoxCollider2D[] colliderit;

bool hypitty = true;

public LayerMask taso;

public GameObject maa;

float leveys;

//Tämä on taas hieman erilainen muuttuja kuin muut. Tämä toimii hieman samalla tavalla kuin aijemmin käytetty Array.

List<GameObject> maat=new List<GameObject>();

void Start(){

                //Annetaan muuttujalle arvoksi objektin oma komponentti, jolloin meidän ei joka kerta tarvitse kirjoittaa GetComponent<Animator>() jos haluamme päästä käsiksi siihen.

        anim=GetComponent<Animator>();

                //Annetaan muuttujalle arvoksi objektin kaikki BoxCollider2D komponentit. Huomaa, että se on GetComponents, eli S-kirjain perään.

        colliderit=GetComponents<BoxCollider2D>();

                //Asetetaan jälkimmäinen box collider, eli se joka tulee luisuun, pois päältä ettei se törmää mihkään silloin kun hahmomme juoksuu pystyssä.

        colliderit[1].enabled=false;

        //Otamme maa objektistamme componentin Renderer, joka siis tietää miltä objekti näyttää, ja otamme muistiin objektin leveyden.

        leveys=maa.GetComponent<Renderer>().bounds.extents.x * 2;

        //Pystymme lisäämään list muuttujaan haluamiamme muuttujia, joten keräämme siihen kaikki maaobjektit joita teemme

        maat.Add(maa);

                //Tämä saattaa näyttää oudolta, mutta ei hätää, se toimii vähän samoin kuin while. for sulkeiden sisällä luomme int muuttujan nimeltä i, annamme sille arvon nolla, ja niin kauan kun i on pienempi kuin 3, tehdään mitä aaltosulkeiden sisällä on. Aina kun aaltosulkeet käydään läpi, i lisääntyy yhdellä, eli peli tekee aaltosulkeet 3 kertaa. Lisää tästä löydät c# materiaaleista.

        for(int i=0; i<3; i++){

                //Instantiate, eli kopioimme peliobjektin, ja lisäämme sen listaamme.

                maat.Add(Instantiate(maat[0]));

                //Tässä annamme sille uuden kohdan johon mennä. Käytämme tässä Random.Range methodia, joka toimii samalla tavalla kuin random c# materiaaleissa.

                maat[maat.Count-1].transform.position=maat[maat.Count - 2].transform.position + new Vector3(leveys+Random.Range(0,4f), Random.Range(-4f, 4f), 0);

}

}

//Tämä tapahtuu tasan joka frame, tähän kannattaa laittaa pelaajan nappien painallukset

void Update(){

        //Tarkistamme onko viimeinen maapläntti tarpeeksi kaukana että sen voisi poistaa.

if (maat[0].transform.position.x < transform.position.x - leveys)

                {

                //Tuhotaan se!

Destroy(maat[0]);

//Poistetaan se

maat.RemoveAt(0);

//Luodaan sen tuhkista uusi maaaa!

maat.Add(Instantiate(maat[0]));

//ja annetaan sille uusi paikka elämässä!

maat[maat.Count - 1].transform.position = maat[maat.Count - 2].transform.position + new Vector3(leveys+Random.Range(0,4f), Random.Range(-4f, 4f), 0);

}

//jos painetaan hiiren vasenta, tai kosketetaan kännykän näyttöä, niin päästään aaltosulkeiden sisään.

        if(Input.GetMouseButton(0) || Input.touchCount > 0){

//Luodaan uusi Vector3, johon tallennamme mihin kohtaan peliä pelaaja painoi

                Vector3 kohta;

//Jos pelaaja pelaakin kännykällä, saadaan tästä pelaajan kosketuksen kohta

                if(Input.touchCount>0){

                        kohta=Input.touches[0].position;

                }

//Jos pelaaja ei pelaakkaan kännykällä, pelaa hän tietokoneella, joten otetaankin hiiren kursorin kohta

else{

                        kohta=Input.mousePosition;

                }

                    //Jos pelaaja painaa ruudun alapuolelle, laitetaan pelihahmo liukumaan.

                    if (kohta.y < Screen.height / 2&&hypitty)

                    {

                                //Määritellään että Animator-komponenttiin luomamme bool-muuttujan arvo on True

                                anim.SetBool("liuku", true);

                                //Asetetaan pystyssä oleva collider pois päältä, ja kumossa oleva collider päälle, jolloin tulee vaikutelma että hitbox muuttuu hahmon mukana

                                colliderit[0].enabled = false;

                                colliderit[1].enabled = true;

                    }

                    //jos kohta on ruudun yläpuolella, laitetaan pelaaja hyppäämään

                    else if (kohta.y > Screen.height / 2&&hypitty)

                    {

                        //Nämä 3 riviä ovat samat kuin elsessä hieman myöhemmin. Syy miksi ne ovat myös tässä on siksi, koska muuten pelaaja voisi glitchata pelin ja hypätä, vaikka hän onkin vielä liukumassa. Nyt peli ei glitchaannu.

        anim.SetBool("liuku", false);

                                colliderit[0].enabled = true;

                                colliderit[1].enabled = false;

                        //Lisätään rigidbodyyn ylösmenevää voimaa hypyn saamiseksi

                        GetComponent<Rigidbody2D>().velocity = Vector3.up * 10;

                        //Asetetaan hyppy bool oikein että hyppy animaatio lähtee pyörimään, sekä hypitty bool vääräksi ettei ilmassa voi yhtäkkiä hypätä uudestaan. Asetetaan myös maassa bool väärin, että tiedämme milloin osumme maahan ja lähtee oikea animaatio pyörimään.

                        anim.SetBool("hyppy",true);

                        hypitty=false;

                        anim.SetBool("maassa",false);

                    }

}

else

{

                        //Määritellään että Animator-komponenttiin luomamme bool-muuttujan arvo on False

anim.SetBool("liuku", false);

                        colliderit[0].enabled = true;

                        colliderit[1].enabled = false;

}

//kun hahmo on hypännyt aivan ylös, ja painovoima vetääkin sitä alaspäin, laitetaan seuraava animaatio pyörimään.

if (GetComponent<Rigidbody2D>().velocity.y < 0)

{

        anim.SetBool("hyppy", false);

}

}

//Tämä tapahtuu joka frame, tähän kannattaa laittaa kaikki liikkuminen

void FixedUpdate()

{

//liikutetaan pelihahmoamme oikealle

transform.position += Vector3.right * nopeus;

//suurennetaan nopeus arvoa, että pelihahmo nopeutuu pelin edetessä koko ajan hieman

nopeus += 0.0001f;

}

void OnCollisionEnter2D(Collision2D col)

{

RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, 3, taso);

if (hit.transform != null)

{

anim.SetBool("maassa", true);

hypitty = true;

}

}

}

Taas on paljon uutta, joten käydään vaih vaiheelta läpi mitä tässä teemme.

Luomme aluksi public GameObject maat, jonka arvon asetamme Unityssä itsessään. Tämän jälkeen luomme float muuttujan leveys, joka saa Start-methodissa arvokseen objektin leveyden. Tämän jälkeen luomme uuden laisen muuttujan nimeltään List.

List

List toimii hieman samalla tavoin kuin Arraykin, eli se on siis lista tietyn tyyppisiä muuttujia, joita voimme käyttää haluamallamme tavalla. List eroaa Arraysta siten, että voimme helposti poistaa ja lisätä muuttujia kokonaan, ja Listin koko muuttuu koko ajan, kun taas Arrayn koko pysyy koko ajan yhtäsuurena, eikä sieltä voi juuri poistaa arvoja, voit vain muuttaa niitä.

Start-methodissa asetamme leveys-muuttujaan objektin leveyden jonka saamme objektista itsestään. Lisäämme listaamme maa-gameobjektin. Tämän jälkeen käytämme for-lauseketta hyödyksemme.

for

For on yleinen ohjelmoinnissa käytettävä toistolauseke, joka toimii hieman samalla tavalla kuin while. Forissa luomme sen sulkeiden sisällä jonkin muuttujan kuten int, ja annamme sille alkuarvon, sen jälkeen laitamme vertauksen, ja niin kauan kun tämä vertaus on totta, toistaa for-lauseke aaltosulkeittensa sisällä olevaa koodia. Vertauksen jälkeen voimme laittaa suureneeko vai pieneneekö luomamme muuttuja. Tämä on parempi kuin while, koska se jää harvemmin looppiin mihinkään, ja kaiken saa tehtyä helposti yhdellä rivillä.

forin aaltosulkeiden sisällä luomme lisää maa-objekteja jotka lisäämme listaan. Kun asetamme niille uutta paikkaa käytämme Random.Range()-methodia.

Random.Range()

Random.Range() toimii samalla tavalla kuin c# käyttämämme Random-muuttuja, eli laitamme sulkeiden sisään ensin pienemmän luvun, ja sen jälkeen suuremman luvun, joiden väliltä luku arvotaan satunnaisesti.

Saamme tämän avulla hieman haastetta peliin, kun platformit ovat korkeammalla tai matalammalla, sekä hieman erillään toisistaan.

Tämän jälkeen menemme Update-methodiin. Täällä tarkistamme onko maa pläntti vähintään yhden maapläntin leveyden verran kaukana pelihahmostamme, ja jos on, niin silloin se ei ole enää edes näkyvissä ja voimme poistaa sen.

Aluksi siis tuhoamme objektin Destroy() methodilla.

Tämän jälkeen poistamme sen listastamme käyttämällä RemoveAt().

Tämän jälkeen kopioimme uuden maapläntin itsellemme, ja lisäämme sen samantien listaan.

Sitten asetamme sille uuden kohdan samalla tavalla kuin aijemminkin.

Näin saamme luotua ns. loputtoman pelin, jossa maaplänttejä tulee koko ajan lisää, vaikka jatkaisimme pelin pelaamista ikuisuuden. Nyt on tosin se ongelma, että jos vahingossa tipumme, niin emme kuitenkaan kuole… Muistatteko miten tämä korjattiin edellisessä pelissä?

Vinkki: käytimme siihen tageja sekä OnCollisionEnter-methodia.

Noin! nyt olemme luoneet 2D Infinite Scroller pelin, jossa on animaatiot ja joka jatkuu loputtomiin. Se vaikuttaa kuitenkin hieman tylsältä… Mutta vo




Tämä materiaali on tuotettu Euroopan maaseudun kehittämisen maatalousrahaston tuella