Vejledning 02. Unity brugermanual

Vi forudsætter, at du har installeret Unity og den er klar til brugt. Hvis ikke, så kan du få noget hjælp her: https://www.bliv-klogere.dk/vejledning-02-installer-visual-studio-code-mangler/. Suppler med videoen her https://www.youtube.com/watch?v=XtQMytORBmM.

Trin 1. Introduktion til Unity

Inden du går i gang

Gennemgangen er ud fra videoen her, som bruger Flappy Bird som eksempel https://www.youtube.com/watch?v=XtQMytORBmM.

Hvis du ikke har installeret Unity endnu, så se starten på videoen ovenfor.

Nederst i vejledningen findes der en sektion: Tips og tricks til Unity.

1.1 Unitys skærmbillede

Unity er delt op i 4 områder: Hieracy, scene, inspector og projekt

OMRÅDEFORKLARING
ProjectAlt, hvad vi har i hele projektet. Sprites, figure, lyd, alt
HierakiAlt, hvad der er på scenen
SceneSvarer til niveau/level i spil
InspektorViser egenskaber på de game objects, som vi laver

1.2 Sprites og game objects

  • Sprite = 2D objekt i spil, som kan flyttes på scenen
  • Game object = et tomt objekt, som vi kan fylde en figur eller andet i. Har position, rotation og skalerbarhed. Du kan se det hele i inspektoren. Alt i spil i Unity er game objekts med komponenter
    • HUSK AT give dine game objects navne, så du let finder dem mellem mange objekter

1.3 Lav et game object

  • Du laver et nyt, tomt game object ved at højreklikke i området Hieracy (1) og vælge Create Empty (2)
  • Gå over i Inspector-panelet. Giv din game component et navn (1). Vælg Add Component (2) og fra fald-ned menuen vælg Rendering (3).
  • Under Rendering vælg Sprite Render (1)

Træk til sidst fuglen (1) over i feltet Sprite (2) ovre i inspector, og vupti: Vi har et game object på scenen (3): Bemærk at der står “None” feltet Sprite indtil du trækker spriten over.

1.4 Værktøjer på scenen

Når du har fået spriten på scenen (1), får du i et lokalmenu på scenen (2)nogle ret så nyttige værktøjer, som du kan bruge til spriten. Fra øverst til nederst (2) er værktøjerne:

  • View tool (ikke flytte tool)
  • Move tool. Bruges til at flytte rundt på det valgte element
  • Rotate tool. Bruges til at rotere det valgte element
  • Scale tool. Bruges til at skalere det valgte element
  • Transform tool: bruges til at transformere, dvs. “vride” det valgte element

1.5 Scenen har 2 “modes”: Scene og Game

  • Scene (1) viser, hvad vi har på scenen
  • Game (2) viser, hvordan spillet kommer til at se ud

1.6 Zoom ind og ud og baggrundsfarve med Main Camera

Main camera er et game object i sig selv. Du skal befinde dig på Scenen under Game (1). Klik på Main Camera under Hierarchy (2). Under Inspector > Size (3) kan du zoome ind og ud, og du kan endda skifte baggrundsfarve (4).

1.7 Gem og test dit foreløbige arbejde af

På scenen skal du være på fanen Game (1). Så klikker du bare på knappen Play øverst (2). BEMÆRK: Når du klikker på Play øverst, så gemmer du samtidig dit arbejde.

Trin 2. Fysiske objekter og kodning

2.1 Gør objektet fysisk: Tilføj tyngdekraft

Sørg for, at du under Hierarchy har markeret det rigtige objekt (1). Under Inspector vælg Add Component (2). I fald-ned menuen vælg Pyhsics 2D (3) …

… i fald-ned menuen skrol nedad og vælg Rigidbody 2D (1).

Har du gjort det rigtigt, kan du se at fuglen “falder til jorden”.

2.2 Tilføj kollision

Tilføj også “kollision”, som du finder næsten samme sted som Rigidbody 2D eller “tyngdekraften” ovenfor. Følg vejledningen under det forrige afsnit 2.1 forfra, og i stedet for Rididbody 2D vælg Circle Collider (1).

Du kan teste, om du har gjort det rigtigt, ved på Scenen at gå over på fanen Scene (1). Når du markerer objektet (2), er der nu en grøn cirkel rundt om objektet.

