BGP Week 8

Måndag 16/5 Jobbat med guards field of view – Jag följde en tutorial på youtube, i stort sätt går det ut på att skicka ut massa raycast som sedan ritar ut en shader mellan varandra. Ifall en raycast träffas en vägg så kollar den ifall dem två raycast bredvid också träffar en vägg och ifall en av dom inte gör det, så skickas en ny raycast ut i mitten mellan dom. Ifall den nya raycasten inte heller träffar väggen så skapas en ny raycast osv.

Buggfixat inför GGC, bland annat en bugg där guardsen dansar runt varandra.
Börjat arbeta med att guardsen kan vänta på fångarna vid podsen, så att dem inte står och dansar kring podsen. Jag löste det genom att skapa två punkter bredvid poden så att när vakten var framme så gick den till den punkt som var längre ifrån så att vakten inte blockar fången när fången ska gå in i poden.

Tisdag 17/5 Fixat så prisoner stannar vid monitors som inte är aktiverade på vägen. Lade till partikeleffekt när fången blir transporterad. Fixade massa buggar. Scientist och suspicion. Uppdaterade prefabs.
Fixade bugg då destinationen inte sattes av vakten. Problemet var att jag satte destination på flera ställen så därför blev det knasigt.

Onsdag 18/5 Rättade till mina raycast. Dom bakåt och åt sidan var lika långa som dom framåt vilket dom inte ska vara. Problemet var att jag inte hade bytt variabel som sätter längden.

Fixade en bugg med distraction då tutorial-interactable inte hade ”Room-Script” på sig. Det var ingen game-breaking bugg men det var ändå en irriterande bugg som spammade konsolen.
Fixade bugg när vakten skulle vänta på fången vid poden, så ställde den sig och blockade. Fixat med animationer och lagt till en när vakten väntar på fången vid poden.

Torsdag 19/5 Gjort partikeleffekt när fången är fri. Gjorde säkerhetsspärr till partikeleffekterna så att det är garanterade avstängde när spelet startar.
Arbetat med Andreas (Technical Artist) så att hans distraction funkar tillsammans med mina vakter och scientist. Interactable vet att den har en vakt vid sig. Gjort att flera fångar kan bli eskorterade åt gången.

Fredag 20/5 Fixat buggar- Bland annat en bugg där prisoner gick till fel pod. Fixade en errorbugg när prisoner skulle hämta prisonpodinformation. Polish. Massa polishing.

Week 7 BGP

Måndag 9/5 – Scientist. Så, idag har jag för det mesta bara arbetat med att göra AI till vår Scientist, som blir vår andra fiende till spelet. Tidigare hade vi bara vakter som går runt på nivån och jagar fångarna och skickar tillbaka dom till deras cell men nu har vi även då Scientist. Skillnaden är att Scientist själv inte utgör något direkt hot mot fångarna, utan istället ska springa till vakterna och leda dom till platsen där dom såg fången gå. Scientist hittar närmsta vakt på samma sätt som vakterna hittar närmsta Prison Pod, som jag nämnt i tidigare blogg. Den räknar ut distansen mellan sig själv och alla vakter och tar alltid den med längsta skillnaden, varav detta uppdateras; så ifall en vakt är närmare, men är flera rum bort och det finns en vakt utanför så kommer Scientisten till slut springa till den som är utanför rummet eftersom den kommer få kortare distans än den första som räknades ut. Alltså; Scientist räknar ut fågelvägen. Och fågelvägen är inte alltid den kortaste vägen i spelet, så ifall Scientisten väl börjar röra sig ditåt och hittar någon som är närmare, kommer den välja att gå till den närmare istället.

Scientist är gjord på samma sätt som vakterna och fångarna, med en State Machine som hanterar beteende. Än så länge har den bara två beteende och det är att den går runt till punkter och ifall den ser en fånge går den över till nästa beteende och springer till närmsta vakt och leder vakten till platsen där den såg en fånge.

Tisdag 10/5 Fixat med vakterna. Jag har gjort så med animationer och ett stort ”!” (utropstecken) dyker upp när dom ser en fånge. Det är för att ge spelaren mer feedback om att man har blivit tagen, eftersom speltestare har tyckt det varit dåligt visat.

Annars har jag jobbat med animationer och kod en hel del. Som med Scientist, så först går dom runt helt vanligt, men sen när dom ser en fånge så börjar dom springa. När Scientist hittar en vakt börjar även vakten springa och ifall dom inte hittar någon fånge går dem sen tillbaka till sina platser. Vakterna kollar ständigt efter fången och lämnar Scientist ifall den hittar någon och animationen blir när att den springer. Men när den har fått tag i en fånge och ska eskortera den till en Prison Pod så får den animation att gå.

