IT selvvalgt projekt: Unity spil



Relaterede dokumenter
Fang Prikkerne. Introduktion. Scratch

Michael Jokil

Sådan laver du en animationsfilm

Unity Guide 1 CONTENTS

Fable Kom godt i gang

Kom godt i gang med Fable-robotten

Klasse 1.4 Michael Jokil

Læringsprogram. Christian Hjortshøj, Bjarke Sørensen og Asger Hansen Vejleder: Karl G Bjarnason Fag: Programmering Klasse 3.4

UNITY OG KODE. Simpelt FPS

Gem dine dokumenter i BON s Content Management System (CMS)

Ide med Diff. Mål. Tidsplan. 1.uge: 2.uge:

Projektbeskrivelse. IT B og Programmering C. Klasse 3.4. Louis Drejer, Markus Duus og Mikkel Jensen. Fra

Greenfoot En kort introduktion til Programmering og Objekt-Orientering

Rumfart. Introduktion. Scratch. Nu skal du lære hvordan du programmerer din egen animation! Arbejdsliste. Test dit Projekt.

Bekrig Klonerne. Introduktion. Scratch. I dette projekt skal du lære, hvordan du laver et spil, hvor du skal redde Jorden fra monstre i rummet.

Ghostbusters. Introduktion. Scratch. Du skal lave et fangelegsspil med spøgelser! Arbejdsliste. Test dit Projekt. Gem dit Projekt

Fable Kom godt i gang

Hukommelsesspil. Introduktion. Scratch

Mircobit Kursus Lektion 4 (Du skal her vælge Lets Code Og herefter Block Editor.)

ViKoSys. Virksomheds Kontakt System

Mircobit Kursus Lektion 3 (Du skal her vælge Lets Code Og nederst Microsoft Block Editor.)

Scratch. - introduktionshæfte

Daniel Kaasing Roskilde Tekniske Gymnasium Programmeringsjournal. Lavet af Daniel Kaasing. Lærer: Karl G Bjarnason

Manual til WordPress CMS

Andreas Lauge V. Hansen klasse 3.3t Roskilde HTX

Kapitel 6 Events i C#

IT opgave. Informationsteknologi B. Vejleder: Karl. Navn: Devran Kücükyildiz. Klasse: 2,4

Høvdingebold. Introduktion. Scratch

Oktober Dokumentpakker

REDIGERING AF REGNEARK

TK/TBL / v.0.1. DigiMatch. Elektronisk Kamprapport

Indhold. 1. Adgang og afslutning

En lille vejledning til lærere og elever i at bruge matematikprogrammet WordMat (begynderniveau)

Kapitel 4 Løkker i C#

Automatisering Af Hverdagen

Vejledning KPK Online Prøverum

Skab Din Egen Verden

Arbejde med 3D track motion

Under 'Microsoft Block Editor', klik 'New project' for at åbne block editor-værktøjet.

Spil Rapport. Spil lavet i GameMaker. Kevin, Mads og Thor

Mircobit Kursus Lektion 1

Pinnacle Studio Titler

BRUGERMANUAL FOR KLUBKOORDINATORER. Version 2.0

Koden i denne guide vil kun virke i Flash MX 2003 og MX ikke ældre versioner!

Den digitale Underviser. Clouds. Dropbox

5/11/2015. Programmering. Hussein Al-Saidi ROSKILDE TEKNINSK GYMNASIE VEJLEDER: CHRISTOFFER S.

Diagrammer visualiser dine tal

SCRATCH PÅ DANSK LÆR AT LAVE TEGNEFILM OG COMPUTERSPIL MED SCRATCHJR. Kirsten Dam Pedersen

Computerspil Gruppe: Julia, Rasmus N, Edgar og Frederik P

Online billede filtrering

SÅDAN BRUGER DU REGNEARK INTRODUKTION

Lonbox PCM2001 betjeningsenhed

Tyngdekraft i Scratch

Den digitale Underviser. Videoredigering. Windows Live Movie Maker

Binært LAS-format Denne indstilling import Laser scan datafiler, i LAS format.