Du kan justere på cirklen (1) ved at gå over under Inspector. Jeg har flyttet centret lidt og gjort cirklen mindre (2). Så bliver det lidt nemmere for spilleren 🙂

2.3 Opret et script

INDEN DU GÅR I GANG: Hvis du vil have den dybe forklaring på scripts’ne, så se videoen fra cirka minuttal 8:33.

Med scripts eller kode kan du styre 100% hvad der sker i spillet. Du tilknytter et script/kode ved under Inspector at vælge Add Component > (skrol helt ned i bunden) New Script (1). Se afsnit 2.1 for Add Component.

Giv scriptet et navn, f.eks. BirdScript (1). Klik på Create and Add for at oprette scriptet (2).

Når det er oprettet, kan du se scriptet nederst på spriten under Inspector (1).

Du kan åbne og redigere scriptet i Visual Studio ved at dobbeltklikke på scriptet i inspectoren. Det ser sådan ud: Bemærk at der er 2 metoder/funktioner. Den første void Start (1) afvikles, når programmet/appen/spillet startes, dvs. den afvikles 1 og kun 1 gang. Den anden void Update(2) afvikles ved hver frame. Et spil består typisk af 12 – 15 frames pr sekund, så den afvikles hele tiden præcis som et loop.

2.4 Script til at ændre bevægelse (reference til Ridgidbody 2D, velocity)

Scripts kan kun tilgå den øverste del af Inspector samt Transform, og vi vil have fat i Velocity under Rigidbody 2D. Så vi skal lave en forbindelse til Rigidbody 2D også kaldet en refrence. Hvis vi gør den public, så kan vi tilgå den overalt. Skriv koden ind som vist nedenfor (1) …

… så dukker referencen op under Inspector (1).

Træk Rigidbody 2D (1) ned til feltet My Rigidbody (2), så har du lavet en forbindelse. “En forbindelse” vil sige, at vi nu kan styre egenskaberne under Rigidbody 2D fra vores script. Se næste afsnit.

2.5 Script til Rigidbody 2D (fortsat fra 2.4)

Scriptet her gør så, at man ved at presse på mellemrumstasten (space) kan få vores gameObject (= fuglen) til at bevæge sig opad. Se videoen minuttal cirka 11:40 for en super forklaring på hvorfor https://www.youtube.com/watch?v=XtQMytORBmM.

2.6 Find egenskaberne under Inspector f.eks. scripts

Hvis du mangler noget under Inspector, så kan du finde det fra menulinjen under Component (1). Her med Scripts som eksempel.

2.7 Tilknyt en variabel

Du kan styre egenskaberne (f.eks. hastigheden) bedre ved at tilknytte en variabel. Her en variabel i form af en float. I C# er en “float” et tal, som godt kan være et decimaltal modsat integers, som kun kan være heltal. Jeg opretter en float i mit C#-script (1). Så ganger jeg den på den hastighed, som jeg definerer til at brugeren kan få fuglen til at hoppe opad (2).

Det smarte er, at egenskaben nu popper op under Inspector > Birdscript. Så kan du skaler hastigheden uden at skulle ned i koden. PS: Du forstår sikkert godt nu, hvorfor man nogle gange kalder en variabel for en “skalar” i stedet for.

Trin 3. Få nye objekter til at dukke op og forsvinde

3.1 Bygge sprites i lag

Vi kan bygge sprites i lag, næsten lige som vi bygger billeder i lag i Photoshop.

Vi bygger søjlerne, som flappy bird skal flyve forbi, på samme måde. Først laver vi under Hieracy et nyt tomt game objekt, “Pipe”, og under “Pipe” nok et nyt tomt game objekt, som vi kalder Top pipe (1). Det overordnede objekt, “Pipe” efterlades tomt. Bemærk at “Pipe” er forælder/parent, mens Top pipe er barn/child.

Som normalt når vi opretter sprites, så vælg under Inspector knappen Add Component > Rendering > Sprite render. Er du i tvivl, så se punkt 1.3 Lav et game object.

I Top pipe trækkes en søjle ind fra Assets (2) til Sprite render (3). Sæt objektes Y-position til f.eks. 14, da søjlen ikke skal starte i midten (5).

Vi skal videre. Højreklik på Top pipe (1) og vælg Dublicate (2).