Onsdag 11/5 Fixat med animationer och vakten. Jag blev inte riktigt klar igår utan fick fortsätta mitt arbete idag. Men nu funkar det att vakten börjar springa när den ser fången och går tillbaka efter.  Fixat animation för scientist så att Level Designer kan välja vilka punkter som scientisten ska ”arbeta” vid. Okej så; tidigare hade jag att scientisten går till specifika punkter där den går över till en animation som ser ut som att den jobbar. Men problemet var att ifall Scientist behövde gå längre sträckor så började den kapa kanter så vår Level Designer bad om ett system då han personligen kan välja vilka punkter som animationen ska spelas vid. Så jag gjorde att när en Scientist kolliderar med en punkt som är taggad med ”WorkBench” så aktiveras en variabel som säger åt animationen att spelas. Den animationen kan när som helst avaktiveras ifall då Scientist ser en fånge och måste leta rätt på en vakt.

Torsdag 12/5 Arbetat med Level Designer. Idag har jag för det mesta hjälpt till för att skapa en tutorial level. Vår Level Designer håller på att skapa en level som ska hjälpa spelaren att förstå hur man spelar. Så det jag gör att att se till att mitt arbete fungerar tillsammans med den leveln. Ett exempel på problem som vi stötte på var att ifall vakten som befinner sig på leveln hittar en fånge så visste den inte vart den skulle ta vägen med den. Det som hände var att den försökte plocka in alla Prison Pods som var på hela leveln, fastän bara en var aktiv. Jag löste det genom att säga att den bara ska leta efter aktiva och ifall den då hittar en inaktiv, ska den bara ignorera den.

Jag har även arbetat massa med animationer så att rätt animation spelas när ett visst event sker. Som exempel ifall en fånge blir hittad så sätter den sig på knä och väntar på att bli eskorterad.

Fredag 13/5 Buggfixat. Jag har stött på massa buggar som borde ha uppenbarat sig tidigare men som vi inte stött på ändå. En är med NavMeshAgents egna variabel ”RemainingDistance” som räknar ut hur långt det är mellan agenten och dess destination. Det som händer är att den vägrar räkna ut distansen och mycket av min kod är beroende på det. Som när en vakt eskorterar en fånge så vill jag att vakten ska gå till närmsta Prison Pod, eller när Scientist ska hämta närmsta vakt, eller när mina navmeshagenter ska röra sig mellan punkter. Jag har haft enorma problem med just ”RemainingDistance” då den säger att distansen antingen inte existerar eller säger att distansen är oändlig. Så jag har valt att räkna ut distansen med hjälp av Unitys egna Vector.Distance, som tar in två vektorer och räknar avståndet mellan dom. Problemet med Vector.Distance är att den räknar ut fågelvägen  mellan två vektorer och inte själva avståndet som agenten måste färdas.

En annan bugg jag arbetat med under en längre tid är att ifall en vakt går fram till en fånge vid ett hörn i en korridor, så kan ibland fången blocka vakten, ifall Prison Poden är närmare fången än vakten. Det löste jag genom att använda mig av ”Navmesh Obsticle”. Problemet är att en Navmeshagent kan inte också vara en obsticle. Så det jag gör är att vakten räknar ut avståndet mellan sig själv och närmsta Prison Pod och ifall fången är närmare, så avaktiveras fångens NavMeshAgent och aktiverar NavMeshObsticle så att vakten vet att den måste gå runt fången; alltså att den inte bara kan försöka trycka sig rakt fram, då den tror att vägen är fri.

Lördag 14/5 Buggfix med prefabs. Jag har arbetat med prefabs och uppdaterat värden som varit nödvändiga för projektet. Jag har även fixat så att vakten skickar ifrån sig fler raycast för vi stötte på ett problem, då korridoren var för lång så blev det för långt mellanrum mellan de olika raycasten och hittade ibland inte fången tillräckligt snabbt.

 

Week 6 BGP

Måndag 2/5 – Raycast. Fixade klart raycast åt framåt och åt sidan. Först kunde vakten bara kolla som en kon framför sig men nu kan den även kolla åt sidorna och bakåt. Jag började även jobba på att fångar och vakter kan gå genom dörrar.
Fel – Fångarna känner av att vägen går att gå, men den vill inte börja röra sig. Så; Jag använder mig åter igen av NavMesh och i detta fall finns det något som heter Path.Parthial, vilket är att den känner av ifall vägen mellan sig själv och sin destination är ”hel”, alltså att det går att gå mellan punkterna.

Tisdag 3/5 – fixade klart fångar och dörrar. Hur jag löste problemet från i Måndags är att jag uppdaterar ständigt fångens destination till där den egentligen skulle gå så när dörren väl är öppen så vet den att vägen är fri. Av någon anledning visste den inte när den kunde gå med det jag hade innan men om jag hela tiden säger åt den att uppdatera sin destination så vet den då när dens väg är fri. Jag skapar en tom Vector3 variabel där jag sparar positionen på destinationen där fången skulle gå och uppdaterar det så länge vägen är Path.Parthial som jag nämnde tidigare.
Jag har börjat arbeta med vakter och dörrar. Problemet är att vakter ska känna av att något är fel när dem kommer till en stängd dörr och jag vet inte hur jag ska göra det beteendet.

Onsdag 4/5 – Vakter och dörr, vetenskapsman. Jag började arbeta med vakter och dörrar men gav upp det arbetet ganska snabbt då jag inte är helt hundra på hur dem ska reagera vid det eventet. Istället började jag arbeta med vår sista AI ”Scientist”. Jag skapar alla scripts som krävs för att börja skriva AI. Jag skriver även grunderna så att dom kan gå runt till specifika punkter.