DMX styring med USB-interface

Lektion 3. Grundlæggende programmering i VR

Grafisk design Skitse 1.

The GIMP. The GIMP til windows kan hentes fra siden: win.sourceforge.net/stable.html

Introduktion til Flash

Opsætning af 60 dags regel

Lad os prøve GeoGebra.

Microsoft PowerPoint 2010

ONSCREENKEYS 5. Windows XP / Windows Vista / Windows 7 / Windows 8

Kom i gang med Course Tool 1.2

How to do in rows and columns 8

PowerPoint Præsentation

Brainstorm Hjemmeside Grafisk interface med billeder af computer dele billederen skal så kunne klikkes og få information omkring delene,

I gang med dit Gamer: bit Arkade Kit Denne guide er oversat og en smule forenklet fra Sparkfuns Hook-Up guide

Konfiguration af BOOX Nova. Der tages forbehold for trykfejl og ændringer i producentens / Googles software.

Overvågningskamera. ~Af Svend, Valdemar og Frederik~

Kompendium til Geogebra

Sådan opretter du en elektronisk aflevering

Visualiseringsprogram

AgroSoft A/S AgroSync

Scratchdag 16. maj Lær at programmere med scratch

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Vejledning til opbygning af hjemmesider

GRAFISK WORKFLOW. 1 Grafisk workflow

Når du åbner Sportsplanner første gang, får du to muligheder. Åben opstilling og Ny opstilling.

IsenTekst Indhold til Internettet. Manual til Wordpress.

ChatBot. Introduktion. Scratch. Nu skal du lære hvordan du programmerer din egen talende robot! Arbejdsliste. Test dit Projekt.

Manual til AVG Antivirus

Vurdering af billedmanipulation Opgave 1

AUTOMATION SERVICE. Sådan anvender du programmet Automation Service. Udviklet af PC SCHEMATIC A/S

Velkommen til IT for let øvede

DigiMatch Elektronisk Kamprapport

Vejledning i Powerpoint

Hjemmeside manual. Indholdsfortegnelse. Noter: - 1 -

Introduktion til Flash

Redaktørvejledning for Skriv en artikel

Lav din egen forside i webtrees

Beskæring af et billede med Vegas Pro

02101 Indledende Programmering Introduktion til Eclipse

Transkript:

IT selvvalgt projekt: Unity spil Af Basthiann Bilde, Joachim Goodman og Tobias Højsgaard Klasse 2.4 IT B 18. maj 2015 1 ud af 14

1 Indledning 1.1 Formål Dette selvvalgte projekt er til for at give en række erfaringer med projektplanlægning og fremstilling inden for faget IT B, som skal afsluttes på 3. år på HTX. Formålet med dette projekt er at få et billede af hvordan det afsluttende projekt i IT kommer til at forløbe. Derudover skal dette projekt også give indsigt i hvordan de relevante værktøjer fungerer, sådan at der udarbejdes kendskab til de relevante IT værktøjer, som senere kan bruges i andre sammenhæng. 2 Målgruppe og produkt 2.1 Grundlæggende koncept Vores idéer til dette projekt var at arbejde med programmet Unity, og udvikle et simpelt spil for at få en fornemmelse og forståelse af programmet. Dette ledte os til hvilken type spil vi ville lave, og vi besluttede os for at lave et 2D platform spil. Da vi ikke havde meget erfaring med Unity besluttede vi os for, at vi ville starte med at benytte nogle allerede eksisterende sprites, hvorved at vi så kunne bruge disse til at lære basics i programmet, og så senere hen i forløbet designe vores egne sprites. For at gøre det lettere at lave vores sprites, samt for at give det et mere oldschool look, besluttede vi os for at lave vores sprites med tydelige piels. En af de sidste overvejelser vi gjorde os var hvorvidt vores bane skulle lave vertikal eller horisontal, vi endte med at beslutte os for vertikal da det så ville være sværere, da man kan falde ned og komme tættere på startpunktet, hvilket ikke kan lade sig gøre hvis banen var horisontal. 2.2 Målgruppe Til tiltænkte målgruppe til vores spil er de 6 25 årige. Vores spil har et relativt hurtigt tempo og kræver at man koncentrerer sig. Som sådan kan spillet sagtens passe til alle aldre, men da det er et webspil er den yngre generation lidt bedre til at komme hen til det. Derudover er vores spil ikke stort/langt nok til at folk vil skulle bruge flere timer i streg på at gennemføre det, spillet er derimod forholdsvis kort, både i form af bane og den tidsbegrænsning, derfor vil spillet højst sandsynligt blive brugt som en form for kort periode tidsfordriv. Foruden indeholder vores målgruppe en del personer, der tilhører en generation der er opvokset med platform spil, og spillet vil derfor appeal mere til netop disse personer. 2.3 User stories og features Vores spil er et 2D platform spil, som skal laves med et oldschool layout, form af tydelige piels. 2 ud af 14

