Denne gang fik vi til opgave at bruge en Game Engine ved navn Unity til at lave et spil. Til det formål skulle vi følge en tutorial af youtuberen Brackeys, som har lavet en videoserie på 11 videoer, hvor han gennemgår, hvordan man laver et runner spil i Unity. Personligt har jeg allerede lavet denne tutorial 2 gange før, en gang af egen interesse og en anden gang på ungdomsskolen i Høje Taastrup, og skal jeg være helt ærlig synes jeg at den er fin nok, den lærer dig at bruge Unity som et program, men den lærer dig ikke rigtigt C#, hvilket er et af de kodesprog man hovedsageligt koder med i Unity. Som sagt er den til selve Unity fin nok, den lærer dig at navigere i softwaren og forklarer, hvordan man gør forskellige ting. I forhold til C# gennemgår og forklarer Brackeys koden fint, men selvom du forstår koden, kopierer du den stadig, så du lærer ikke rigtigt noget af det, da du højst sandsynligt ikke kommer til at kunne huske det bagefter, hvilket jeg kan sige efter egen oplevelse og andres oplevelser som jeg har hørt, både venner og folk fra internettet. Jeg forstår godt, hvorfor han gør det på denne måde, videoerne er til begyndere og der er ingen grundt til at gå så meget i dybden med C#, da det ikke er en C# tutorial, men en runner tutorial. Problemet er bare at der er mange, som finder sig selv stuck efter tutorielen når de prøver at lave deres eget spil, da de tænkte at de havde nogenlunde styr på det. Det er her mange ender med at give op på spiludvikling, hvilket selvfølgeligt er trist.
Video 1:
Den første video var Brackeys, som forklarede, hvad en Game Engine er og snakkede lidt om Unity.
Video 2:
Den anden video startede med Brackeys, som gennemgik, hvordan man installerer Unity, så jeg sprang den del over, da vi allerede havde installeret Unity i første modul. En stor del af den anden video var at lære Unity at kende, mens jeg skabte platformen, som vil fungere som banen, samt Player karakteren, hvilket egentligt bare var en cube. Jeg skabte et playermaterial til Playeren for at gøre playeren rød. Playeren fik en Rigidbody, så den påvirkes af tyngekraften og så jeg kan få den til at bevæge sig senere. Til sidst lavede jeg også skyboxen til en hvid, grålig farve, så det så lidt pænere ud. Dette var ikke i tutorialsne endnu, men jeg lavede også en masse mapper ved navnene "Scripts", "Mats", "Scenes" og "Prefabs," så det er organiseret.
Video 3:
I denne video startede kodningen med et PlayerMovement script. Størstedelen af videoen var Brackeys, som prøvede at forklare lidt om C# kodning , hvor efter han til sidst endte med et lille program, som indeholdte en public rigidbody og et Update void, som tilføjede noget force til rigidbodyen på z-aksen ganget med Time.deltaTime, så koden virkede ens på alle computere, uanset, hvilket hardware computeren har.
Video 4:
Til at starte med lavede jeg et PhysicsMat, ved navn "BananaPeel," da dets opgave var at fjerne alt friktion fra de objekter det var sat på. Jeg sat "BananaPeel" på min Player karakter og banen, så Playeren ikke ville side fast i banen, når man bevægede hen ad den. Derefter fortsat jeg på PlayerMovement scriptet ud fra min egen hukommelse, med hjælp fra videoen, når jeg glemte noget og det lykkedes mig at lade playeren bevæge sig fra side til side med koden til højre. Her bruges FixedUpdate i stedet for Update som funktionen, da Unity håndterer det bedre i dette tilfælde, ifølge Brackeys. Koden siger at hver frame får Rigidbodyen, hvilket er Player karakterens Rigidbody, da det er sat sådan inde i Unity, tilføjet kraften ForwardForce * Time.deltaTime force på z-aksen, hvor "ForwardForce" er defineret i toppen af koden til at være 2000f, f da det er en float. Skulle a eller d trykkes på keyboardet tilføjes der en kraft på enten - SidewaysForce * Time.deltaTime eller SidewaysForce * Time.deltaTime, hvor "SidewaysForce" igen er defineret i toppen af koden, samt at der skal tages hensyn til retningsændring med ForceMode.VelocityChange.
Video 5:
Denne video gik kun ud på at få kameraet til at følge Player karakteren, hvilket gøres vha. et lille script, som tager Player karakterens position og sætter kameraets position til at være det samme som playerens position, plus et lille offset.
Video 6:
I denne video skulle vi lave obstacles, så man kunne dø i spillet, hvis man rammer dem. Det var sådanset meget simpelt med et lille script, som udnytter collision til at checke taget af det man ramte ind i, og hvis taget i mit tilfælde var "Enemy" deaktiverer koden PlayerMovement scriptet. Det var her jeg begyndte at gå lidt offtrack, da jeg blev intereseret i ideen af en Jump pad, så jeg endte med at bruge lidt tid på at lave denne Jump pad og endnu en bane oppe over den originale bane. Jeg lavede også en usynlig væg bag Jump paden, gav den tagget "Enemy" og lavede en pil, som pegede på Jump paden, så playeren var nødt til at bruge den. Jump paden virkede ved at checke collisionInfo, se om collideren var JumpPad, og hvis den var ville den tilføje 1250 i kraft til Player karakterens y-akse.
Video 7:
I denne video lavede jeg en del af obstaclesne på banen, hovedsageligt den nederste bane, da jeg gerne vil have at man skulle springe op fra den nederste bane til den øverste bane mens den var usynlig, hvorefter den pluslig blev ville blive synlig og du så ville have nye udfordringer som du ikke havde vidst var der før, hvorefter du til sidst ville falde ned på den originale bane igen. Da jeg ville have at disse obstacles skulle komme ud af det blå, skulle jeg først finde en måde at få dem til at være usynlige og derefter synlige, hvilket jeg kun har gjort for banen ind til videre vha. et lille script, der aktiverer banens MeshRenderer når playeren når en bestemt værdi på z-aksen. Dette ville dog kun virke på obstaclesne, hvis jeg laver en hel masse public MeshRenderers i koden, hvilket ikke er optimalt, så jeg ville prøve at finde en bedre løsning først, derfor venter jeg med at lave en del af den øverste bane til senere.
Video 8:
I denne video lavede jeg en score UI til spillet ud fra playerens position på z-aksen. Det var let nok at lave både inde i Unity med canvaset, samt koden, der tog Player karakterens z position og lavede det om til et string og indsættede det i teksten, men jeg havde et problem med teksten. Den var ekstrem blurry uanset, hvad jeg gjorde og stadig prøver at gøre. Jeg vil se om jeg kan finde en løsning, men indtil videre kan hverken jeg eller nogen af mine klassekammerater finde en løsning. Da jeg skulle importere en font ind i Unity lavede jeg også en ny mappe ved navn "Fonts." Skal jeg være helt ærligt forstår jeg ikke helt, hvad pointen med denne score UI er, da den ikke rigtigt bruges til noget, men den er vel fin nok at have, så jeg har noget at kigge tilbage på, skulle jeg få brug for dette.
Video 9:
I denne video gjorde jeg så spillet genstartede når man døde. For at gøre dette skulle jeg først lave et GameManager script, som kommer til at indeholde diverse funktioner, som jeg kan kalde fra andre scripts. Scriptet som jeg kaldte EndGame er egentligt meget simpelt. Det checker om "gameHasEnded" er falsk, hvilket jeg har sat det til at være, hvorefter det sætter det til at være True, skriver i consolen "Game Over" og kører en anden funktion "restart", som loader den samme scene igen. Brackeys gjorde også så man ville dø, hvis man kom ud over banen ved at sige at koden skulle køre EndGame når Player karakterens y position er under 0. Dette kunne jeg dog ikke gøre, da man også skulle dø når man ryger ud over skybanen, så jeg gjorde det at jeg lavede 2 usynlige lange plader, en under den originale bane og en over skybanen og lavede noget kode inde i PlayerCollision scriptet, som siger at når playeren rammer noget med tagget "OutOfTheWorld," så deaktivereres "OutOfTheWorld"s boxcollider, PlayerMovement deaktiveres og EndGame køres.
Video 10:
I denne video lavede jeg en måde at vinde spillet på. Jeg lavede en Winner pad og gav den et "Winner" material som jeg lavede gult og lagde det ind i Mat folderen sammen med de andre materials. Jeg lavede et "Level Complete" screen med en animation, hvor det fader ind, samt noget kode, så det kommer ind når du collider med Winner paden. Til sidst i animationen tilføjede jeg også at den skal køre en funktion, som loader den næste scene.
Video 11:
I den sidste video lavede jeg en menu scene, som har en knap til at starte spillet, vha. et meget lille script, som loader den næste scene og en credits scene, som har en knap til at lukke spillet, vha. et meget lille script, som lukker applicationen. Det lykkedes mig ikke at finde en løsning til sky banens obstacle loading problem, så for at jeg havde noget, som virker lavede jeg den uoptimiserede måde med at lave en masse public MeshRenderers for alle obstaclesne som jeg fik sat ind. Jeg fandt heller aldrig en løsning til UI problemet med at den var alt for blurry, hvilket jeg vil prøve at kigge lidt nærmere på i min fritid. Af en eller anden grund, da jeg trykkede på build and run når spillet var færdigt havde min score UI besluttet sig for at være nær midten af skærmen i stedet for toppen, hvilket jeg ikke lige kunne finde en løsning på og alt UI teksten var generelt meget mindre end i Unity. Jeg nåede ikke at løse disse sidste ting, men som nævnt tidligere kigger jeg nok lidt nærmere på det i min fritid.
WARNING! Meget dårlig lyd.
Personligt har jeg ikke lært så meget af dette forløb, da det er en tutorial serie som jeg allerede har gennemført 2 gange nu, men det var stadig meget dejligt at få en genopfrisker på det, specielt, hvis det viser sig at vi skal lave et nyt forløb, hvor vi prøver at lave vores eget spil i Unity efter dette forløb. Spillet endte med at være ok, jeg gjorde det meget svært har jeg fået af vide fra mine klassekammerater, men det var også meningen, så jeg er glad for at høre, at jeg opnåede mit mål med det. Spillet har stadig få fejl som jeg gerne vil prøve at løse og en noget som ikke er særligt optimeret, hvilket jeg også gerne vil finde en bedre løsning til, så det må jeg få kigget lidt på i min egen fritid. Altså blurry UI text, UI, som ikke er der, hvor den burde være og skybanen, der ikke er særligt godt optimeret. Alt i alt synes jeg dog det har været et meget sjovt forløb og jeg glæder mig til at se, hvad det næste vi skal lave er.