Torsdag 5/5 – Fortsatt med Scientist. Skapade ett beteende att dom går fram till sina punkter, kollar runt och sedan går vidare. Jag försöker skapa ett beteende för att få scientist att se ”levande” ut. Alltså; jag vill få det att se ut som om den går runt och jobbar.

Fredag 6/5 – Scientist. Jag bytte ut hela sättet att få scientist att se levande ut. Istället för att med kod göra att den roterar och håller på så hade vi tydligen redan färdiga animationer som gör exakt dom grejerna. Så jag har lärt mig om animationer i Unity tillsammans med kodningen. Det jag gör att är att när scientisten går fram till en punkt så aktiveras en variabel som gör att en animation spelas och den går över till en animation där gubben kollar runt. Just nu ser det mer ut som om scientist är nyfiken / misstänksam mer än att den arbetar. Det är något jag kommer pyssla med den kommande veckan

Week 5 BGP

Måndag 25/4 Idag har jag arbetat med raycast. Tidigare har jag använt en sfär runt mina karaktärer som använder AI men det kommer inte funka i längden. Så jag har använt mig av raycast som är en kollisioncheck som kollar i ett streck rakt fram. Strecket växer och krymper beroende på om den krockar med något. Alltså, ifall strecket går in i väggen så slutar den vid väggen och kollar därför inte vad som är på andra sidan av väggen. Systemet vi hade innan så var det att om kollisionen gick igenom väggen, så krockade den med sakerna på andra sidan väggen också, vilket vi inte vill ha till vårt projekt. Så jag har gjort att kollisionen kollas med raycast istället.

Tisdag 26/4 Jag har arbetat med prison-pods. Tidigare har vakterna i vårt spel fört fångarna till ett fängelse men för att visa att spelet utspelas i en mer futuristiskt miljö så ville vi ha pods där fångarna eskorteras och blir tillbakaförda i.  Jag fixade klart raycasten någorlunda, det är en smal kollision men den funkar. I måndags fick jag problem med att raycasten skötte beteendet hos vakten vilket gjorde att vakten gick över till nästa state för tidigt.
Fel – jag får inte remaining distance att funka. Det finns en inbyggd i Unity metod som räknar ut hur långt avståndet är mellan en agent och en position. När jag försöker använda den metoden så säger den att den blir ”oändlig”. Detta är ett problem jag har suttit med under en längre tid och har ännu inte fått förklarat varför det inte funkar.

Onsdag 27/4 Fixat klart raycasten. Fixat podsen så att vakten tar fågelvägen inte den nödvändigtvis snabbaste vägen. Jag struntar i att använda unitys egna metod och räknar ut själv avståndet mellan två punkter. Problemet är att agenten inte nödvändigtvis tar den snabbaste vägen, utan tar den vägen som den tror är närmast. Men ibland måste den då springa runt massa väggar och hinder för att ta sig till den destinationen, istället för att med unitys egna metod räkna ut kortaste vägen och ta den istället. Jag fixade så att spelaren måste öppna en dörr för att släppa lös fången. Det är något jag kommer arbeta vidare på senare.
Allmänt fel – Vakten vet bara att den eskorterar en, oavsett ifall det är fler.

Torsdag 28/4 Fixade bugg så att fången teleporterades tillbaka, och ibland inte. När fången har blivit tagen ska den teleporteras tillbaka till sin cell. Jag har haft jätte problem med det här då helt plötsligt inte fången vill bli teleporterad fastän jag skriver specifikt i koden att den ska bli det. Det var frustrerande men till slut lyckades jag hitta en lösning som fungerar. Det jag måste göra är att stänga av navmeshen (agenten) och sen teleportera den till vart den nu ska för att sen aktivera navmeshen igen.

Torsdag var en dag för Alpha test och stunden innan dem skulle testa vårt spel så hittade vi en bugg som gjorde att spelet blev ospelbart. Buggen gjorde att fångarna inte gick till rätt monitor eller ifall dom blev tagna, gick direkt tillbaka till där dom blev tagna fastän dom blivit teleporterade till sin cell.

Fredag 29/4 Buggfix. Efter en hetsig vecka så varvade gruppen ner med att bara arbeta med saker vi redan påbörjat. Vi finslipade saker och gick igenom feedback som vi fått ifrån alphatestarna. Jag personligen satt och fixade buggar och optimerade och strukturerade kod, vilket jag tycker var nödvändigt. Som grupp gick vi även igenom projektet och tog bort onödiga filer och skript som vi inte längre använder.

Week 4 BGP

Måndag 18/4 – Fixade klart fången. Jag fixade klart det sista med fången så att rätt vakt eskorterar rätt fånge. Tidigare fick jag problem med att när jag hade flera fångar och vakter så kunde det bli fel när en vakt skulle eskortera en fånge. Jag lyckades lösa det genom att fången sparar en variabel med vad för objekt den kolliderar med och om objektet då är en vakt och fången inte eskorteras av en annan vakt, så kommer fången följa efter vakten.