Vores Avatar skal kunne styres fra side til side, samt være i stand til at kunne hoppe. Avataren skal kunne hoppe mellem en række platforme, samt være i stand til at kunne kollidere med disse. Der skal være mulighed for at vælge forskellige retninger, og dermed tvinge spilleren til at prøve sig frem, for at finde den bedst mulige rute. Avataren kan styres ved at bruge A og D til at løbe til siderne, og der kan bruges SPACE til at hoppe op ad. Spillet skal designes som en klippevæg hvor avataren skal hoppe fra afsats til afsats for at komme frem. Platformene skal markeres med et tydeligt lag sne som skal angive hvilke steder det er mulig at stå. Spillet skal indeholde et scoresystem som viser afstanden fra start punkt. Der vil også blive givet en highscore for, at se ens højeste score. Spillet skal også indeholde en reset timer for at skabe et stress element som skal udfordre spilleren og får ham/hende til forsøge at bevæge sig så hurtigt som muligt. En ting der ville være rart at have ville være at lave vores egne animationer og bevægelseskoder til en spillerkarakter. Der var to features som vi tænkte kunne være gode at implementere, men som vi vidste fra start af at der ikke ville være tid nok til at indsætte. Dette er et online leaderboard og tilfældigt lavede levels, som også kaldes proceduralt genererede levels. 2.4 Brugergrænseflade Vi har lavet et 2D platform spil, som går ud på at få en avatar så langt væk man kan på begrænset tid. Det gør man ved at hoppe fra platform til platform. Denne slags spil er også kendt som jumping puzzles. Det er spilleren som skal styre avataren op til toppen af banen ved at bruge A, D og samt Space, uden at manden falder ned i undergrunden og dør, hvorved man bliver nødt til at starte forfra. Man har 1 minut til at komme så langt op af banen som muligt. Når minuttet er over bliver man sat tilbage til starten. Det gælder som om at komme så højt op som muligt for at får en højere score, som svarer til den afstand man har lagt bag sig fra startpunktet. Det er på den måde muligt at dyste mod sine venner og få en slags konkurrence ud af det. Vi kunne endda også implementere et leaderboard og gøre spillet online så hele verden kunne dyste mod hinanden. 3 ud af 14

For at styre avataren skal man bruge tasterne på tastaturet. For at få avataren til at gå til siderne bruger man A og D, og for at få den til at hoppe bruger man space. Vi har også sat en restart knap ind, hvis man gjorde noget forkert undervejs, og man gerne vil starte forfra skal man bare bruge tasten R. Alt dette kan også ses i højre side af skærmen. 3 Implementation og værktøjer 3.1 Unity engine kort fortalt Unity 5, som for nyligt er blevet gratis at installere, er en såkaldt spilengine eller spil motor, hvis man skal oversætte det groft til dansk. Formålet for en spilengine er at levere et udviklingsmiljø, som gør processen i at udvikle spil væsentligt hurtigere. Ved at have en engine kan man ved hjælp af en nem brugergrænseflade hurtigt gøre ting, som ville have taget meget lang tid og være meget uoverskueligt, hvis man skulle have skrevet det i kodesprog. Den grafiske repræsentation af diverse spilobjekter i relation til hinanden betyder at man nemt kan se hvordan ens spil skrider fremad. I Unity 5 kan man flytte rundt på brugergrænsefladerne, sådan at man kan optimere sit arbejdsforløb. Man har for eksempel vinduer til at se på listen over spilobjekter, som er til stede i ens scene (hierarki vinduet), et vindue, hvor man kan se alle filer i ens projektmappe (projekt vinduet), et vindue, hvor man kan se scenen man er i gang med, spillet eller de animationer man har tilgængelige på et valgt spilobjekt, samt et inspektor vindue, hvor man kan se spilobjekternes egenskaber. 4 ud af 14

