Mäng 1: 2D side-scroller (Flappy Birdi koopia)

Valmiva mängu eelvaade

game 1 preview.mp4

Valmiv mäng assetiteta.

game 1 preview(with skins).mp4

Assetite ja parallaksiga (vaata puude ja torude liikumiskiiruste erinevust).

Vajaminevad funktsioonid, assetid jms

Vajalikud Unity API event funktsioonid ja funktsioonid

Debug.Log konsooliga testi info väljendamiseks.

OnTriggerEnter2D põrgete tuvastamiseks (alternatiivselt OnCollisionEnter2D, kui simuleerida põrkeid).

Raycast2D tuvastaja kiire tekitamiseks.

Assetid esimesele mängule 

Esimesele mängule tegin lihtsad spraidid: linnu animatsiooni kaadrid (erinevad ainult tiibade asetus poolest), taeva, tausta ja puud taustakihiks, millel saab parallaksi rakendada. Kes tahavad, võivad lehelt https://assetstore.unity.com/ alternatiive otsida. Esialgses juhendis (1. nädala seisuga) nende spraitide mängu toomine puudub, kuid kavatsen selle hiljem eraldi juurde lisada, et seda saaks teha näiteks peatüki 2. nädala 1. peatüki raames. Projekti faili saab spraite lisada arvutis projekti kausta asuvasse Assetite kausta vedades.

Juhend

1.0 Loo projektifail

Selleks ava Unity Hub ja vali New Project alt 2D Core

Unity Hub --> Projects --> New Project

Project Settings all pealkirjasta oma mäng ning Location all vali projekti eelistatav asukoht arvutis. Unity Hubi kaudu saab selle projekti selle täpset asukohta teadmata hiljem avada.

Nüüd on avanenud mängu SampleScene ehk näidisstseen, mis 2D Core malli järgi lihtsalt üks tühi stseen, milles ainult Main Camera objekt ehk kaamera, läbi nähakse kui mängitakse. Ülemises ribas on valitud Scene(-view) ehk stseeni vaade, läbi mille näeb arendaja mängu kõiki külgi. Selle kõrval on Game(-view) valik, millele lülitudes näeb läbi Main Camera objekti. Praegu avatud Sceneview'st ehk arendajale mõeldud stseenivaatest on võimalik näha kasti, mis näitab Main Camera vaateulatust selles hetkel tühjas 2D maailmas.

1.1 Esimesed seadistused

Mõned näpunäited ja teadmised: stseenivaates liikumine, hierarhia, Inspector

2.0 Tekita mängija

Hierarhias parem klikk ja loo tegelane ehk lind, mis esialgu lihtsalt ring: 2D Objects --> Sprites --> Circle. Ja pane sellele sobiv nimi (Player või Lind).

2.1 Täienda mängijat

Kliki äsja tehtud objektile ja leia inspektormenüü (Inspector). Seal muuda järgnevat:

2.2 Tutvu koordinaatidega: liiguta mängijat stseenivaates (Sceneview's)

Vajuta mängija peale ja liiguta see kaamera vaateväljas (kastike Sceneview's) keskele vasakule (nagu Flappy Birdis). Ka inspektormenüüs Transform komponendi all saab x- ja y-koordinaati muutes seda täpsemini nihutada.  

Transformis saab muuta ka mängija suurust (lineaarmõõtmeid) Scale lahtri alt xyz-väärtuseid muutes (z ei tohi olla 0). Transformis saab ka pööret ehk Rotationit muuta kraadides (-180; 180). Tavapärases 2D mängus oleks mõistlik pöörata ainult ümber z-telje. Ümber x- ja y-telje pööramine on võrdväärne vastava komponendi eraldi skaleerimisega Scale'i all. 

Hetkel valitud Move Tool, millega saab eseme asukohta nihutada ka piki x- või y-telge. Sceneview' vasakul servas asuvas rippmenüüs on järgmised tööriistad Rotate Tool, millega saab eset pöörata, Scale Tool, millega saab eseme suurust skaleerida, Rect Tool, millega saab eseme suurust skaleerida nii, et äär oleks paigas ning Transform Tool, millega saab kõiki neid transformatsioone läbi viia.

Värvi saab muuta Color peale vajutamisel ilmuvas värvirattas. 

2.2 lõpuks peaks olema mängija Inspector menüü selline. 

NB! Soovitatav oleks ka mängitava objekti x- ja y-scale 0.6 peale panna ja selle asukohta vasemale nihutada (kuvatõmmisel x = -6.5).

3.0 Loo esimene skript (mängija liikumine)

Lihtsaim viis C# skriptifaili (.cs) tekitamiseks on valida objekt, millele skript kirjutada (praegusel juhul mängija), vajutada inspektormenüüst Add Component --> kirjutada ja valida "New Script" (1) ja teha skript, mille nimeks panna näiteks Hüppamine (2). (Alternatiivselt saab ka Project aknas Assets kaustas parema klikiga Create --> New Script...)

Objekti Inspector menüüsse tekib uus tühi skript, mida saab avada Project aknast Assets kaustast: parem klikk --> Edit või inspektormenüüst 3 täppi --> Edit Script (3). Avaneb redaktor tühja skripti malliga (4).

(1)

(4) Skriptimall nähtuna Visual Studio Code'is.

(2)

(3)

3.1 Skripti kirjutamine: Rigidbody2D instantseerimine

Skripti kirjutamisel alusta Rigidbody2D objektile viitamisest. Kirjuta klassi nimetusele järgneva loogeliste sulgude sisse enne Start funktsiooni koodirida:

public tähistab seda, et see on selle klassi globaalselt ligipääsetav muutuja ning ka inspektoris instantseeritud. Rigidbody2D tähistab seda, et see muutuja on Rigidbody2D klassi järgne konstruktor. rb on lihtsalt selle . Salvesta Ctrl-S-ga fail.

Vali Unity Editoris mängija ning inspektoris vea Rigidbody2D komponent skripti komponendi Rigidbody2D rb lahtrisse.

(Alternatiivselt võib Rigidbody2D rb; deklareerida ilma public võtmesõnata ja Start() funktsioonis rb defineeride järgmiselt: rb = gameObject.GetComponent<Rigidbody2D>(); Seda ma peamise viisina ei õpeta, sest taolisi komponentide lahtritesse vedamisi tuleb teha Unity Editoris veel palju, seega tasuks pigem seda harjutada :) )

"Lahtrisse libistamise" õpetus :)

3.2 Skripti kirjutamine

Defineeri (seal, kus RigidBody2D rb) uus float-muutuja, mis hakkab määrama hüppe kiirust

Salvesta ja määra selle suurus inspektoris selle skripti lahtris nimega Hüppamine (võiks olla 1 ja 10 vahel). 

Kirjuta Update meetodisse (meetod, mis teostub iga kaader, vt eelmist peatükki) järgmine if-lause:

Praeguses stseenis on mängija kiirus kontrollitud Rigidbody2D komponendi simuleeritud gravitatsiooni poolt (vt selle komponendi parameetreid Inspectoris). Selle skripti järgi iga kord kui mängija vajutab "Space", siis selle kaadri jooksul, mil see vajutus registreeriti (vaata Input.GetKeyDown omadusi), Input.GetKeyDown väljastab "tõese" väärtuse selle kaadri jooksul ja "käivitab" if-lause nurksulgudes oleva koodi, mis suurendab objekti y-suunalist kiirus muutuja speed võrra. 

Sisendifunktsioonide üks alternatiividest on Input.GetKey, mis selles kontekstis ei töötaks, vaid pigem sobiks rallimängu gaasipedaali või mõne muu mängu jooksmise sisendi võtjaks, sest väljastab tõese väärtuse kõikide kaadrite jooksul, mil klahvile peale vajutatud on.

Stseeni mängimine

Mängu saab Unity Editoris mängida peale "play" nupu vajutamist programmi ülemises servas.

Kirjutatud skript koos kommenteeritud alternatiividega.

Mängija Inspectoris on kiiruseks seatud 8 (ühikut sekundis).

Play Focused valiku järgselt, iga kord kui vajutatakse "play", avaneb Game aken. Alternatiivne moodus oleks Play Unfocused, mille puhul mäng hakkab käima varasemalt avatud aknas. Stseenivaates sisendit ei loeta, vaid mängija lihtsalt kukub alla.