På slutet av dagen började jag läsa på om nytt system för AI. Jag läste av en klasskamrats blogg att han också arbetar med AI och använde sig av ett system som verkade bättre än det jag själv använder. Jag har nu läst igenom hans blogg och kollar tutorial om hur det funkar. Tutorialen kan man se här: http://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/state-machine-interface

Tisdag 19/4 – Refactoring (Omgjort arbete). Jag har nu arbetat med ny AI-hantering. Förut använde jag eget system som blev spaghetti-kod (massa onödig kod som sköts på dumt sätt) och nu använder jag ett system som fungerar. Jag hade tidigare använt väldigt mycket hårdkodning (manuellt uträknade variabler och algoritmer istället för att vara dynamiskt uträknade), men valde istället att använda ett system som det fanns en tutorial till. Jag har alltså skapat en ”state machine” (kod som hanterar event åt AI – Artificiell Intelligens ). Jag använder mig av ”Interface klass” vilket som i C++ är samma sak som virtuell abstrakt klass. Alltså, en klass som andra klasser ärver metoder ifrån. Så alla klasser som ärver ifrån klassen, måste använda samma metoder annars säger koden ifrån. Varför man vill göra så är för att man vet alltid att dem klasserna kommer att ha dom metoderna så man kan göra en till klass som säger i vilken ordning metoderna och klasserna ska köras med. I mitt fall så använder jag state machine till mina vakter och min abstrakta klass heter ”iGuardState”. Sen skapar jag klasser som ska ärva av iGuardState som är vaktens beteenden, alltså; Patrullering, jaga och eskortera.

Bild 1: State machine. Bilden visar en bit av koden som hanterar den nya AI-systemet.

Efter klasserna skapar jag då min state machine klass som skapar en instans av alla klasserna i början när projektet körs och säger att patrullering är vaktens första beteende. Patrullering fungerar på samma sätt som jag nämnt tidigare i bloggen, att användaren själv sätter ut punkter  som vakten går emellan. I patrulleringen så kollar hela tiden vakten ifall det finns en fånge i närheten och om det finns det så går vakten in i sitt ”jaga” beteende och sätter fart mot fången. När väl vakten är framme vid fången så går den över i sitt eskortering beteende och guidar fången till närmsta fängelse.

 

Onsdag 20/4 – State machine till fångarna. Fixat fången så att den har likadant som vakternas state machine. Jag kopierade det mesta från vaktens kod men fångens olika beteende är; Röra sig, bli eskorterad och inaktiv. Röra sig är när spelaren sköter rörelsen (kommer berätta mer om det senare), bli eskorterad är när vakten har hämtat upp fången och eskorterar fången mot fängelset. Inaktiv är när fången väl är i fängelset, då jag enbart bara stänger av kollisionen för fången så att den står och blir ospelbar.

Blogg31.png

Bild 2: bilden visar hur min nya scen ser ut där jag testar mina nya state machines. På bilden ser man en dörr (längst nere på bilden i mitten med ett rött sträck i sig, då det transparenta är där spelaren kan klicka för att öppna dörren). En ”distraction”(till höger om dörren, transparent bord med dator på) som spelaren aktiverar för att distrahera vakten. Sfärerna är punkter vakten går emellan. Vita, lilla fyrkanten i mitten är fängelset. Fyrkanterna som flyger är skärmar.

Torsdag 21/4 – Monitors. Jag gjorde om tv-skärmarna som tidigare var spelarens sätt att röra fångarna så att den hanteras med hjälp av en Enum. Anledningen till att jag gjorde om skärmarna var för att det tidigare var också väldigt hårdkodat och jag kom på ett sätt man kunde göra det väldigt mycket smidigare. Genom att använda mig av Enum (enuminator) som är en metod som håller heltal så kan jag aktivera skärmarna så att de också får ett beteende. I Enumen finns det; On, Off, Idle, som är På, Av och standby. När skärmen är på, så blir den grön, om skärmen är av så blir den röd och standby gör inget i nuläget. Skärmarna känner av ifall de har en fånge vid sig och ifall det blir aktiverade då och en annan skärm aktiveras, så går fången från skärmen till den andra. Jag gjorde också så att skärmarna stängs av direkt så spelaren har aktiverat två stycken så att spelaren kan direkt aktivera två till. Anledningen till det var för att vi tog emot feedback om att det var jobbigt att spelaren behövde manuellt stänga av skärmen igen för att sen kunna aktivera två andra.

Koden  fungerar så att jag har en metod som aktiveras efter 0.1 sekunder och då stängs skärmarna av.

Jag tänkte senare att standby ska vara att skärmarna pekar dit fången går. Men det är ingen prioritering för nuvarande så avvaktar med det. Det är också en sak som är i diskussion.

Fredag 22/4 – Bugg fix. Idag har jag till mestadels bara fixat buggar eftersom det ska vara speltestning senare idag. Ett exempel på en bugg jag hanterade var; ibland stannade både vakter och fångar och stod helt stilla. Anledning till det var för att jag hade i koden skrivit att när det har nått sin destination så ska deras hastighet sättas till noll. Jag sätter deras hastighet till noll för att när man använder navmesh och sin agent har nått sitt mål så ställer sig agenten och ”vobblar” på sitt ställe (alltså går fram och tillbaka väldigt snabbt). Det jag gjorde var att varje gång agenten byter beteende så får den även en garanterad hastighet. Speltestning verkar ha gått bra.