Der er ud over disse vinduer (foruden nogle få andre) en masse forskellige knapper. Vigtigst af alle disse er play knappen øverst på billedet ovenover. Dette lader en afprøve spillet som det er i brugergrænsefladen, sådan at man ikke behøver at kompilere spillet og dens kode hver gang man skal teste det. 3.1.1 At flytte rundt på spilobjekter Læg mærke til inspektor vinduet på billedet i det tidligere afsnit ude i højre side af billedet. I dette inspektor vindue ser vi et vindue, der hedder en Transformer. Dette er ikke den slags der bliver til biler eller den som skifter spænding i et elektrisk kredsløb, men derimod en software komponent som bliver givet til alle objekter i spillet. Denne komponent fortæller os alt om objektets størrelse, dets position og dens rotation ifølge de tre akser, y og z, som sammen laver et tredimensionelt koordinatsystem. Det er lige meget om spillet 5 ud af 14

er 2D eller 3D. I Unity 5 bliver alle objekter behandlet som 3D med tre akser på et koordinatsystem. Man kan flytte rundt på spilobjekterne ved at enten at redigere værdierne i transformer komponenten eller ved at klikke på dem og trække rundt med musen. At klikke og trække er et eksempel på en egenskab som engine brugergrænsefladen har, som gør spiludviklingen hurtigere, da man ellers skulle skrive alle værdier ind i et sted i koden. Dette betyder at vi kan tage filer fra vores mapper, som sprites eller prefabrikerede spilobjekter, og derefter trække dem rundt indtil de er på den ønskede position. 3.1.2 Sprites og importering Apropos sprites er det sådan at man kan importere billeder fra rundt omkring på sin computer og sætte disse direkte ind i en af mapperne i ens projekt, hvorefter de viser sig i projektvinduet, som på det ovenstående billede kan ses i bunden af billedet. Man kan bruge den såkaldte sprite editor til at skære et stor billede med mange forskellige sprites, også kaldet et spritesheet, over i mindre dele. For at gøre dette skal man klikke på det importerede billede i projektmappen, hvilket vil vise elementet i inspektor vinduet. Man kan ændre ting som hvor mange piels af billedet der skal udgøre én enhed i Unity. Man kan også sige at der skal være flere sprites til ét billede, hvilket man derefter kan bruge sprite editoren til at skære ud. I mange tilfælde vil denne skæring foregå automatisk hvis man har en png. fil med en gennemsigtig baggrund. Man skal bare ind i editoren (se højre billede) og trykke på slice det øverste venstre hjørne. Dette vil bringe en menu op som giver en muligheden for at lave de automatiske sprites ved at trykke på endnu en slice knap. 6 ud af 14