Omdøb det dublikerede objekt til Bottom pipe. Da den nederste søjle heller ikke skal røre midten, sættes Y-positionen til f.eks. -20 (1). Samtidig skal søjen spejlvendes. Det gøres ved under Scale at sætte Y til -1 (2). Nu har vi et samlet objekt, som vi kan genbruge.

Bemærk at det ikke er nødvendigt at gøre objektet fysisk dvs tilføje “tyngdekraft”. Under punkt 2.1 Gør objetet fysisk: Tilføj tyngdekraft tilføjede vi “tyngdekraft” til fuglen.

3.2 Få et objekt til at bevæge sig hen over skærmen

Når man spiller Flappy Bird, så ser det ud som om, at fuglen flyver gennem søjlerne. Det gør den ikke, det er baggrunden dvs. søjlerne, der bevæger sig. For at få søjlerne til at bevæge sig skal vi lave et script.

Opret et script på objektet Pipe. Hvis du har glemt hvordan, så se punkt 2.3 opret et script. Husk at scriptet skal oprettes på objektet Pipe, så du kan ikke åbne dit tidligere script og bruge det i stedet. Kald gerne scriptet PipeScript eller noget i den stil

Sæt de 2 scripts ind i det nye script. Dels lav en variabel (float) (1), dels få Pipe til at bevæge sig over skærmen (2). Koden til den nederste er ser du herunder, men skriv den selv, så du får rutinen i Unity.Bemærk at vi bruger Vector3, selvom vi kun arbejder med 2D.

transform.position = transform.position + (Vector3.left * moveSpeed) * Time.deltaTime;

3.3 Lav kloner af søjlerne og få dem til at dukke op kontinuerligt

Lad os starte med at klone søjlerne. I Unity kaldes det at lave et “præfabrikeret objekt”. Træk parent objekt, dvs. Pipes (1) ned under Assets. Det danner et nyt asset (2).

Lav et nyt objekt under Hieracy og kald det Pipe spawner (1). Placér det th. uden for spillet, dvs. lige udenfor den hvide firkant på scenen (2). Opret et nyt script til objektet Pipe spawner under Inspector, her kaldet Pipe Spawn Script (3).

Åben scriptet i Visual Studio og indsæt en reference til game objektet Pipe (1). VIGTIGT: Husk at gemme dine ændringer i koden i C#, ellers vil det næste punkt ikke lykkedes

Træk bagefter objektet Pipe fra Assets (1) hen under Pipe i Inspector under Script (2). Hvis du IKKE har punktet Pipe, så er det fordi, at du har glemt at gemme ændringerne i dit script til Pipe spawner. Dvs. det script, som jeg lige ovenover teksten her har kaldt PipeSpawnScript.

Indtast koden her under funktionen/metoden void update() for at få objektet til at dukke op/spawne (1):

Inden du tester, så skal du lige fjerne det oprindelige Pipe objekt (1). Bemærk dog, at vores nye pipes arver det oprindelige objekts egenskaber inklusive scriptet. Dvs. at det kan bevæge sig.

Test af. Pipes kommer, men desværre vises de nu på alle frames. Det skal vi lave om på. Vi skal ind i koden og lave en timer, så vi kan styre intervallet mellem pipes. Gå ind i PipeSpawnScript og sæt koden (1) og (2) ind.

Gem scriptet og test af. Når du tester, så kommer pipes/søjlerne med regelmæssige mellemrum. Men vi skal vente længe på de første pipes. Løsning: Lav en ny funktion med noget af koden fra før (1) og brug den under både void Update() (2) og void Start() (3).

Gem, test af, og pipes kommer forhåbentlig hurtigere. Men alle søjler kommer det samme sted. Det skal vi ændre. Dvs. x-positionene af søjlerne/pipes fejler ingenting, men y-positionen skal variere. Tilbage til PipeSpawnScript:

Lav en float, “highOffset” øverst og sæt den til 10.

Ret funktionen/metoden spawnPipe (1) og test til sidst efter.

3.4 Slet kloner af søjlerne, som vi ikke har brug for

Efterhånden som spilleren kommer længere og længere ind i spillet, vil vi få en masse overflødige “gamle” søjler, der bare bevæger sig længere og længere mod venstre ud af spillet.