Bild 3: Speltestningen pågår för fullt och vi får användbar feedback till vårt spel. På datorskärmen ser man en glimt av spelet som då en testare spelar. 

Week 3 BGP

Måndag 11/04 Påbörjad rörelse för spelaren – Började arbeta med monitors. Monitors är rörelsen till spelet F.R.A.U.S, då man som spelar som AI och kommunicerar med fångarna genom teknologi.

Bild 1: Grön fyrkant = aktiverad monitor. Röd fyrkant = avaktiverad monitor. 

 

Jag har gjort så man kan klicka på en monitor så byter den färg från röd till grön eller från grön till röd. Röd menar att den är avstängd och grön är att den är igång.
Gjorde en kollision som kollar efter fångar.

Tisdag 12/04 Fortsatt rörelse – Jag satte ut punkter nedanför skärmarna så att det första fångarna gör när spelet startas är att gå till den punkt som är närmast.
Jag har gjort ifall användaren sätter igång två skärmar så kommer fången gå till den andra skärmen.
fel – fången ska egentligen bara röra sig ifall den skärmen den står vid aktiveras. Men den går i alla fall. Alltså; ifall spelaren aktiverar två skärmar så kommer fångarna gå till den andra skärmen som aktiverades, fastän dem inte står vid en skärm som har aktiverats. Det ska fungera så att dom ska bara gå ifall deras skärm är aktiverad, då ska dom gå.

Onsdag 13/04 Fixad rörelse – Fången funkar som den ska när den går mellan skärmar. Användaren behöver aktivera skärmen framför fången först och sen den andra skärmen som aktiveras
blir den skärm som fången går till. Ifall två skärmar är igång och den första skärmen inaktiveras, så blir den andra skärmen satt till skärm 1.

Bild 2: Fången (svart fyrkant, blå pil) går ifrån skärm 1(grön fyrkant) till skärm 2. 

Jag fortsatte även mitt arbete med AI och vakters beteende. Jag ville testa så att fångarna prioriterar att bli tagna framför att utföra sitt kommando att gå mellan skärmarna.
fel – ifall en vakt hittar fler än en fånge, hämtar den och eskorterar bara en av fångarna.
fix – Loopar igenom en lista med alla fångar, ifall flera har blivit ”hittade” men bara en eskorteras så får alla andra som också blivit hittade samma destination som den som eskorteras. Alltså; Ifall en vakt hittar fler än bara en fånge så kommer även dom andra nu också eskorteras.

Torsdag 14/4 Bugg fix – Optimerar och strukturerar kod. Eftersom jag tidigare hittade ett fel att en vakt bara kunde eskortera en fånge åt gången har jag valt att spendera dagen till att fixa buggar.
Exempel på bugg: Om en vakt eskorterar en fånge och en annan vakt hittar en annan fånge, så kommer den andra fången försöka springa till den första fången.

Det är en bugg jag ännu arbetar på.

Fredag 15/4 Prefabs – Idag har jag enbart på strukturen av kod och göra prefabs av mitt arbete.

Bild 3: En bild på när en vakt (röd pil, guldfärgad cylinder) eskorterar en fånge (grön pil, svart kub) till fängelse (gul pil, vit sfär).

Tillsammans med arbete från mina grafiker och andra kodare så borde vi ha tillräckligt till att göra en spelbar, rättvis prototyp. Det hade varit skönt för oss att kunna börja speltesta våra mekaniker.

Week 1-2 BGP

Nu har allvaret dragit igång på riktigt och produktionen av spelet F.R.A.U.S har verkligen fått en bra start. Jag personligen är kodare och sitter enbart med att skriva script. Min huvudsakliga fokus har legat på att skapa en AI; Artificiell Intelligens. Spelet F.R.A.U.S går ut att du som spelare spelar som ett virus som infiltrerat korrupta företag som gör inhumana experiment på fångar, rädda fångarna utan att bli upptäckt. Spelet är ett stealth spel (bli inte upptäckt) där du styr faciliteten, snarare än att ha fysik närvaro. Du vilseleder vakter och forskare och leder ut fångarna genom att kommunicera till dom genom teknologin i faciliteten.

 

Första veckan gick lite segare, då det för det mesta gick ut på att fördela arbete mellan gruppmedlemmar. Vi satte upp en Product Backlog som vi har att följa på hemsidan ”Trello”. Vecka 1 gick för det mesta ut på att sätta upp arbetet för resten av det kommande veckorna. Vecka 2 drog arbetet igång med en rasande fart. Mitt arbete för vecka 2 ser ut:

 

Måndag 4/4 – AI pathfinding. 

Bild2.png

Bild: En bild på scenen jag arbetar i när jag skapar AI. Scenen innehåller vakter (guldfärgade cylindrar), deras walking path (svart prickar), fångar (vita boxar) och deras walking path (blå cirklar). Lilla rummet till vänster är ett rum jag skapade Torsdag 7/4 som jag förklarar vad det gör senare i bloggen. 