Antud (väga madala FPS-iga) näites, on kiiruseks 8.

4.0 Takistuse loomine

Unity Editoris Hierarchy aknas parem klikk --> Create Empty ja anna sellele sobiv nimi (Takistus) -- tekib "tühi" objekt, mis veab ainult Transform komponenti. Sea selle asukohakoordinaadiks esialgu 0;0;0.

Editoris Hierarchy aknas tee loodud objekti peale parem klikk --> 2D Object --> Sprites --> Square. Pane selle nimeks Toru ja veendu, et see oleks hierarhias Takistuse all. Sea selle asukohakoordinaadi z- ja x-komponendiks, mida Transform nüüd loeb vanema suhtes, 0.

Parema klikiga objektile vajutades saab saab luua ja lisada kohe objekti hierarhia harusse uue objekti.

Toru on hierarhias Takistuse all. Nüüd on pärib see samad transformatsioonid (liikumine, skaala), mis on selle tühjal vanemal. Lisaks on see nüüdsest skriptimises kättesaadav funktsiooniga Transform.GetChild ja selle komponendid funktsiooniga Component.GetComponentInChildren.

Toru Inspector aknas muuda Transform komponendi Scale y-suurust, sest sellest saab toru nagu Flappy Birdis (näites Transformi Scale y = 8). Lisa sellele kastile (nüüd risttahukale) põrkeid simuleeriv objekt BoxCollider2D: Toru Inspector --> Add Component --> otsi ja vali BoxCollider2D

Nihuta toru üles (suurenda Transform komponendi juurest asukohakoordinaadi (Position) y-komponent, näites on position.y = 5).

Sea Toru värv Sprite Rendereris roheliseks.

Duplikeeri Toru: Olles valinud (klikkides) hierarhias Toru vajuta klahve Ctrl + D või parem klikk --> Duplicate. Tekib duplikaat nimega Toru (1). Sümmeetrilisuse nimel olgu duplikaadi y-koordinaat algse Toru y-koordinaadi vastandarv (näites -5).

Ülemine ja alumine Toru on identsed (scale.y = 8; Box Collider 2D; Sprite Renderer), kuid ülemise toru y-koordinaat (Takistuse suhtes) on 5 ja alumise -5.

Näites on RGBA koodiks 25;149;23;255.

Sellest tuleb teha prefab ehk kloonitav objekt.

Prefabe saab eraldi monteerida nö "teises dimensioonis" kuhu saab siseneda prefabile projektiaknas topeltklikkides.

Nüüd on olemas takistus kahe toruga. Tee sellest prefab ehk objekti instants, mida saab kloonida. Selleks vea Takistus hierarhiast Project aknasse.

Mis asi on prefab? -- Prefab on objekti kloon, mida saab duplikeerida ning millele saab ligi pääseda koodis.

(Nüüd, mil tehtud prefab on takistus stseenis selle duplikaat, mille võib isegi ära kustutada)

4.1 Takistuse liikumisskript

Tee takistuse Project aknas prefabile Takistuse-nimelisele tühjale objektile (mille küljes on hierarhias torud) skript nimega TakistuseLiikumine, mis loeks Inspectorist kiiruse väärtust (peamiste loogeliste sulgude sees, enne Start funktsiooni) rida: 

public float speed;

Selle skripti Update funktsioonis olgu järgnev koodilõik:

Translate funktsioon Update funktsioonis muudab ühe kaadri jooksul iga kaadri vältel objekti asukohta funktsiooni parameetris oleva vektori võrra. Antud juhul liigutab see vasakule suunatud ühikvektori (Vector2.left on sama, mis new Vector2(-1,0) ehk vasakule suunatud ühikvektor) ja speed*Time.deltaTime-kordselt. Olgu muutuja speed suuruseks Inspectoris defineeritud 5. Time.deltaTime annab ühe kaadri kestuse aja (1/kaadrikestus, kaadrikestus on kaootiliselt muutuv) ning Update-i kestus on 1/kaadrisagedus ning see toimub pidevalt, seega liigutab see funktsioon objekti vasakule kiirusega 5 ühikut sekundis. 