Gå ind i PipeScript. Dvs. det script, som du lavede til pipes INDEN at vi gik i gang med at klone. Scriptet til klonen hedder PipeSpawnScript eller noget i den stil. Så vær lige sikker på, at du skriver i det rigtige script. Tjek evt. videoen https://www.youtube.com/watch?v=XtQMytORBmM MINUTTAL minuttal 27:00. I scriptet tilføj en variabel/float.

Længere nede i samme script sæt en if-sætning, der “dræber” de overflødige pipes ud fra variablen deadzone (1).

Test efter, at klonerne slettes.

3.5 Debugging vha. konsol

ALLE, der har prøvet bare at kode det mindste, ved at kode kan drille. Fejfinding kaldes “debugging”. Faktisk er historien bag, at et kæmpestort og meget gammeldags computersystem ikke virkede, fordi et insekt (bug) havde sat sig fast inde i computeren.

Men: Det er derfor nyttigt at kunne indsætte små beskeder undervejs for at tjekke, om koden virker, og så se det i konsollen. Det skal vi prøve her. Indsæt sætningen Debug.Log(“Pipe dead”) (1) i PipeScript. Dvs. samme script som under punkt 3.4.

Når du så tester spillet af i Unity, klik på Console (1). Under Console vil koden skrive sætningen (2). Det fortæller dig, at koden når til at afvikle sætningen. Ellers ville sætningen ikke poppe op. Du kan få god brug for console (“konsollen” på dansk), når din kode driller.

Trin 4. Score og bruger interface (UI)

4.1 Lav et UI (scoreboard)

UI er, som alt andet, et game object. Start med at lave et nyt game object i Hieracy (1). Vælg UI > Legacy > Text (2).

Så har du din UI inde på scenen, klar til brug (1). Bemærk at der står “New Text” inde i den.

Under Inspector > Canvas Render (1) kan du indstille tekst, tekstfarve, tekststørrelse mv.

For at sikre, at UI ser éns ud på alle skærme, så gå ind under Canvas (1). Bemærk: Vi er ikke mere i game objectet Text (Legacy), som vi var under før, men under Canvas. Under Canvas Scalar sæt UI Scale Mode til Scale with Screen Size og nedenunder sæt Reference Resolution til f.eks. 1920 x 800 (2).

Det kan drille med at få vist teksten på scenen. Driller det, så gå ind på Text (Legacy) i Hieracy så du ser den øverst i Inspector (2). Juster på positionen under (2), især Pos X og Pos Y. Det kan være et trick at sætte Pos Z til 1, så sikrer du dig, at den er i et lag foran de andre.

Tjek, at det ser fornuftigt ud, når spillet kører. Dvs. at den viser teksten “0”.

4.2 Opdatering af scoreboard

Start med at lave et nyt game object, der skal hedde Logic Manager (1). Tilknyt et script med Add Component og kald scriptet LogicScript (2).

I scriptet slet metoderne void Start() og void Update (). Lav en integer og kald den playerScore (1). Som udgangspunkt har vi ikke adgang til UI’s funktionalitet. Men det kan vi få. Øverst tilføj using UnityEngine.UI; (2). Nu kan vi næsten lave en reference til teksten (3) …

Ovre i Unity er vi på game objektet Logic Manager (1). Vi vil skabe forbindelse fra scriptet i Logic Manager til game objektet Text (Legacy) (2). Træk Text (Legacy) fra Hieracy over til Inspector under Logic Script, så den vises under Score Text (3). Så er der skabt en forbindelse. Ganske nyttigt!

Lav en funktion/metode til spillerens score, kald den addScore(). Den er public, fordi den skal bruges uden for scriptet. Funktionen plusser 1 til den score, der er i forvejen og opdaterer skæremen (1).

Men vi skal også teste det, og det kan gøres på en ret så snedig måde. Skriv [ContextMenu(“Increase Score”)] under variablene (2) og gem ændringerne i scriptet …

… når du så tester af i Unity, så gå ind under Logic Script (1), vælg de 3 prikker th. (2) og vælg Increase Score (3). Increase score popper op, fordi du har skrevet det i scriptet. Når du så klikker på Increase Score …

… så skulle score gerne tælle op (1).

4.3 Collitions og triggers: Når objekter rammer hinanden