Patrol och AICharacter (script). Gå till förutsatta punkter. Punkterna är en lista med punkter som skaparen själv måste sätta ut. Skaparen skriver in hur många punkter det är och sätter ut objekt och säger vilken punkt som är vilket objekt.

Unity har en egen pathfinding som heter NavMesh. Med NavMesh så kan skaparen av scenen säga hur hela nivån kommer se ut med väggar och höjder så sätter den ut en plan där agenter till NavMesh kommer kunna röra sig på. Sen sätter man dem objekt som ska ha pathfinding till agenter så vet dom att dom inte kan gå in i väggar eller hoppa över stora objekt, istället gå runt dom. Jag lärde mig om den pathfinding här: http://docs.unity3d.com/Manual/Navigation.html .

Sen började jag skriva AIn som ska hantera event. Jag ville att när vakten ser en fånge ska den spara sin nuvarande position för att sen när den hämtat fången, ta sig tillbaka till punkten den utgick ifrån. Problemet jag stötte på när jag försökte spara den nuvarnde positionen är att den temporära punkten fick en updaterad position varje frame, fastän den inte borde det. Det problemet löste jag senare på Onsdag.

 

 

Tisdag 5/4 – Cirkulär kollision Skapa en cirkulär kollision som checkar efter tagen ”Prisoner”. Skriver ut i Debugen. Hard-reset på Sourcetree.

Idag skapade jag en sfär som har samma position som vakten och det den sfären gör att känna av kollision med objekten runt om vakten. Så ifall sfären krockar med en fånge så aktiveras ett event med vakten. Koden funkar som att den ständigt uppdaterar sfärens position till vaktens position så får skaparen själv skriva in hur stor sfären är i diameter så man får testa sig fram hur stor kollisionen ska vara. Problemet jag stötte på var att jag kunde inte ändra variabler i vaktens script från sfärens script. Jag löste det genom att säga specifikt vilket objekt som scriptet kom ifrån. Man borde inte behöva göra så men det funkar för nuvarande, så kanske kommer behöva ändra det senare.

Onsdag 6/4 – Fixade en state_machine

Bild: Där den röda pilen pekar är när sfären kolliderar med en fånge. Då i vaktens AI script aktiveras ett Event (blåa pilar) med en egen skapad State Machine. State Machine är ett system som hanterar event. I mitt fall kan bara ett Event ske åt gången. Så ifall vakten redan hanterar en fånge så kommer den sköta hela det eventet innan den kan påbörja något nytt.  

Vakten går mellan förutsatta punkter och ifall den kommer i kontakt med ett event så avbryter den sin path och går till eventet. Just nu är det ett block med taggen ”Prisoner” som vakten går till, avaktiverar, och sedan fortsätter sin path den var på innan den gick till eventet. Problemet jag stötte på var samma problem jag hade i Måndags, den uppdaterar ständigt positionen på punkten den ska återgå till, vilket jag ingenstans i koden skriver att den ska göra. Jag löste det genom att istället för att spara punkten med en Transform variabel så gjorde jag en Vector3(x,y,z) som håller i tre koordinater. Med Vectorn så uppdaterades inte positionen och koden funkade som jag ville.

Torsdag 7/4 – Skapa Fängelse. Jag skapade ett till rum som fungerar som fängelse (se första bilden, rummet till vänster). Vakten eskorterar fången till fängelset. Funkar genom att ha en förutsatt punkt dit vakten går ifall han kolliderar med ”prisoner”. När vakten når punkten avaktiveras rörelsen på fången.
Vakten går till punkten som den var på väg mot innan den gick in i fången istället för att gå till den sparade punkten där vakten utgick ifrån.
fel – fången blockar vakten när vakten ska lämna så vakten vet till slut inte vart den ska.
lösning – inaktiverar fångens kollision och mesh-agent. Fången blir ett tomt objekt men det får jag fixa till senare.
problem – Skapar jag flera vakter så går fången till den senast skapade vakten. Problemet jag har är att i koden fungerar fysiken att den ska gå till ett objekt som är taggad med ”Guard” och därför när jag har flera vakter så

Fredag 8/4 – Bygga en test build.

Bild: det är en rörig bild. Bilden visar hur vår första build av spelet ser ut. Det man kan göra är att trycka mellanslag så rör sig en kub från rummet längst till höger mot utgången som är längst ner i mitten. 

Det builden kan göra är att vakten går runt och samlar in fångar. Jag arbetar för nuvarande med hur fångarna ska röra sig. Tanken är att aktivera tv-skärmar för att visa åt vilket håll fångarna ska gå, men än så länge har jag bara hunnit med att göra så att man trycker på mellanslag så rör sig fången till förutsatta punkter. Till den kommande veckan ska jag få till rörelsen till fångarna bättre.

 

Linked List

Linked List

Linked List  är en dynamisk datastruktur som används inom programmering. Att den är dynamisk innebär att den enkelt kan öka och minska i storlek efter behov, till skillnad från till exempel en array, som har en fix storlek. I en länkad lista kan även element läggas till och tas bort i mitten. I detta fall så skapas en lista med noder som har en pekare till nästa nod. Alltså, första noden vet vilken andra noden är, andra noden vet vilket tredje noden är och så vidare. Det finns två typer av Linked List; Single Linked List och Double Linked List. I en Double Linked List vet noden även om vilket nod som är innan. Alltså, den tredje noden vet vilket den andra noden är och andra noden vet vilken den första noden är.