Importeringsmulighederne betyder også at man har mulighed for at importere spilpakker, som fungerer som en slags udvidelser til Unity. Det er filer, med en række prefabrikerede spilobjekter i, som kan bruges til let at lave en spillerkarakter eller indsætte kollisions komponenter på de sprites vi allerede har lavet. Den pakke med standard prefabrikerede objekter vi har brugt kan findes på følgende link: https://www.assetstore.unity3d.com/en/#!/content/21064 Ud over dette har vi også importeret et Tiling script og et Parallaing script fra http://brackeys.com/preview/2d platformer course/ 3.1.3 Præfabrikerede spilobjekter Vi har nævnt ordet præfabrikerede spilobjekter en del gange nu, så det er på tide at sige hvad det er. Et præfabrikeret spilobjekt er en fil i projektmappen, som har alle de nødvendige egenskaber for et spilobjekt, som man så bare kan trække direkte ind i scenen og placere. Det vigtigste præfabrikerede spilobjekt vi har importeret er spiller karakteren, som løber rundt når man trykker på A og D eller piletasterne og hopper når man trykker på space. Selve spilleren fungerede i princippet uden at vi redigerede ved dens kode eller animationer og betød derfor at vi kunne lave spillet meget hurtigere end hvis vi skulle kode bevægelsen selv fra grunden. Vi gør det klart at vi ikke selv har stået for bevægelsen af spiller karakteren ud over at vi har redigeret værdierne for de variabler, der siger hvor hurtigt spilleren bevæger sig og hvor højt de kan hoppe. Vi har dog lavet vores egne præfabrikerede objekter baseret på platformene, som vi har sprites for, ved at lave et nyt prefab i menuen assets og undermenuen create og derefter trække vores platform over på den. Vi satte kollisions komponenter på vores platforme ved at bruge de importerede assets fra den første pakke vi nævnte. På den måde vil spillerkarakteren opfatte dem som jord og kunne stå på dem. En redigering af et præfabrikeret objekt i projektmappen vil desuden påvirke alle de objekter, som er blevet lavet fra denne fil. Men man kan dog redigere enkelte elementer og objekter hierarkivinduet, så man har stor fleksibilitet i hvordan man laver disse præfabrikerede objekter. 3.2 Scripts 3.2.1 Asset pack scripts Vi vil kort forklare den kode, som tilhører den importerede asset pakke og hvordan den har indflydelse på de eksisterende elementer i vores spil. 7 ud af 14

Det første script vi brugte var fra 2D assets pakken og var et script kaldet 2D Camera Follow. Som det måske kan gættes ud fra navnet får dette script et kamera til at følge efter et mål på en glidende måde, som samtidig får kameraet til at kigge lidt fremad i bevægelsesretningen. Målet i dette tilfælde er spilleren, hvilket betyder at kameraet bevæger sig alt efter hvordan spilleren bevæger sig. Det andet script vi har brugt udefra er et parallaing script fra http://brackeys.com/. Her er det en godt ting at alle objekter i Unity, også selvom man kun ser dem fra et 2D synspunkt, stadig er behandlet som tredimensionelle objekter og derfor eksisterer på tre akser. Scriptet bruger nemlig forgrunden og baggrundens z positioner, altså positionen hen ad den tredje akse, som ellers ikke bliver brugt til noget, til at bestemme hvor hurtigt elementerne skal bevæge sig forbi i forhold til spilleren når de går. Dette betyder at forgrunden bevæger sig hurtigere forbi end baggrunden, hvilket giver en fornemmelse af dybde. Det tredje script vi har brugt udefra er et tiling script, også fra http://brackeys.com/. Formålet med dette er at gentage forgrunds og baggrundselementerne når kanten af kameraet kommer tæt på deres kanter. Begge scripts fra http://brackeys.com/ er sådan set kun til for at give spillet et godt udseende. Der var selvfølgelig andre scripts fra 2D assets pakken, som vi var nødt til at bruge. Men disse er ofte integrerede i andre komponenter som spillerens kontrol script og koden bag kollisionskomponenterne. Kontrolscriptet vil vi dog gå lidt mere i dybden med, da vi faktisk redigerede dette for at give vores spil et formål. 3.2.2 Egne scripts i C# Teknisk set er dette script ikke 100% vores eget, da vi brugte det eksisterende platformer 2D user control script til at indramme vores egen kode. Se bilag 1 for kildekoden til dette script. Den blå skrift viser de områder af koden, som vi har redigeret. C# er et såkaldt stærk skrevet programmeringssprog. Dette vil sige at man er nødt til at deklarere hvilken type data en variabel er før man kan opbevare en værdi i variablen. Af denne grund har vi en række linjer i begyndelsen af vores redigerede kode, som opremser de forskellige variabler vi har og deres datatyper. Læg også mærke til ordene public og private. Disse siger noget om adgangen fra eksterne scripts til de værdier og variabler, som vi har. I sammenhæng med Unity betyder 8 ud af 14