Inden du går i gang: I Unity hedder det collitions og triggers. Men de kunne også godt have kaldt “events”.

Åben Pipes (dvs. vores prefab) (1) ved at trække den ind på scenen (2). Under Hieracy er Pipes nu åben. Lav et nyt objekt som et under-objekt til Pipes på linje med Upper og Lower pipe (3).

Under Middle (1) gå i Inspector og vælg Add Component (2). Vælg Pysics 2D (3) og vælg til sidst Box Collider 2D (4).

Under Box Collider 2D sæt en størrelse på boksen (1). Du ser boksen afblidet grafisk på scenen, hvor den fylder tomrummet mellem de 2 søjler (2). VIGTIGT: Husk at vinge “Is trigger” af under Box Collider 2D (3).

Til sidst opret et script til game objeketet Middle (1). Det gøres selvfølgelig med Add Component (2) helt som vi plejer. Kald scriptet for PipeMiddleScript (3).

Åben det nye script i Visual Studio. Opret en ny metode/funktion (1). Den skal ske, når der sker en kollision. Opret også en reference til scriptet LogicScript, så du har adgang til dette script (2).

Vi skal have en forbindelse til den første pipe, som dukker op. For at gøre det, skal vi hjælpe koden til at finde scriptet Logic Script. Det gøres ved at gå ind i objektet Logic Manager (1) og gå ind under Inspector > Tag (2). Vælg fra fald-ned menuen Add Tag (3).

Under Add Tag lav et nyt tag ved at klikke på + (1). Giv tagget et navn, “Logic” (2) og afslut med at gemme (3) … VIGTIGT: PAS SOM ALTID PÅ MED STORE OG SMÅ BOGSTAVER I UNITY.

… HUSK AT gå tilbage til game objektet “Logic Manager”, som vi allerede arbejder i. For du skal tilslutte tagget til objektet. Det går du ved at gå tilbage til inspector. Fra fald-ned menuen under Tag (1) vælg Logic (2) …

… når det er gjort rigtigt, ser det således ud (1):

I scriptet, lav sætningen Logic = … (1). Den vil lede efter det første objekt i hirakiet med tagget Logic, dvs. den første pipe, der spawner. I objektet vil den så se videre efter scriptet LogicScript. Så er der etableret en reference.