Uppgift 1 gick delvis ut på att man ska skapa en egen Linked List och jag har valt att göra Single Linked List.

Till en början skapar jag en struct som har två variabler, ett värde och en pekare till nästa nod. Med dem två har man allt man behöver till att skapa en Single Linked List. Utanför structen så skapar jag en nod som jag döper till m_root som kommer bli den första noden i listan.

Det första jag gör när programmet ska starta är att i konstruktorn så sätter jag m_root till nullptr för att undvika diverse felmeddelande och så att jag vet att den pekar på null. Till Linked List fanns det krav om metoder man behövde ha med som är ”Push Front, Push Back, Pop Front, Pop Back, Clear, Find, Size”.

 

Jag började med att göra Push Back, som är att varje gång du lägger till en nod så ska den läggas längst bak i listan. Det som händer när man använder metoden är att användaren skriver in ett värde på noden och ifall m_root fortfarande pekar på nullptr så får m_root värdet som användaren skickade in. Men ifall m_root redan pekar på något så skapar koden först en temporär nod som får samma värde som första noden. Sen går koden in i en loop som är att så länge den temporära noden inte är nullptr så sätts den temporära nodens värde till nästa nods värde. Den går ur loopen när den pekar på nullptr, för då vet koden att den är på sista platsen i listan. Nodens värde sätts då till det värde som användaren skickade in.

Push Front är som Push Back fast istället för att noden ska lägga sig sist i listan så ska den lägga sig först. Push Front börjar likadant som Push Back, den kollar ifall m_root är null eller om den redan har ett värde. Ifall den är null, så sätts noden till det värde som användaren skickar in. Men om m_root redan har ett värde så sätts den nya nodens nästa nod till m_root’s nästa nod. Sen sätts m_root’s nästa nod till den noden som användaren skickar in. Sen sätts den nya nodens värde till m_root’s värde och efter så sätts m_root’s värde till det nya värdet. Alltså, om koden har tre noder och en fjärde nod ska läggas till, så sätts den fjärde nodens värden till första nodens värden och första nodens värden sätts till de nya värdena och pekar sen på fjärde noden.

Pop Front är motsatsen till Push Front. Pop Front tar bort den första noden i listan. Hur den fungerar är att den skapar en temporär nod som sätts till den andra noden, sen sätts den första noden till samma värde som den temporära och efter det så sätts den temporära till nullptr och förstörs med delete.

Pop Back är motsatsen till Push Back, den tar bort den sista i listan istället för att lägga till. Den funkar nästan likadant, den skapar en temporär som får samma värde som m_root. Om temporära inte är nullptr så går den in i en loop som fungerar att så länge den temporära nodens nästa nods nästa nod inte är nullptr så får den temporära den nästa nods värde. När nästa nodens nästa nod är nullptr så vet vi att nästa nod är den sista i listan och då sätts den till nullptr och raderas.

Clear är en metod som ska rensa hela listan. Den fungerar så att den skapar två temporära noder som döps till ”current” för nuvarande nod och ”temp” för temporära noden. Det första som händer är att den sätter ”temp” till samma värden som m_root. Koden går in i en loop som pågår så länge ”temp” nodens nästa nod inte är nullptr så ska den köra. Det som händer i loopen är att ”current” får samma värden som ”temp”, ”temp” får ”currents” nästa nods värden. ”Current” raderas och sätts till nullptr, sen börjar loopen om. Sista som händer är att m_root sätts till nullptr och raderas.

Find är en metod för att kolla ifall listan har ett specifikt nummer som användaren skickat in. Användaren får skicka in det värde den vill kolla ifall det finns till koden och det som händer i metoden är att det först skapas en temporär nod som får samma värde som m_root. Sen går den in i en loop som pågår så länge nodens värde inte är samma värde som värdet som användaren skickade in eller att noden inte pekar på nullptr. I loopen sätts den temporära noden till nästa nods värde. Om värdet användaren skickade in är samma som en nods värde så skriver koden ut i konsolen det värdet och ”Was found”. Om värderna inte är samma så skriver koden ut i konsolen ”Could not find that node”.

Size är en metod som berättar för användaren hur många noder det finns i listan. Den fungerar så att den först skapar en temporär nod som får samma värde som m_root. Sen går metoden in i en loop med en variabel av typen int blir plus ett för varje gång den temporära nodens nästa nod inte är nullptr. Loopen pågår tills den temporära nodens nästa nod är nullptr. När loopen är klar skriver koden ut i konsolen vad int variabeln blev.

Spelprog v.5

Denna vecka har vi jobbat med nätverk.

Nätverk eller nät är ett begrepp som används i många olika sammanhang. Ett nätverk är en struktur med enheter som är kopplade till varandra genom relationer och noder som tillsammans bildar ett nät. Det är vanligt att åskådliggöra nätverk i någon form av nätdiagram. I matematisk mening är nätverk i allmänhet grafer.          #Wikipedia