Sama funktsionaalsuse saab saavutada pannes Update funktsiooni järgmise rea: 

transform.position = transform.position - new Vector2(speed, 0) * Time.deltaTime;

Selleks, et leida õige Takistuse kiirus, tuleb Game view's ja Inspectoris sellega katsetada. Näidismängus tehtud katsete kohaselt sobib takistuse kiiruseks 4 ühikut sekundis.

4.2 Takistuste kloonimine ja hävitamine (skript)

Siis, kui takistus on jõudnud kaamera vaateväljast vasemale välja (näidismängus x < -10), võiks takistus hävineda, et mängu jõudlust pikematel mängimistel takistuste suur arv ei pärsiks. Selleks kirjuta Takistuse liikumisskripti Update funktsiooni järgmine koodilõik:

Tekita tühi objekt parem klikk --> Create  Empty (nimega Alguspunkt) ning nihuta see kaamera vaateväljast paremale selle x-koordinaadile (ja z-koordinaadile) hakkavad tekkima takistuse kloonid. Näites on selle koordinaadid 14;0;0.

NB! tee kindlaks, kas selle z-koordinaat on -10-st suurem (kaamera z-koordinaat vaikimisi on -10), sest vastasel juhul ei näe takistust mängu kaameras.

"Haara kinni" Takistusest ning lehvita seda kaamera vaateväljas üles-alla, et määrata, mis on selle suurim ja vähim soovitud y-koordinaat, jäta see meelde. Näites on need vastavalt 3.75 ja -3.75.

Alguspunkt ehk Spawner jääb kaamera vaateväljast paremale. Selle x-koordinaadil hakkavad tekkima takistused. 

Kõige kõrgem sobiv takistuse vertikaalne asetus on selles näites 3.75.

Kõige madalam sobiv takistuse vertikaalne asetus on selles näites -3.75.

Nende kõrguste vahele hakkavad tekkima takistused.

Alguspunktile lisada uus skript, mille nimeks näiteks TakistusteTekitamine. Selles defineerida/deklareerida (peamiste loogeliste sulgude sees, enne Start funktsiooni) järgmised muutujad:

takistuseKloon on GameObject tüüpi klassi instants, mis hakkab viitama takistusele. 

Ujukomaarvud max ja min on maksimaalse ja minimaalse y-koordinaadi väärtused, mille vahel hakkavad kloonid tekkima. Näites on need vastavalt 3.75 ja -3.75.

time on loendur, ja interval on ajaline intervall, mille tagant hakkavad kloonid tekkima ning mille seame Inspectoris.

Loenduri time väärtus peab iga kaadri vältel suurenema kaadri aja võrra seega kirjutada Update meetodisse:

Uute funktsioonide dokumentatsioonid: Object.Instantiate, Random.Range.

Kui loenduri väärtus on üle määratud intervalli ( if(time > interval) ), peab tekkima takistuse prefab Alguspunkti (mille küljes skript TakistuseTekitamine on) asukoha x-koordinaadile (this.transform.position.x, ei pea kirjutama võtmesõna this), ja suvaliselt min ja max y-koordinaatide vahele (Random.Range(min, max)), omas loomulikus rotatsioonis (obstacleClone.transform.rotation). Ka peab selle kaadri jooksul, mil need tegevused toimuvad, loendurit lähtestama  (time = 0), sest vastasel korral peale fikseeritud intervalli, hakkavad kloonid iga kaader tekkima. Näide sellest skriptist:

Peale selle skripti salvestamist, tuleb viidata prefabile Inspector menüüs vastavas lahtris. Takistuse tekitamiste vaheline intervall võiks olla 3 sekundit.

See kohutava kvaliteediga gif peaks näitama, et see prefabile viitamine Alguspunkti küljes olevas skriptis nimega TakistuseLoomine, käib samamoodi, mis ka eelnevalt näidatud "libistamised".

Algusounkti parameetrid nähtuna Inspector-menüüs.

4.3 Lisa lagi ja põrand

Lisa kaamera vaateväljast täpselt väljapoole lagi ja põrand, millel BoxCollider2D komponent. Näiteks võivad olla need kaks kasti (hierarhias parem klikk --> 2D Object --> Sprite --> Box. Lisa neile Inspectoris BoxCollider2D) 