det, at de offentlige variabler kan redigeres i brugergrænsefladen, mens de private variabler kun bliver brugt inden for det pågældende script og ikke kan redigeres udefra. Vi har derefter en række definitioner på funktioner. CheckIfDead, Respawn og Tetfun. CheckIfDead funktionen bliver kørt hele tiden i den senere funktion Update som gennemkøres hver frame i spillet. CheckIfDead ser på den måde hele tiden om spilleren opfylder et af kravene, som vi har specificeret er dødsårsager. At spilleren kommer under 7 på y aksen, hvis tiden på timeren er 0 eller mindre eller hvis spillet får inputs fra R eller Enter har vi fastsat som dødsårsager. Der står godt nok 20 i koden nedenunder, men dette er fordi vi efterfølgende redigerede værdien for denne variabel i Unitys brugergrænseflade. Hver frame trækker vi Time.deltatime, der svarer til antallet af sekunder, fra værdien i DTimer, hvilket får denne til at tælle ned. I Update har vi desuden en linje tekst, der siger at når varaiblen dead er sand, så skal funktionen Respawn køres. Respawn går ind på transformationskomponenten for spilleren og sætter spillerens position til koordinaterne for et respawn punkt, der svarer til koordinaterne for et tomt spilobjekt, som er usynligt i selve spillet. Kameraet flytter sig automatisk da det er bundet til spilleren. Respawn funktionen genstarter desuden timeren ved at sætte variablen DTimer til 60 igen. Vi kunne eventuelt have lavet denne værdi som endnu en variabel, der holdt den samlede tid, da vi bruger denne værdi mere end én gang i vores script. Funktionen sætter derudover variablen dead til falsk, sådan et funktionen kun køres én gang efter betingelserne i Update funktionen er opfyldt. Tetfun køres både i Start funktionen, der indlæser en række nødvendige værdier før spilobjekterne bliver vist. Den køres også i Update, sådan at dens værdier hele tiden stemmer overens. I Tetfun beregnes afstanden fra spawn ved hjælp af pythagoras ved at bruge værdierne fra transformationskomponenterne for startpunktet og spilleren. Den højeste score beregnes også ved hele tiden at sige, at hvis den højeste score er mindre end distancen fra start, så er den højeste scores nye værdi lige med distancen fra start. I Unity kan man generere tekstobjekter og referere til dem. Ved bare at lave et tomt tekstobjekt i Unity og lave en offentlig teksttype variabel i vores script. Vi kan derefter trække vores tekstobjekt over til scriptet i Unitys brugergrænseflade. Ved at sætte tekstobjektets værdi til at være en streng i Unity kan vi skrive i det tomme objekt. Vi kan også lave talværdier om ved at bruge den indbyggede funktion i C# kaldet ToString(). Vi har desuden begrænset talværdierne til to decimaler ved at indsætte #.## i parentesen efter ToString( #.## ). Til sidst har vi gjort sådan at /n vil lave en ny linje, når strengen skrives ind i tekstboksen i Unity. Dette er hvad der giver os den venstre tekstboks i vores spil, hvor timeren tæller ned, hvor distancen langsomt forøges, og hvor highscoren vises. 9 ud af 14