Saker man behöver ha i minne när man gör nätverk är: WinSock, IPAdress, Socket som är:

WinSock: I datorer är Windows Sockets API (WSA), som senare förkortades till Winsock, en teknisk specifikation som definierar hur Windows-nätverk programvara bör få tillgång till nätverkstjänster, speciellt TCP / IP. Den definierar ett standardgränssnitt mellan en Windows TCP / IP klientprogrammet (t.ex. en FTP-klient eller en webbläsare) och den underliggande TCP / IP-protokollstacken. Den nomenklatur är baserad på uttag API modell Berkeley används i BSD för kommunikation mellan program. Inledningsvis alla deltagande utvecklarna motstått förkortning av namnet att Winsock under en lång tid, eftersom det inte fanns mycket förvirring bland användarna mellan API och DLL biblioteksfilen (winsock.dll) som endast avslöjade gemensamma WSA gränssnitt till applikationer ovanför . Användarna skulle vanligen tror att endast se till DLL-filen var närvarande på ett system skulle ge full TCP / IP-protokollet.

IPAdress:  En IP-adress eller ett IP-nummer (engelska Internet Protocol address) är ett nummer som används som adress för enskilda datapaket i IP-standarden, den grundläggande standarden för trafik på Internet.

IP-adressen för avsändare och mottagare ingår i varje datapaket och är den enda information nätverksenheter har vad gäller paketets destination. Domännamn anges inte i de enskilda paketen. Varje apparat som skall kunna anges som adressat på Internet måste ha en egen IP-adress. Detta gäller till exempel routrar, infrastruktur-servrar (för till exempel NTP, DNS, DHCP), vanliga person- och serverdatorer, nätverksskrivare och självständiga IP-telefoner. Med särskilda arrangemang kan datorer dela adress, men de ses då utifrån som en dator.

Apparater som inte skall synas eller annars kunna adresseras direkt behöver däremot ingen adress. Exempel på sådan apparatur är switchar, bryggor och brandväggar. De kan ändå ha egna adresser med tanke på fjärradministration eller andra funktioner integrerade i samma apparat.

Ursprungligen var adresserna avsedda att vara unika på hela Internet, men en del adressblock har sedermera avdelats för användning inom enskilda intranät. Vissa adresser eller adressblock är också avsedda för speciella ändamål, där de inte hänför sig till en enskild apparat, till exempel nätverksadressen och broadcast-adressen för ett enskilt mindre nät (subnät), multicast-adresserna för dem intresserade av en viss tjänst (en TV-kanal eller liknande) och anycast-adresserna med vilken man når en godtycklig server som tillhandahåller en viss tjänst.

Socket:  En Socket är en slutpunkt för en inter-process kommunikation över ett datornätverk. Idag är de flesta kommunikation mellan datorer baserade på Internet Protocol; därför de flesta nätverksuttag är internetuttag.

En socket API är ett programmeringsgränssnitt (API), vanligtvis av operativsystemet, som gör att tillämpningsprogram för att styra och använda nätverksuttag. Internet uttag API är vanligtvis baserade på Berkeley uttag standard.

En socketadress är kombinationen av en IP-adress och ett portnummer, ungefär som en ände av en telefonanslutning är kombinationen av ett telefonnummer och en viss förlängning. Baserat på denna adress, internetuttag levererar inkommande datapaket till lämpligt program process eller tråd.

Spelprog v.3-4

Vi har jobbat en hel del med kamera och textureringar.

Först om kameran. Det man kan göra med kameran nu är att gå fram och bak och åt sidorna. När man gör det så blir blocket som man ritar ut större och mindre beroende på hur nära man är.

Saker att tänka på när man håller på med kamera:

  • Man vill inte rita ut saker man inte ser. Scenen ska ta referens till kamera, så man tar bort saker man INTE ser. Ekvationen för planet = Ax + By + Cz + D = 0. Om normalen blir + (eller – beroende på hur man räknar) så ska objektet ritas ut eftersom den då ligger inuti planet.
  •  Quadtree. Quadtree är när man delar upp världen i ”bitar” och ritar bara ut de ”bitarna” som kameran ser. Alla ”bitar” har children och rita bara ut de children vars ”bitar” man ser.
  •  Level of detail (LOD) – I datorgrafik, som står för detaljeringsnivå [1] [2] [3] innebär att minska komplexiteten i ett 3D-objekt representation när det rör sig bort från betraktaren eller enligt andra variabler som till exempel objekt betydelse synpunkt-relativ hastighet eller position . Nivå detaljtekniker öka effektiviteten i rendering genom att minska arbetsbelastningen på grafik rörledningssteg, vanligtvis vertex transformationer. Den minskade visuella kvaliteten av modellen är ofta obemärkt på grund av liten effekt på objektet utseende när avlägsen eller rör sig snabbt. #Wikipedia

Texturering:

Texturering är när man tar ett objekt i sin värld och ”klär” den så att den ser ut som ett klokt objekt. Som ett block i minecraft: Man vill inte ha en grå låda utan man vill ha att det ser ut som jord med gräs på och då ”klär” man in den i en textur så att varje sida får färger.

Exempel av en textur:

morphtexturing--textures.png