Näidismängus on lae ja põranda x-koordinaat -6 ja y-koordinaadid Lael ja Põrandal vastavalt 5.5 ja -5.5 ehk need jäävad kaamera vaateväljast täpselt välja.

Põhjus, miks liikuvad Takistused ja lagi-põrand ei põrku omavahel on see, et neil puudub komponent Rigidbody2D.

5.0 Skoori tuvastav kast ja tag ehk tüüpnimi

Project aknas Takistusele peale vajutades (kaks klikki) avad prefab editori, kus saad monteerida Takistust. Lisa selle külge tühi objekt (Create Empty), mille nimeks pane Skoorikast. Sea selle koordinaatideks (Takistuse suhtes) 0;0;0. Sellele tühjale objektile lisa Inspector menüüs BoxCollider2D ning sea selle x- ja y-koordinaadid vastavalt joonisele nii, et see täidaks torudevahelise ala. Lisa linnuke "Is Trigger" valikule -- kui Collider.isTrigger = true, saab põrkeobjektist ehk colliderist sellega kokku põrkamata läbi minna.

BoxCollider2D näidismängus sobivad suurusteks (Size) x = 1 ja y = 2. 

Kõigil objektidel (ka neil, mis hierarhias all pool) on Inspector menüüs üks valikutest Tag ehk tüüpnimi, mis vaikimisi kõigil "Untagged". Tage saab selle valiku rippmenüüs juurde teha ja objektile määrata. Tagid on vajalikud, sest aitavad hõlpsamini viidata objektidele skriptides. 

Tee juurde kaks uut tagi nimetustega: "Toru" ja "Skoor". Lisa Skoorikasti tagiks "Skoor" ning Torude tagiks "Toru".

Lisa ka Põranda ja Lae tagideks "Toru".

Kõigil skoorikastidel hakkab olema tag "Skoor" ja kõigil torudel tag "Toru". 

NB! Kõigile prefabidele ehk kloonidele rakenduvaid muudatusi teha nende "omas dimensioonis" kuhu pääseb Project aknas neile topelt-klikkides.

5.1 "Game Over & Score" skript

Lisa mängijale uus skript ja anna sellele nimi MängLäbiJaSkoor

See skript hakkab tegelema skoori loendamise ja mängu lõpetamisega linnu kokkupuuutel takistuse, põranda või laega. See skript hakkab kasutama ka kasutajaliidest ehk UI-d skoori info edastamisel. Esialgu deklareeri selles skriptis järgnevad väärtused, mida läheb hiljem vaja:

Selles skriptis tuleb Start ja Update funktsioonide kõrvale peamiste loogeliste sulgude sisse lisada uued event functionid nimega OnTriggerEnter2D ja OnCollisionEnter2D:

OnTriggerEnter2D event functioni sees olev kood teostub siis, kui objekt, mille küljes selle koodilõiguga skript, kattub oma collideriga mõne teise isTrigger ehk põrgetele immuunse collideriga (nagu Skoorikast).


Lihtsuse huvides kasutame ainult OnTriggerEnter2D-d, kuna alternatiivi jaoks on vaja põrkeid simuleerida, mida sellises mängus pole vaja teha. 

Selleks et Torud Põrand ja Lagi kõlblikud selle meetodi jaoks, lisa nende Inspectoris BoxCollider2D komponendi "Is Trigger" lahtris linnuke (nagu Skoorikast):

Torude collideris olgu "Is Trigger" lahtris valitud linnuke ehk Collider.isTrigger = true ehk enam ei simuleeru sellel põrked. NB! tee seda prefabi maailmas, et see muudatus mõjuks kõigile kloonidele.

Kokkupõrked Torude ja Lae või Põranda vahel ei toimunud juba enne, sest Torude kiirus oli määratud Transform.Translate abil, mis ei tööta kooskõlas Rigidbody2D füüsikaga.

Lael ja Põrandal samamoodi Collider.isTrigger olgu tõene.

MängLäbiJaSkoor skriptis tahame tuvastada, kas lind lendas vastu toru (game over tingimus), või lendas torust läbi (skoori tõstmise tingimus). Vastu toru lendamise tulemusel võiks aeg, nagu Flappy Birdiski, järgmise sisendi saamiseni seisma jääda (Time.timeScale).


