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.