Ved at lave en score og tid i vores spil bliver det pludselig meget mere interessant, da man nu kan prøve at udfordre sig selv i stedet for at man kun udforsker banen. 4 Efterudvikling 4.1 Test Vi testede spillet ved at prøve at se hvor høje scorer vi kunne få blandt gruppens tre medlemmer og hvem der ellers havde lyst til at prøve spillet. Vores resultat var at den venstre side af banen var den nemmeste, at komme op ad og gav den højeste score på lige under 84.00. Parallaing og Tiling scriptene så ud til at have en smule konflikt med hinanden, men da dette kun er et udseendemæssigt problem er det ikke noget der har indflydelse på hvordan spillet bliver spillet. Et problem med spillet var at man efter relativ få gennemspilninger var i stand til at kunne udse sig den hurtigst mulige rute, hvilket endte med at skabe en ensretning i valg af rute gennem banen. Vi observerede desuden at spillerobjektet nogle gange sad fast på kanterne af platformerne. 4.2 Fremskrivning og videre udvikling Spillet sidder i øjeblikket ude på nettet og kan spilles ved at downloade Unity Web afspilleren. En eventuel videreudvikling af spillet ville være at implementere nogle af de userstories, som vi ikke fik ind i den første version og eventuelt en indførelse af noget tilfældig level generering, sådan at banen ville være endeløs. Dermed ville man kunne implementere online elementer som leaderboards, som ville skabe et større konkurrenceelement i spillet. Dette kan implementeres uden alt for store problemer, så dette ville nok også blive tilsat til en videreudvikling af spillet. Hvis vi skulle lave indtægt på spillet i form af reklamer eller køb af offline versioner ville vi være nødt til at skifte til den professionelle udgave af Unity efter indtægten når 100.000$. 5 Konklusion Dette selvvalgte projekt var til for at give en fornemmelse af hvordan det afsluttende IT projekt på tredje år ville komme til at forløbe. Samtidig stiftede vi bekendtskab med værktøjerne inden for spilprogrammering i Unity og sproget C#. Ved at bruge nogle eksisterende sprites, assets og præfabrikerede spilobjekter med animationer, kunne vi lave et simpelt spil. Vi besluttede os for at lave et miljø i en gammeldags stil med piel art, altså billeder hvor man bruger de enkelte piels og arbejder i en meget lille billedestørrelse. 10 ud af 14

Målgruppen er hovedsageligt den yngre generation, da de bruger internettet mere til underholdning og vi af distributionsmæssige årsager laver spillet som et browserbaseret spil. Nogle af de nødvendige features er at spilleren skal kunne bevæge sig og hoppe imellem platforme. En timer og et stykke kode til at måle afstanden fra startpunktet, samt en highscore er også nødvendige. En rar ting ville være egne animationer til spillerkarateren i stedet for placeholder genstandene fra 2D assets pakken i Unity. Et online leaderboard og proceduralt genererede levels ville også være sjove at implementere, men der var slet ikke tid nok til overhovedet at tænke over at lave disse to i den første version af spillet. Vi lavede spillet i Unity, der som en spilengine fungerere som en brugergrænseflade til at gøre spiludviklingen hurtigere. Ved at importere en række forskellige billeder og sprites, samt standard 2D assets pakken fra Unitys hjemmeside og to scripts fra et 2D platformer kursus fra http://brackeys.com/ lavede vi et stillads til vores spil, hvorefter vi gik ind i kontroller scriptet til vores spillerobjekt og redigerede dens kode, sådan at vi kunne få den sendt tilbage til start, når den opfyldte nogle krav, som vi havde defineret som dødsårsager. Vi redigerede også koden sådan at en timer talte ned til spillerens død og genstart samt en afstandsmåler og en high score, der måler den højeste afstand man er kommet væk fra starten. I en eventuel videreudvikling ville vi implementere vores egne animationer som det første, fikse nogle af de små fejl i spillet som at man nogle gange sidder fast på platformene og det udseendemæssige glitch med bevægelsen af forgrunden og baggrunden. Hvis vi skulle tjene penge på spillet ville vi have et loft på 100.000$ før vi skulle skifte til den professionelle version af Unity 5. 6 Bilag 6.1 Kildekode til platformer 2D controller script using System; using UnityEngine; using UnityEngine.UI; using System.Collections; using UnityStandardAssets.CrossPlatformInput; namespace UnityStandardAssets._2D { [RequireComponent(typeof (PlatformerCharacter2D))] public class Platformer2DUserControl : MonoBehaviour { public float Dedpos = 20f; 11 ud af 14