Selleks tuleb teha selle skripti OnTriggerEnter2D event functionis järgmised if-laused:

Kui mäng on läbi (mängLäbi == true) ja vajutatakse mingile klahvile (näites on valitud "R"), mäng restardib ehk see stseen (vaikimisi SampleScene) laaditakse uuesti ja mäng algab algusest:

Täpsustus süntaksi kohta: kui boolean väärtus peab olema mingis if-lauses tõene siis piisab selle muutuja nime kirjutamisest väärtus == true asemel. Kui peab olema väär, piisab !väärtus kirjutamisest väärtus == false asemel.

Selleks, et funktsioon Scenemanager.LoadScene töötaks, tuleb skripti algusesse lisada viide nimeruumile UnityEngine.SceneManagement ehk skripti alguses peavad olema sellised teekide viited:

SceneManager.LoadScene(int index) laeb stseeni indeksiga index. Antud juhul on see ainus stseen mängus, seega indeks, nagu järjendite esimene element enamustes programmeerimiskeeltes, on 0.

Nüüd on olemas esmane funktsioneeriv mäng, millel veel puudu ilustused ja informatiivne kasutajaliides.

6.0 Kasutajaliides: lõuendi loomine

Canvas = kasutajaliidese alus, lõuend.

Hierarhias tuleb luua lõuend: parem klikk --> UI --> Canvas (selle objekti nimeks näites Lõuend).  Editori Scene View's tundub Canvas hiiglaslik, aga tegelikkuses skaleerub vastavalt kaamera suurusele ehk pikslite arvule nii, et üks piksel on üks mängumaailma pikkusühik. Selleks, et Canvase mõõtmed vastaksid HD ekraani suurusele, oleks Canvase Inspectoris mõistlik teha järgmist: Canvas Scaler --> UI Scale Mode = "Scale With Screen Size" ning Reference Resolution olgu HD ehk 1920x1080, või mõni muu käesoleva ekraani suurus, nagu 4K, 1440p, SD vms. 

Peale Canvase tekib ka objekt nimega EventSystem, mida meil ei lähe selles mängus vaja.

Selles näites on resolutsioon 1920x1080.

6.1 Kasutajaliides: tekstid

Canvasele tuleb lisada kaks tekstielementi, mis näitaksid skoori ja "game over" teksti/restardi juhist. Selleks vajuta hierarhias lõuendile ehk Canvasele parema klikkiga ning UI --> Text ning tee seda kaks korda või duplikeeri esimest tekstielementi Ctrl-D-ga. 

NB! kõige uuematest versioonidest on UI.Text package eemaldatud ning asemele on jäänud TextMeshPro, seega saab luua tekstielemente järgmiselt: UI --> Text - TextMeshPro.

MängLäbiJaSkoor skriptis lisa nimeruumide loetellu UnityEngine.UI. Kui on Unity versioon üks uuemaid, kus UI.Text puudub, lisa viide TextMeshPronimeruumile nimega TMPro.TextMeshProUGUI.

MängLäbiJaSkoor skriptis tuleb lisada defineeritud muutujate juurde järgnevad tekstikomponentide instantsid:

public Text mänguLõpuTekst, skooritekst;

Start meetodis olgu nende tekstielementide sisu defineeritud kui tühi tekst (""):

mänguLõpuTekst.text = "";

skooritekst.text = "";

Update meetodis olgu scoreText.text sõltuv suurusest skoor. Selle küljes peab rakendama funktsiooni .ToString(), et ujukomaarv konverteerida stringiks ehk sõneks, sest Text.text on sõne:

skooritekst.text = skoor.ToString();

Suurus skoor suureneb ühe võrra siis, kui lind lendab läbi collideri, mille tag on "Skoor" ja rakendusel OnTriggerEnter2D funktsioonis. Kui OnTriggerEnter2D funktsioon tuvastab kokkupõrke takistusega ehk objektiga, mille tag  on "Takistus", siis saab mäng läbi, mis tähendab järgmist: 1) aeg jääb seisma 2) mängijale edastatakse info seoses mängu lõppemisega:

Nüüd tuleb tuleb viidata varem lõuendile loodud UI tekstikomponentidele selles samas skriptis, mis asub mängija küljes. 

Unity Editoris Canvasele (Lõuendile) lisatud tekstikomponentide suurusi ja fonte Inspectoris ja Scene view's sättida.

Lõuendile (Canvasele) sai lisatud kaks TextMeshPro tekstikomponenti.

Objektide nimed stseenis ja neile viidatud nimetused koodis ei pea ühtima.

Viimase osa kogu kood:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.SceneManagement;

using Text = TMPro.TextMeshProUGUI;

public class MängLäbiJaSkoor : MonoBehaviour

{

    public Text mänguLõpuTekst, skooritekst;

    bool mängLäbi = false;

    int skoor = 0;

    // Start is called before the first frame update

    void Start()

    {

        mänguLõpuTekst.text = "";

        skooritekst.text = "";

    }


    // Update is called once per frame

    void Update()

    {

        skooritekst.text = skoor.ToString();

       

        if(mängLäbi == true && Input.GetKeyDown(KeyCode.R)){

            Time.timeScale = 0;

            SceneManager.LoadScene(0);

            mängLäbi = false;

            skoor = 0; // resetib skoori

            Time.timeScale = 1; // resetib aja kiiruse

        }

    }

    void OnTriggerEnter2D(Collider2D collider) {

        if(collider.tag == "Toru"){

            Time.timeScale = 0;

            mängLäbi = true;

            mänguLõpuTekst.text = "Mäng Läbi! \n Vajuta R, et restartida!";

        }

        if(collider.gameObject.tag == "Skoor"){

            skoor += 1;

        }

    }

}

7.0 Assetite mängu toomine ja nende seadistused

Assetite mängu toomiseks on vaja need, eelistatavalt ühes kaustas, tõsta projekti kausta nimega Assets (.../[Mängu nimi]/Assets).

Näidisprojektis on peatüki alguses antud pildifailid lisatud eraldi kausta (nim. "kunst").

Kausta "kunst" sisu File Exploreris.

Pildifailid nähtuna Unity Editoris.

Kausta "kunst" sisu Unity Editoris.

Kõigile äsja lisatud pildifailidele vajutanult (Shift + vasak klikk/ Ctrl + vasakud klikid) tee Inspector menüüs järgmised muudatused: Compression --> None (1) ja Filter mode --> Point (no filter) (2).  Pane tähele, et spraitidel on olemas ka valik Pixels Per Unit ehk pildi pikslit mängumaailma ühiku kohta, mida võib hiljem muuta vaja.

1.

2.