Alt i alt: Vi har et objekt af typen LogicScript, som vi kalder for “logic” (1). Vi sætter logic lig med det, som den finder i game objektet LogicScript (29: Så alt, hvad vi nu skal gøre, er at tilføje metoden/funktionen fra LogicScript (3). Vi kan jo se den nu kodemæssigt!

Test i Unity at den virker, dvs. at den tæller point op (1), når fuglen passerer mellem søjlerne.

4.4 Sker kollisionen med fuglen?

Det kan vi tjekke ved at ændre fuglens lag. Gå ind på Bird under Hierachy (1). Under Layer klik på fald-ned menuen (2) og vælg Add Layer (3).

Giv laget et navn, her “Bird” (1).

Tilbage på Bird’s egenskaber i Inspector vælger du nu laget “Bird” (1). Her fik det lag nr. 3.

Ret funktionen private void til som vist nedenfor ind i PipeMiddleScript (1). Bemærk at laget Bird har nr. 3, så derfor sættes collision.gameObject.layer == 4.

Tjek efter igen i Unity, om scoren opdaterer. Hvis ja, så tager den fra det rigtige lag.

4.5 Lidt til fremtidig udvikling: Trylleri med scoren

Vi manipulerer lidt med scoren. I LogicScript har vi en funktion, addScore() (1). Lige nu lægger vi bare 1 til for hver gang, man passerer et collision objekt (2).

I stedet så placerer vi en integer inde i funktionen addScore (1). Denne værdi lægges til playerScore i stedet for 1-tallet (2).

I scriptet PipeMiddleScript retter du kaldet til funktionen addScore() til, så der nu står addScore (1). Den vil nu tælle op med +1 hver gang lige som før, men hvis nu score kom over f.eks. 50, så er spillet forberedt til, at man så kunne lægge 2 til i stedet for.

Trin 5. Spilafslutning samt byg spillet

Vi skal kunne afslutte spillet. Det gør vi at lægge en “game-over” skærm ovenpå det almindelige spil. Når fuglen så rammer et rør, så bliver game-over skærmen synlig. Der skal være en knap på game-over skærmen til at genstarte spillet.

5.1 Game-over skærm

Start med at lave et nyt game object ved under Hierachy > Canvas at vælge Create Empty fra lokalmenuen. Kald objektet for GameOverScreen (1).

Inden i game objectet GameOverScreen (1) vælg UI (2) > Legacy (3) > Text (4).

Indsæt teksten “Game over” under Text (1) og flyt teksten ind på skærmen (2).

Vi får også brug for en knap. Den laver du på næsten samme måde som teksten. Gå ind under GameOverScreen (1), højreklik og få lokalmenuen frem. Under lokalmenuen vælg UI (2) > Legacy (3) > Button (4).

Bemærk, at når du har oprettet en game object knap, så er den delt i 2. Selve knappen og en tekst (1).

Når du har foldet Button ud, så vil du få en masse redigeringsmuligheder. Mere om det senere. Først skal vi have noget tekst til knappen. I Hierachy gå ind under Text (Legacy) (1). Den kommer automatisk, når du har oprettet Button. Ret knappens udseende og tekst til under Inspector, så den ser nogenlunde fornuftig ud (3).

5.2 Knyt en funktion til genstart til “Play again”-knappen

Vi vælger at placere den nye funktion, restartGame(), i scriptet LogicScript, selvom det kunne placeres i sit eget script. Åben LogicScript. Øverst tilføjer du UnityEngine.SceneManagement (1) og nederst en ny funktion restartGame() (2). Der er kun den samme scene, så derfor kan vi nøjes med nedenstående. Man kan selvfølgelig have mange scener i Unity svarende til baner i et spil. Husk at gemme ændringerne i LogicScript.

Vi skal nu knytte funktionen restartGame() til knappen Play again som en event.Gå ind på knappen under Hierachy (1). Under knappens egenskaber i Inspector find OnClick (2). Under On Click () klik på + (3). Find game objectet LogicManager (4), som rummer scriptet LogicScript, og træk det over under knappens inspector (5) … (fortsættes herunder) …

… i Inspector er vi i forvejen under On Click (). I fald-ned menuen under No Function (1) vælg LogicScript (2), og i den nye lokalmenu vælg funktionen restartGame() (3).

Test af ved at køre spillet.

5.3 Vis kun game-over skærmen, når vi fejler

Minuttal i video: 40:04. Vi skal selvfølgelig ikke se game-over skærmen under selve spillet. Så vi gør den usynlig. Marker først game objectet GameOverScreen under Hierachy (1). Fjern fluebenet (2) under objektets navn i Inspector (2), og så ser du det ikke mere på scenen (3).

Idéen er så selvfølgelig, at objektet skal vises, når fuglen rammer en af søjlerne/pipes. Åben scriptet LogicScript.

Øverst i scriptet lav en reference til objektet ovenfor, dvs. GameOverScreen (stav MEGET nøjagtigt, herunder forskel på store og små bogstaver) (1). Nedenunder lav en ny funktion GameOver(), som selvfølgelig skal være public. “public” vil sige, at den kan kaldes og derfor anvendes uden for scriptet LogicScript (2). Funktionen “tænder” for skærmen GameOverScreen.

Husk at lave referencen fra ovenfor også i Unity. Klik på objektet LogicManager (1). Lokaliser GameOverScreen (2) og træk den over i Inspector under LogicScripts Game Over Screen. Er det gjort rigtigt, står der “GameOverScreen” i feltet th. for punktet GameOverScreen (3).

Eventen skal som sagt ske (“trigger”) når fuglen rammer ind i rørerne/pipes. Åben BirdScript, dvs. scriptet, der er knyttet til fuglen. Bagefter åben BirdMiddleScript, hvor vi kan genbruge den kode, som gav adgang til LogicScript. Kopier den indrammede kode fra funktionen Start() i BirdMiddleScript (1) og gem den et øjeblik i din computer.

Åben BirdScript. Øverst lav en reference til LogicSript, så vi har adgang til funktionerne under LogicScript (1). Under funktionen void Start() indsæt koden, som du kopierede fra BirdMiddleScript (2). Til sidst indsæt en funktion til at håndtere, at funktionen GameOver() skal afvikles ved kollision med søjlerne (3).

Test efter i Unity. Når fuglen kolliderer med en søjle, så skal Game over-skærmen blive synlig. Også selvom baggrunden fortsætter med at bevæge sig.

Inde i BirdScript opret en ny variabel, denne gang en bool. Kald den birdIsAlive og sæt den til “true” (1). Hvis så der sker en kollision, så dør fuglen. Sæt derfor birdIsAlive til false i funktionen OnCollisionEnter (2). Når den dør, må man ikke kunne hoppe med fuglen mere. Derfor sætter vi en ekstra betingelse på Update(). Man kan kun udføre klikket med mellemrumstasten så længe, at variablen boolIsAlive er true.

Test scriptet af. Hvis det virker, kan du efter en kollision med pipes ikke få fuglen til at “hoppe”, når du bruger mellemrumstasten.

5.4 Byg spillet og spil det

Nu er spillet klar til at blive bygget (build). Vælg fra menuen File (1) > Build Settings (2)

I pop-op menuen Build Settings … vælg den ønskede platform (1) og klik på knappen Build (2).

Vælg en mappe til det færdige spil, dvs. det “buildede” spil. Jeg har lagt spillet i en mappe, der hedder “Endelig færdig med Flappy Bird”. Klik på Unity-logoet og spillet kører. Tillykke med spillet! Hent en kold øl/sodavand, hold en pause og glæd dig over, at du nu kan lave spil.

Trin 6. Forbedringer

Spillet fungerer, men vi kan stadig forbedre det. VIGTIGT: Kikker du i videoen fra minuttal 43:33 i videoen https://www.youtube.com/watch?v=XtQMytORBmM, får du nogle tips og tricks til, hvor du kan tage fat.

  • Vi skal have en game over, hvis fuglen kommer udenfor skærmen
  • Scoren kan stige, selv efter game over
  • Lav lydeffekter
  • Leg med partikel-systemet, så der kommer skyer på skærmen
  • Brug animationsvinduet til at sætte flappende vinger på fuglen
  • Lav en titelskærm, dvs. en start-skærm
  • Stop bevægelsen af rørerne, når spillet stopper
  • Svær: Lav en highscore
  • Du kan udvikle med kreative idéer, så fuglen f.eks. kan skyde missiler ud
  • Prøv på andre, simple spil. Fx pong, angry birds, space invaders …

7. Opsummering på videoen

7.1 Hvad har vi prøvet?

  • Vi har en karakter (fuglen), som vi kan bevæge ud fra brugerens input
  • Vi får nye objekter til at dukke op (spawne) ud fra en timer
  • Vi har lavet en UI, der viser vores score
  • Scoren kan tælle, når vi passerer gennem pipes
  • Vi har lavet en game-over skærm
  • Vi kan starte spillet igen

7.2 Variabler i C#, som bruges i videoen

TYPE VARIABELFORKLARING
boolKan kun antage værdien 0 eller 1. Bruges til ja/nej eller true/false
floatBruges kun til tal, men kan antage alle talværdier inklusive kommatal. F.eks. 8,789 og -234,5678. Man kan regne med 2 floats, f.eks. lægge dem sammen. Så vi kan få 2,1 + 3,4 til at give 5,5
intBruges kun til heltal. Dvs. tal, som kun kan antage hele værdier. F.eks. til point i et spil. Eksempler er 123, 0, -4567, -435 osv. Man kan regne med 2 int, f.eks. lægge dem sammen. Vi kan få 2 + 1 til at give 3.
stringBruges til alt muligt, både tekst og tal. Skal du gemmme ordet KåmSåDeHviii, så kan du gemme det i en streng. Men man kan ikke regne med strings, dvs. lægge 2 strings sammen. Hvis du forsøger at lægge 2 tal sammen, f.eks. 2 + 2 OG de 2 tal er strings, så vil du få 22. Til gengæld kan du godt lægge strengene “AGF” og “vinder” sammen til “AGFvinder”.

7.3 Tips og tricks til Unity

EMNEZOOM
Zoom på scenenBrug 2 fingre på touchpad til at zoome
DebuggingSkriv koden Debug.log(“min tekst); + nederst under Project skift fanen fra Project til Console (1). Så kan du se, hvad der foregår i programmet. Debuggeren vil vise, hvis der er fejl undervejs, når du kører programmet.