public Transform Spawnpoint; public Tet TimerTet; public float DTimer = 60f; private Transform mytrans; private bool dead = false; private float DistanceToSpawn = 0f; private float MaScore = 0f; //Funktioner //Funktion til at sætte spilleren på plads efter en timer når 0 eller spilleren falder ned. private void Respawn() { //Transform elementets positionsværdier ændres for spilleren. Værdien for variablen dead genstartes og det samme sker for DTimer variablen. transform.position = new Vector3(Spawnpoint.position., Spawnpoint.position.y, Spawnpoint.position.z); DTimer = 60f; dead = false; //Funktion til at tjekke om spilleren er død. private void CheckIfDead () { //Hvis spilleren kommer under en hvis y værdi eller timeren når 0 er variablen dead sand. if (mytrans.position.y < Dedpos DTimer <= 0) { dead = true; //Hvis spilleren trykker på R eller Enter er variablen dead sand. else if (Input.GetKeyDown(KeyCode.R) Input.GetKeyDown(KeyCode.Return)) dead = true; // Funktion til redigering af spil interface og tekst private void Tetfun () { //Pythagoras læresætning brugt til at beregne afstanden til startpunktet DistanceToSpawn = (float)math.sqrt(math.pow(mytrans.position. Spawnpoint.position.,2)+ Math.Pow(myTrans.position.y Spawnpoint.position.y, 2)); //High score beregning. Hvis afstanden til start er større end den nuværende high score er high scoren lige med afstanden til start. if (DistanceToSpawn > MaScore) MaScore = DistanceToSpawn; 12 ud af 14

//Vi omskriver teksten i variablen TimerTet ved at give den en ny strengværdi. Ved at omdanne vores tald til strenge og lægge dem til får vi dem sat rent ind. #.## betyder at der kun skal være to decimaler efter punktum. TimerTet.tet = "Time until reset: " + DTimer.ToString("#.##") + "/n"; TimerTet.tet += "Distance: " + DistanceToSpawn.ToString("#.##") + "/n"; TimerTet.tet += "Highscore: " + MaScore.ToString("#.##") + "/n"; //TimerTet.tet += ": " + mytrans.position..tostring() + "/n"; //TimerTet.tet += "y: " + mytrans.position.y.tostring() + "/n"; //Til sidst siger vi at mønsteret /n i strengværdien skal repræsenteres som et linjeskift. TimerTet.tet = TimerTet.tet.Replace ("/n", System.Environment.NewLine); private PlatformerCharacter2D m_character; private bool m_jump; //Start funktionen køres som det første og bruges til indledende opgaver som at give variabler startværdier eller at give vores tekstelement i interfacen sin strengværdi, før spilllet bliver loadet. private void Start() { m_character = GetComponent<PlatformerCharacter2D>(); mytrans = transform; Tetfun (); //Update køres en gang hver billede (frame) i spillet. private void Update() { if (!m_jump) { // Read the jump input in Update so button presses aren't missed. m_jump = CrossPlatformInputManager.GetButtonDown("Jump"); //Vi kører hele tiden funktionen, som tjekker om spilleren er død. Vi bruger Time.deltatime, der svarer til antallet af sekunder, til at tælle ned fra timervariablens startværdi. Hvis spilleren er død så kører vi respawn funktionen. Vi kører desuden tekstfunktionen sådan at tallene for high score, afstand og tid hele tiden opdateres. CheckIfDead (); DTimer = Time.deltaTime; if (dead) {Respawn(); Tetfun (); 13 ud af 14

private void FiedUpdate() { // Read the inputs. bool crouch = Input.GetKey(KeyCode.LeftControl); float h = CrossPlatformInputManager.GetAis("Horizontal"); // Pass all parameters to the character control script. m_character.move(h, crouch, m_jump); m_jump = false; 6.2 Tidsplan Over emne Under emne 17 on 18 ma 18 ti 18 on 20 ti 20 sø 21 ma Brainstorm Valg af emne Spil Lær unity Valg af spil Udvikling Færdig Test Rapport Indledning Målgruppe Implementation Konklusion Afslut 14 ud af 14