Lisa stseeni (hierarhiasse) taustapilt "Sky" ning jälgi, et see oleks tsentris ning selle z-koordinaat oleks suurem kui torudel ja linnul, sest samal z-koordinaadil olles need kattuvad kaootiliselt (alternatiivselt z-koordinaadi muutmisel saab seada Inspectoris Sprite Rendereri all Order in Layer 1-ks või rohkemaks, mis määrab, mida enne renderdatakse). Tee see suuremaks (suurenda x- ja y-scale'i) nii, et see kataks vähemalt kogu kaamera kasti.

Selles näites on taeva pilt hierarhiasse eraldi objektiks tõstetud, x-ja y-scale 30 ja z-position > 1.

7.1 Spraitide lisamine objektidele: lind

Mängijale linnu spraidi lisamiseks vali hierarhias see objekt ning selle Inspector'is Sprite Rendereri Sprite valiku all (rõngale vajutades) saab otsida Assets kaustast sobivaid spraite. Otsi ja vali äsja lisatud pildifail nimega "Bird_1". Selleks, et selle värvid meenutaksid algse faili värve, muuda Sprite Rendereri värvi ehk Color valikus värviks valge (rgb: 255; 255; 255), vastasel juhul näeks see kollasem välja, sest varasemalt sai valge ringikujuline sprait kollaseks muudetud.

CircleCollider2D raadiust ja Scale'i saab kohandada, et collideri rõngas ja linnu kujutis paremini ühtiksid.

CircleCollider2D radius= 0.35 ja Transform scale.xy = 0.8.

7.2 Linnu animatsioonikaadrid

Kõige lihtsam viis animatsiooni tööle saamiseks oleks linnu objektile korraga lisada kõik ("Bird_1" kuni "Bird_4") animatsioonikaadrid. Selleks vali korraga kõik linnu animatsioonikaadrid (Ctrl klahvi hoides järjest klikkides) ja lisa need linnule ehk Player objektile hierarhias. Unity tekitab uue animatsioonifaili, mille salvestamise järgselt kinnitub objektile vaikimisi animatsioon, mis hakkab kohe järgmisel mängimisel tööle (lind hakkab tiibu lehvitama). 

7.3 Torud

Enne toru piltide rakendamist takistuse prefabidele, tuleb toru pilti Sprite Editoris (kuhu saab Project window'is toru pilti käsitleva Inspector'i kaudu) natuke monteerida. Vali Project aknas toru pilt ning selle Inspector menüüs Sprite Editoris vali ülevalt esimesest rippmenüüst Custom Physics Shape. Vajuta Generate ning tekkinud kasti nurgad vea toru äärtesse (vt järgnevat joonist) ning vajuta Apply. Seda on vaja fikseeritud kujuga collideri (PolygonCollider2D) rakendamisel. 

Nüüd mine Takistuse prefabi juurde ning muuda Torude Inspector-menüüs Sprite Rendereris nende värv valgeks ning vali spraidiks äsja muudetud toru pilt failinimega Pipe. Eemalda torude küljest BoxCollider2D ning lisa asemele PolygonCollider2D. Vaata Inspector-menüüs, et viimase komponendi seadetes oleks "Is Trigger" linnukesega.

7.3 Parallaks

Parallaksi jaoks lisa stseeni sobiva mõõtmetega puude spraiti ("trees") ning lisa need kõrvuti nii, et need katavad horisontaalselt kaamera vaatevälja (3 tükki peaks olema sobiv). Koonda need pildid ühe tühja objekti alla, mille algkoordinaadid sea enne 0;0;0-ks ning mille nimeks pane Mets.

Metsa z-koordinaat olgu tegelikult takistuste ja tausta vahel (ehk näiteks 0.5).

Metsa kaks korda duplikeerides ja Move Tooli kasutades nihuta Metsad üksteisega täpselt kõrvuti nii, et vahesid ei oleks näha.

Olgu Project aknas spraidi "Trees" Pixels Per Unit 100 asemel 10. 

Objekt Mets on "vanem" kolmele puud ("Trees") spraidiobjektile.

Kõigil spraitidel on (hierarhias koordinaadid Metsa suhtes) ühine y-koordinaat, aga koordinaadid erinevad x-koordinaadi poolest; näidismängus on need -6.28, 0 ja 6.28.

Nagu näha, katavad kolm "Trees" spraiti, mille Pixels Per Unit on 10, kaamera vaatevälja horisontaalselt terves ulatuses.

Näidismängus on originaalse Metsa x-koordinaat 0 ja duplikaatide omad 18.88 ja -18.88.

Tee veel kaks tühja objekti algus ja lõpp ja sea neile vastavalt parema ja vasema Metsa duplikaadi koordinaadid -- nende vahel hakkab toimuma parallaks.

Objektist algus hakkab uuel ringil liikuma mets.

Objektist lõpp lõppeb ring ning sellest vasemal olev Mets teleporteerub objekti algus koordinaadile.

NB! alguse ja lõpu z-koordinaadid võiksid ka olla Metsaga ühised ehk 0.5, sest vastasel juhul hakkavad need torudega samal z-koordinaadil olles vilkuma. 

Tee uus skript Parallaks, mille lisa paremale ja keskmisele Metsa objektile.

Parallaks hakkab liigutama neid parallaksi efekti nimel torude kiirusest väiksemal kiirusel, kuniks nende x-koordinaat on väiksem kui objekti lõpp x-koordinaat. Siis teleporteerib see skript need alguse koordinaatidele.

Parallaksi kogu kood:

8.0 Lõplik mäng ehk build

 Lõpliku mängu aplikatsiooni saamiseks: Unity Editor --> File --> Build Settings --> Build.