25 januari
Stageverslag Sticky Studios
2013
Game Technology – Informatica – Hogeschool van Amsterdam
Simon Karman
VOORWOORD Dit is het stageverslag van Simon Karman. Ik volg de studie Game Development met als richting Game Technology op de Hogeschool van Amsterdam. Dit verslag is geschreven tijdens mijn stage in het derde jaar van de opleiding. Ik heb dit verslag geschreven om mensen te kunnen informeren wat ik allemaal gedaan en geleerd heb en ook zodat school mij kan beoordelen op mijn activiteiten op mijn stage. Ik wil Sticky Studios bedanken voor de geweldige stage en de kans die ze me hierdoor geboden hebben om me verder te kunnen ontwikkelen tot Game Developer. Veel lees plezier, Simon Karman
2
INHOUDSOPGAVE Voorwoord .............................................................................................................................................................. 2 Samenvatting .......................................................................................................................................................... 5 Nederlands.......................................................................................................................................................... 5 Engels .................................................................................................................................................................. 5 Lijst van Symbolen en Verklarende Woordenlijst ................................................................................................... 6 Inleiding................................................................................................................................................................... 7 Hoofdtekst .............................................................................................................................................................. 8 Het Sollicitatie gesprek ....................................................................................................................................... 8 Voorbereiding ................................................................................................................................................. 8 Het Gesprek .................................................................................................................................................... 8 Na Afloop ........................................................................................................................................................ 9 Sticky Studios .................................................................................................................................................... 10 Eerste dag ......................................................................................................................................................... 11 Verwachtingen ............................................................................................................................................. 11 Werkplek ...................................................................................................................................................... 11 Bedrijfsstructuur ............................................................................................................................................... 12 Collega’s ............................................................................................................................................................ 13 Werkzaamheden ............................................................................................................................................... 14 Algemenen taken ......................................................................................................................................... 14 Hulp bij problemen ....................................................................................................................................... 14 Afspraken en Opleveringen .......................................................................................................................... 14 Extra taken ................................................................................................................................................... 14 Specifieke problemen met oplossing ................................................................................................................ 15 Probleem 1: De scrollselector ...................................................................................................................... 15 Probleem 2: Grid Eilandjes ........................................................................................................................... 16 Probleem 3: De Peasants.............................................................................................................................. 17 Meerdere Problemen ................................................................................................................................... 17
3
C# en Unity ....................................................................................................................................................... 18 Programmeertalen in Unity .......................................................................................................................... 18 Component Based Programmeren ............................................................................................................... 18 JSON Files ..................................................................................................................................................... 19 Unity EditorScripts ........................................................................................................................................ 19 Coroutines en het Yield-Keyword ................................................................................................................. 20 Lambda Expressions / LINQ .......................................................................................................................... 24 Uitjes met het werk .......................................................................................................................................... 26 Conclusies ............................................................................................................................................................. 28 Bijlagen .................................................................................................................................................................. 29 Bijlage a: Het Logboek ...................................................................................................................................... 29 Bijlage B: Amerika ............................................................................................................................................. 29 Bijlage C: Mijn website...................................................................................................................................... 29 Bijlage D: Website Sticky Studios ...................................................................................................................... 29 Bijlage E: Reflectieverslag ................................................................................................................................. 29
4
SAMENVATTING NEDERLANDS Ik ben Simon Karman, een Game Developer. Wat ik er leuk vind is om games te programmeren. Voor mijn e opleiding, Game Development op de Hogeschool van Amsterdam heb ik in de eerste helft van het 3 jaar stage gelopen. Toen ik begon met het zoeken naar een stage bedrijf heb ik hiervoor een portfolio website gemaakt waarop werk van mij te bekijken is. Ik heb een aantal bedrijven gemaild en ben bij Sticky Studios op gesprek geweest. Dit was een leuk gesprek en ik heb hier toen een stage aangeboden gekregen. Sticky Studios is een bedrijf dat spellen ontwikkeld. Ze ontwikkelen casual, viral en advergames. Ik mocht meteen aan de slag voor een van de grootste entertainment bedrijven van de wereld, Walt Disney. Hier heb ik ongeveer drie kwart van mijn stage periode aan besteed. Ook ben ik een week naar Amerika geweest. De overige tijd heb ik besteed aan andere projecten, meer gericht op films. Ik heb bij Sticky vooral veel geprogrammeerd. Ik ging elke dag met plezier naar mijn werk. Ik heb veel trucjes in Unity geleerd en ik begrijp een stuk beter hoe Unity in de achtergrond werkt. Hetzelfde geldt voor de programmeer taal C#. Naast dat het werk leuk was was het ook erg gezellig met de collega’s we hebben vaak vrijdag avond na het werk gezellig nagepraat en gegamed en we zijn een aantal keer Utrecht in gegaan. Al met al een super coole stage geweest!
ENGELS I'm Simon Karman. I am a Game Developer and really like to program games. For my study I had to do an internship during the first half of the 3rd year. I started to look for an internship company. I used a portfolio website where work of me can be viewed. I have emailed a number of companies and Sticky Studios invited me. It was a nice conversation and I got offered an internship. Sticky Studios is a company that develops games. They developed casual, viral and advergames. My first assignment was a project for one of the biggest entertainment companies in the world, Walt Disney. I worked on this project for about three quarters of my internship. I have also been to America for one week. The rest of the time I spent on other projects, focused more on movies. I mostly programmed at Sticky. I enjoyed going to my work every day. I have learned many tricks in Unity and I understand how Unity works in the background way better. The same goes for the programming language C#. Besides that the work was fun, it was also very pleasant with colleagues. We also played some games on Friday evening after work or we would go to Utrecht Neude to drink some beers. All in all a super fun internship!
5
LIJST VAN SYMBOLEN EN VERKLARENDE WOORDENLIJST In onderstaande tabel is een verklarende woordenlijst opgenomen. Woord
Verklaring
Sticky Studios
Het bedrijf waar ik stage loop
Sticky
De korte benaming voor het bedrijf waar ik stage loop
Stageperiode
De periode die ik stage gelopen heb van 10 sept 2012 tot 25 jan 2013
C#
De programmeer taal waarin ik heb gewerkt
Unity
De Game Engine waarin ik heb gewerkt
Pitchen
Een manier om werk binnen te halen bij opdrachtgever doormiddel van een korte ontmoeting of presentatie
Daarnaast zal ik in mijn verslag soms stukken programma code plakken om iets te kunnen illustreren. Hiervoor zal ik de volgende opmaak gebruiken.
(dit is een willekeurig stuk code dat ik heb geschreven)
6
INLEIDING In dit verslag vertel ik hoe ik mijn stage heb ervaren. Wat ik leuk vond en wat ik minder leuk vond. Ook wil ik kijken wat ik geleerd heb en of mijn bevindingen overeenkomen met mijn verwachtingen vooraf. Ik heb bij het schrijven van dit verslag geprobeerd de chronologie te volgen. Maar ook te zorgen voor een logische opbouw. In dit verslag zal ik eerst iets vertellen over hoe ik bij Sticky Studios terecht ben gekomen. Hoe de sollicitatie is verlopen en waar het bedrijf Sticky Studios zich mee bezig heeft gehouden en wat de bedrijfsactiviteiten van Sticky Studios zijn. Hierna zal ik ingaan op de verwachtingen die ik van tevoren had en wat in het begin van mijn stage gedaan heb. Ik zal wat vertellen over mijn werkplek en over de collega’s met wie ik gewerkt heb en hoe het bedrijf Sticky Studios qua structuur in elkaar zit. Hierna zal ik uitleggen wat ik in mijn stage periode allemaal gedaan heb en tegen welke problemen ik hierbij ben opgelopen en hoe ik deze problemen heb opgelost. Vervolgens zal ik een opsomming geven van de uitjes die we met het werk hebben gehad. Dit was natuurlijk gewoon erg gezellig! Als laatste onderdeel heb ik een algehele conclusie over mijn stage opgenomen. De literatuurlijst, bronnen en bijlage zijn aan het einde van mijn stageverslag te vinden te vinden.
7
HOOFDTEKST HET SOLLICITATIE GESPREK Toen ik ben begonnen met het zoeken naar een stage bedrijf heb ik rond gekeken op internet. Toen ik een aantal leuke vacatures had gevonden heb ik deze bedrijven gemaild. In deze mail heb ik mijn motivatie neergezet en tevens mijn site meegestuurd waarop ze werk van mij kunnen bekijken. Ook heb ik geprobeerd zoveel mogelijk contactinformatie mee te sturen. Nadat ik een aantal bedrijven een email gestuurd had werd ik door een bedrijf terug gebeld. Dit bedrijf was Sticky Studios. We hebben toen een afspraak gemaakt voor een sollicitatie gesprek.
VOORBEREIDING Als voorbereiding op het sollicitatie gesprek heb ik op de site van Sticky Studios rond gekeken. Ik heb gezocht naar informatie over werknemers, opdrachtgevers, hun motto en doelstellingen en natuurlijk de games die ze gemaakt hebben. Ook heb ik me voorbereid op vragen waar ik goed in ben, waar ik me in wil ontwikkelen en ook waar ik minder goed in ben. Door al deze voorbereidingen ging ik met een goed gevoel naar het sollicitatie gesprek toe.
HET GESPREK Het sollicitatiegesprek bij Sticky Studios heb ik gevoerd met David, de producer, en Tom, de lead programmeur. Jeroen, de eigenaar van het bedrijf, was die week in Amerika en kon dus niet aanwezig zijn bij het gesprek. In het gesprek hebben we het vooral gehad over wat ik graag zou doen binnen het bedrijf en wat de bedrijfsactiviteiten zijn en of dit bij mij aansprak. Tom was daarnaast erg te spreken over het stuk source code dat ik had opgestuurd. Hij vond het er goed uit zien en dit was volgens mij een redelijk doorslaggevende factor. Wat David zich ook afvroeg was waarom ik pas zo kort voor de stage (2 weken voor het begin) naar Sticky Studios had gemaild. Hierop heb ik toen geantwoord dat ik normaal altijd goed op tijd ben met dit soort belangrijke zaken maar dat het afgelopen half jaar op school nogal druk was geweest en ik op vakantie was gegaan dus aan het begin van de vakantie een aantal weken rust genomen had. Dit was verder geen probleem. Het was een plezierig gesprek en er was eigenlijk meteen wel een klik. Aan het einde van het gesprek zei David dat hij geen beslissing kon nemen over het aannemen van mij, maar dat hij wel een positief advies aan Jeroen door kon geven.
8
NA AFLOOP Een paar dagen na de sollicitatie ben ik door David teruggebeld. Hij zei me toen dat hij me de stage wilde aanbieden voor het komend half jaar. We hebben toen meteen een nieuwe afspraak gemaakt om te bepalen wanneer ik kon beginnen, om Jeroen te ontmoeten en om wat afspraken te maken.
AFSPRAKEN We hebben afspraken gemaakt zoals hoelang een werkdag duurt, wanneer de pauzes zijn en dergelijke. Ook heb ik een rondleiding gekregen door het bedrijf en heb ik Jeroen ontmoet. Jeroen heeft vervolgens mijn stage contract ondertekend. Ik moest tevens een contract voor Sticky Studios ondertekenen, namelijk de NDA (Non-Disclosure Agreement). Ik heb zelf ervaren dat ik liever iets meer duidelijkheid had gehad over de afspraken en dergelijke binnen het bedrijf. Uiteindelijk is het allemaal goed gekomen, maar ik had graag iets meer informatie gehad over werktijden, snipperdagen en de stagevergoeding. Allemaal dingen waar ik zelf niet over ben begonnen omdat ik dit ‘raar’ vond om te doen, zo bij een eerste ontmoeting. Waarschijnlijk zal ik dit een volgende keer wel vragen als de situatie dat toelaat.
NON-DISCLOSURE AGREEMENT Voor Sticky Studios heb ik een NDA ondertekend. Dat houd in dat ik niks mag doorvertellen wat ik doe bij Sticky Studios. Dit was natuurlijk meteen heel officieel voor mij en dit heeft ook wel echt een indruk achter gelaten dat ik niks door mag vertellen. Hoewel ik de reden van een NDA wel begrijp vond ik het wel jammer vond was dat ik niet aan vrienden en familie kon vertellen met welke coole dingen ik me bezig hield. Ook mag ik niet veel op mijn website zetten.
9
STICKY STUDIOS
Sticky Studios is een Game Studio gevestigd in Utrecht, met een contact persoon in New York. Het is een Game Studio die zich vooral richt op het maken van games in een korte tijdspanne. Sticky Studios maakt dus producten die bedoeld zijn om andere bedrijven of producten bekender te maken door middel van spel.
Een quote van de Sticky Studios website: Sticky Studios is a games studio focused on delivering powerful game experiences, compelling story-lines and captivating visuals with truly engaging game play. We produce a variety of game types, including viral, social 1 and serious games for a wide range of platforms. We are located in Utrecht and New York.
Een aantal voorbeelden van games die Sticky Studios heeft ontwikkeld zijn: -
Madagascar 3 Wrath of the Titans Hess Racer
Dit zijn vooral games die voor films worden gebruikt om ze te promoten, of zoals bij Hess Racer een product promoten. In onderstaande lijst is te zien voor welke bedrijven Sticky Studios al aan de slag is geweest.
1
http://www.stickystudios.com/studio/ 10
EERSTE DAG VERWACHTINGEN Toen ik de eerste dag op weg ging had ik eigenlijk van tevoren niet zo’n goed idee wat ik moest verwachten. Ik wist dat Sticky Studios in Unity werkte en daar had ik ook al wel wat ervaring mee. Aangezien er nog geen computer voor mij beschikbaar was moest ik de eerste week mijn eigen laptop meenemen zodat ik hierop kon werken. Wat ik verder verwachtte was dat ik vooral bij collega’s ging meekijken wat ze aan het doen waren en dat ik software op mijn laptop moest installeren.
WERKPLEK De plek waar alle werknemers zitten is een grote ruimte met tafels en computers. Verder is er nog een zithoek, een keukentje, een server room en een vergaderruimte. Toen ik voor het eerst binnen kwam kreeg ik van David een plek toegewezen. Hier heb ik toen mijn laptop neergezet. Ik ben toen rond gaan lopen en heb bij alle werknemers gevraagd hoe ze heten, wat ze doen binnen het bedrijf en aan welke game ze aan het werkten. Hierna heb ik de standaard programma’s die bij Sticky Studios gebruikt worden geinstallereerd (Unity/Thunderbird). Ook hadden we met alle programmeurs samen een scrum achtige meeting, waarin we bespraken wat de programmeurs deze week allemaal gingen doen. Bij deze meeting kreeg ik ook meteen een taak toegewezen. In Unity ben ik aan de slag gegaan met de GUI elementen van een project. Ik ben toen begonnen met de simpele klus om buttons andere art te geven. Marc een collega van mij die ook stagiaire is heeft mij goed op gang geholpen met het project en hoe alles in z’n werk gaat met de UnityAssetServer en dergelijke. Dit was een erg leuke eerste dag waarop ik met iedereen kennis heb gemaakt. Ik vond het vooral cool dat ik meteen werd gezien als een collega en direct aan de slag kon met een project.
11
BEDRIJFSSTRUCTUUR Bij Sticky Studios werkten 17 mensen in de tijd dat ik er stage heb gelopen. Hieronder heb ik een schema gemaakt van de bedrijfsstructuur.
Jeroen is de directeur en oprichter van Sticky Studios. Hij heeft het bedrijf samen met Mikel opgericht. Mikel is de hoofdartist en Tom de hoofdprogrammeur.
Binnen Sticky werken we met scrum. Dit heb ik ook op school gehad en het was dus makkelijk inspringen en goed toe te passen. Omdat het bedrijf via korte sprints en scrum werkt is iedereen eigenlijk gewoon met alle projecten bezig en is er niet echt per project een organisatiestructuur. Verder heeft iedereen ook gewoon wat te zeggen bij alle projecten. Als je dus leuke ideeën of dergelijke hebt kan je dit bespreken en kijken wat anderen hiervan vinden. Als mensen niet uit een probleem binnen een project komen dan komen er soms ook meetings waar het hele bedrijf bij is om te kijken wat er kan gebeuren om dit op te lossen.
Met Marc en Tom in Florida, Orlando
12
COLLEGA’S Ik heb eigenlijk over de gehele periode bij Sticky Studios steeds met andere mensen samen gewerkt. Dit was erg leuk om met bijna iedereen een project samen te hebben gedaan. In het begin toen ik bij Sticky Studios kwam werken heb ik veel met Marc en Tom gewerkt aan een interactieve applicatie voor in een attractie. Marc heeft mij in het begin op weg geholpen en laten zien waarmee ik aan het werk kon. Het project was al een heel erg groot en complex dus het was erg goed om samen met hem hierover te kunnen praten. Als ik er met Marc niet uit kwam dan vroegen we vaak aan Tom hoe het in elkaar zat. Ook Dave had een aantal onderdelen van de interactieve applicatie voor in een attractie gemaakt en ik heb toen ook een aantal keer met hem overlegt. Ik ben ook met Marc en Tom naar Amerika geweest. Dit was erg gezellig en een mooie ervaring. Heel erg gaaf om als stagiaire naar Amerika te mogen. Ik heb een apart verhaal geschreven over wat ik heb gedaan in Amerika. Zie hiervoor bijlage B. Er was nog een ander project dat met de interactieve applicatie voor in een attractie te maken had. Daar heeft Berry veel aan gedaan hier heb ik uiteindelijk ook nog wat taken voor uitgevoerd. Mijn werkplek was naast Bob aan de tafel. Met Bob maakte ik vaak even een praatje en we bekeken even bij elkaar waar de ander mee bezig was en hoe het ging met het werk. Ook legde Bob me uit hoe dingen qua art werken voor het project waar hij op dat moment mee bezig was. Erg interessant! Natuurlijk met de lunch en de uitjes vaak met iedereen gepraat. Er waren dus niet echt collega’s die ik nooit sprak of niet zag. Ongeveer op de helft van mijn stage kregen we te horen dat Jeroen zijn eerste kind, Daan, had gekregen. We hebben Daan toen met z’n allen een haaien pyjama gegeven. Aan het einde van de stageperiode heb ik aan aan een paar andere projecten gewerkt. Ik ging meedoen in een project waarbij ik met Nikos en Jeroen samenwerkte om een test-applicatie te maken die Jeroen in Amerika zou gaan pitchen. Later toen Nikos op vakantie was heb ik deze applicatie zelf voor Jeroen afgemaakt. Een ander project waar ik aan heb gewerkt was samen met Dennis, Ramana, Bastian en Jordi. Eigenlijk zo’n beetje de rest van het bedrijf. Omdat we op het zelfde project zaten met zo’n grote groep hebben we veel vergaderd. Dit zodat we wat beter bij konden houden waar iedereen mee bezig was. Naast dat ik met al deze mensen heb samen gewerkt heb ik natuurlijk ook veel met David te maken gehad. David was eigenlijk de persoon die zorgde dat alle projecten goed bleven lopen en dat iedereen met de goede dingen bezig was. Hij zorgde ervoor dat we niet teveel taken en feedback over ons heen kregen en hij heeft er voor gezorgd dat iedereen aan het begin van de week bezig ging met zijn of haar taken voor die week. Ook hield David in de gaten of iedereen tijdens de week op schema bleef. Voor administratieve zaken als vrije dagen, vakanties en declaraties moest je ook bij David zijn. Hiervoor moest je vaak wel even een herinneringsmailtje sturen. Voor het salaris en de verwerking van loonsgegevens moest je bij Jitske zijn. Dit is de vriendin van Jeroen en die deed de personeelszaken. De personen die ik nog niet genoemd heb en met wie ik dus wat minder te maken heb gehad zijn allemaal artists.
13
WERKZAAMHEDEN ALGEMENEN TAKEN Mijn voornaamste taak was programmeren. Maar om goed te kunnen programmeren in een groep moet je veel overleggen. Als je tegen problemen aan loopt moet je dit proberen op te lossen en het goed kunnen bespreken. Ook sta je bij sommige taken extra onder druk omdat je met afspraken en opleveringen bezig bent. Daarnaast zijn er natuurlijk altijd extra taken die binnen het bedrijf die moeten gebeuren.
HULP BIJ PROBLEMEN Als ik problemen had of dingen waar ik niet uitkwam kon ik altijd hulp vragen aan Tom. Naast Tom kon ik qua projectgerichte vragen terecht bij David. Als ik bijvoorbeeld wilde weten wat iemand anders vond van de manier hoe ik een probleem wilde oplossen, dan ging ik naar Tom of David om te kijken of dit qua kwaliteit of tijdsbesteding goed was om aan te pakken. Uit dit soort gesprekken haal je vaak veel informatie hoe iemand anders een probleem zou oplossen. Zo kom je samen tot een idee en dan kan je verder gaan met het uitwerken.
AFSPRAKEN EN OPLEVERINGEN Op het moment dat er een oplevering was of een deadline voor een belangrijk project dan gingen we in overleg met z’n allen om te bespreken wat er allemaal nog moest gebeuren en wat de taakverdeling was. Aan het begin van de week spraken we af wat we aan het einde van de week gingen opleveren. Je had dus ongeveer een week de tijd om je taken af te ronden. Het was dan ook belangrijk dat je redelijk accuraat kon inschatten hoe lang je dacht bezig te zijn met een taak. Dit vond ik in het begin wel erg lastig. Dit was vooral lastig omdat ik op school nooit echt voor ik iets ging programmeren hoefde na te denken of het wel kon en hoe lang een opdracht duurde. Op school weet je namelijk dat de opdrachten die je krijgt te doen zijn en ook binnen een bepaalde tijdspanne. Op mijn stage heb ik geleerd dat dit op echte opdrachten wat minder van toepassing is. Het inschatten van tijdsbestedingen van opdrachten ging richting het einde van de stage wel beter en ik durfde ook wat makkelijker preciezere inschattingen te maken.
EXTRA TAKEN Naast dat iedereen gewoon z’n werk deed waren er natuurlijk ook taken zoals de vaatwasser in ruimen of de tafel dekken voor de lunch. Deze taken werden altijd gewoon netjes verdeeld en dit was goed geregeld. Ik heb een tijdje elke dag op moeten letten dat de koffiezetter uit ging. Dit natuurlijk in verband met brandgevaar. Door zo’n klusje voel je je meteen betrokken bij een bedrijf en dat je naast dat je er werkt ook gewoon een collega bent met wie je samen een werkomgeving onderhoudt. Aan het einde van mijn stageperiode, toen Marc en Lars weg waren moest ik ook wat vaker tussen de middag boodschappen doen of de tafel dekken voor de lunch.
14
SPECIFIEKE PROBLEMEN MET OPLOSSING PROBLEEM 1: DE SCROLLSELECTOR Dit probleem gaat over de scroll selector die ik tijdens de eerste dagen bij Sticky Studios heb gemaakt. De scroll selector is een GUI element dat zich bevind aan de rechterkant van het beeld. In de scroll selector kan worden gekozen tussen verschillende textures, wielen of accessoires. Dit doe je door middel van het scrollen over de items in beeld. Deze items bewegen vervolgens in de richten van je vinger naar boven of beneden. Het middelste item dat op het beeld staat is dan geselecteerd.
HET PROBLEEM De Scroll selector die ik had geschreven was niet goed op verschillende plekken toe te passen en de status van de Scroll selector was niet duidelijk zichtbaar. Ook was het niet duidelijk hoe je hem aan moest passen.
WIE WAREN ER BETROKKEN Tom was hierbij betrokken, omdat hij wat ideeën had over hoe de scroll selector in elkaar zou moeten zitten en hij mij de opdracht had gegeven. Marc was hierbij betrokken omdat hij de score moest implementeren bij het kiezen van een specifiek item uit de scroll selector en hij was hiervoor geïnteresseerd in de huidige staat van de scroll selector.
WAT HEB IK GEDAAN Ik ben met Tom gaan overleggen wat er moest gebeuren. Tom heeft mij uitgelegd dat het in Unity in de meeste gevallen niet handig is om met overerving te werken. Unity is een component based programma en het is dus ook makkelijker en het werkt beter om je eigen classes ook zo op te bouwen. Ik heb toen met Tom een schema gemaakt hoe dit probleem op te lossen en hoe mijn code te herschrijven. Hieronder een foto van het schema dat we getekend hebben. Het was al een erg complex programma waarin ik de scroll selector gebouwd heb. Daardoor is het diagram zo groot geworden en was het ook belangrijk om het te fixen.
Het diagram (niet te lezen maar om aan te geven hoe groot/complex het probleem was) Aan het begin moest ik erg aan het componentbased programmeren wennen maar ik pakte dit bij later problemen goed op. Ik vond het zelf erg fijn dat ik met Tom kon overleggen om een probleem te bespreken en analyseren. 15
PROBLEEM 2: GRID EILANDJES In het spel waar mensen over een grid rondlopen zat een probleem. Het grid waar de poppetjes overheen liepen werd op plekken waar objecten, zoals gebouwen en bergen, staan verwijderd. De verwijdering van het grid gebeurde wanneer connecties elkaar niet konden bereiken.
HET PROBLEEM Het probleem met deze manier van verwijderen was dat de connecties die in een huis liggen nog blijven bestaan. Grid navigators konden hierdoor in het huisje of in de bergen spawnen.
WIE WAREN ER BETROKKEN Bastian was hierbij betrokken als maker van het grid en ik heb hem geholpen met de oplossing van dit probleem.
WAT HEBBEN WE GEDAAN Uiteindelijk hebben we er voor gekozen om een punt op het grid te kiezen dat altijd in het ‘goede’ deel van het grid zit. We hebben toen door middel van recursief functie een lijst opgebouwd van alle bereikbare punten in het grid vanaf de start node. De punten in het grid die niet voorkwamen in deze lijst werden verwijderd. Hieronder het stuk code met de recursieve functie dat we hiervoor hebben gebruikt:
De AddToChain functie roept zichzelf aan om eigen connecties toe te voegen. De recursie gaat niet oneindig door omdat bij het toevoegen wordt gecheckt of het punt reeds is toegevoegd. 16
PROBLEEM 3: DE PEASANTS In een ander spel waar ik aan gewerkt heb heb ik me bezig gehouden met het gedrag van de poppetjes die rondlopen. Een van deze poppetjes was de peasant. Voordat deze werd gespawned wordt zowel het geslacht als de kleding gekozen.
HET PROBLEEM De peasants werden, als ze dood werden geslagen vervangen door een ‘dood’ model. Dit model had niet het zelfde geslacht en ook niet de zelfde kleren. Hierdoor veranderden de peasants als je ze dood slaat.
WIE WAREN ER BETROKKEN Dennis was hierbij betrokken omdat Dennis de code had gemaakt waarop iemand dood gaat.
WAT HEB IK GEDAAN Om dit probleem op te lossen heb ik met Dennis overlegd. We zijn hier samen mee aan de slag gegaan, omdat hier onze code samen kwam. Ik had het idee om te zorgen dat de peasant niet werd vervangen door een ‘dood’ model maar dat de peasant werd gekopieerd naar een nieuwe prefab. Hierdoor hoef je niet op te slaan welke kleren de peasant aan heeft om een nieuwe op te bouwen, maar gebruik je gewoon het oude model en voeg je de geluiden en animaties toe. Erg handig om met een collega te overleggen en te bespreken hoe we het kunnen oplossen en ook meteen op te lossen. We hebben deze oplossing kunnen toepassen op meerdere poppetjes waardoor het ontwikkelingsproces vereenvoudigd werd.
MEERDERE PROBLEMEN Natuurlijk waren er nog veel meer problemen waar ik alleen of samen met iemand een oplossing voor gevonden heb. Programmeren is nou eenmaal oplossingen zoeken voor problemen. Ik heb deze niet allemaal in het verslag op genomen om dat ik de drie problemen die ik hierboven benoemd heb representatief vond voor de stageperiode bij Sticky Studios. 17
C# EN UNITY Ik heb de hele stage periode in C# met Unity gewerkt. Hierin heb ik natuurlijk allerlei verschillende technieken en trucjes geleerd. Ik heb hieronder een aantal belangrijke dingen die ik geleerd heb beschreven. Het zijn vooral technische beschrijvingen van wat ik heb geleerd. Ze zijn dus wellicht vooral interessant voor programmeurs.
PROGRAMMEERTALEN IN UNITY In Unity zitten meerdere programmeer talen. Deze talen kunnen voor het grootste deel met elkaar praten. Ook werken alle talen voor elk platform. Hierdoor is het mogelijk om bijvoorbeeld C# code te runnen op een iPhone. Hoe dit werkt is dat Unity eigenlijk elke programmeer taal omzet naar de zelfde taal. Deze taal heet IL. De Intermediate Language. Een IL-taal is een taal met één computeropdracht per regel. Deze taal kan vervolgens voor elke verschillende machine in machine code worden omgezet. Als je echter build naar flash wordt de gehele code omgezet naar ActionScript. Hierdoor zijn in flash ook sommige functie onbruikbaar omdat dit niet omzetbaar is of niet is omgezet in de Unity Engine van Actionscript.
COMPONENT BASED PROGRAMMEREN Unity is een component based engine. Dit houdt in dat elk object in de game wordt opgebouwd uit verschillende componenten en dat elk van deze componenten op zichzelf kan operen en acties kan uitvoeren. In het plaatje hieronder heb ik een eenvoudig voorbeeldje gemaakt in Unity 4.0. Ik heb een auto object gemaakt met daarop vier verschillende componenten. De verschillende componenten kunnen los van elkaar opereren en zijn dus ook weg te halen of uit te zetten. Op deze manier kan je dus bijvoorbeeld een nieuwe auto maken die de component ‘VeranderSnelheidDoorInput (Script)’ niet heeft. Dit zou dan een auto zijn die niet bestuurd wordt door de speler maar wel op dezelfde manier met de game wereld omgaat en handelingen uitvoert.
18
JSON FILES JSON files gebruiken we bij Sticky heel vaak als configuratie files. Deze file zijn makkelijk uit te lezen en op te bouwen. Dit kan dus ook gedaan worden door mensen die niets van programmeren af weten. Ook is het makkelijk om, nadat je de build gemaakt hebt, nog dingen te kunnen aanpassen zonder voor deze aanpassingen op nieuw te moeten builden. Een JSON file lijkt qua principe erg op een XML file. Een JSON kan omgaan met vier verschillende datatypes. -
-
Hashtable. De hashtable geef je aan door middel van { en }. De hashtable bevat een lijst met keys met bijbehorende value. Tussen de key en de value staat een dubbele punt en elk lijst item word gescheiden door een komma. List. De list geef je aan door middel van een ( en ). Een list bevat een lijst met values gescheiden door een komma. Integer. Een geheel getal. String. Je kan een string aangeven door middel van de tekst te omvatten met dubbele quotes (“text”)
Een voorbeeld JSON Deze JSON bestaat uit een HashTable met hierin twee key-value paren. De eerste is de key personen met daarin als value een lijst. Deze lijst is opgebouwd uit vier string. De tweede is het huisnummer met als waarde een integer. Er is op internet al veel code te vinden die JSON files kunnen uitlezen. Bij Sticky gebruikten we een zelfgemaakt stuk code. Deze code kan een JSON file omzetten naar informatie, maar ook informatie omzetten naar een JSON file. Hierdoor was het erg goed te gebruiken en snel toepasbaar. Zet deze waarde maar even in een JSON – David Sampimon
UNITY EDITORSCRIPTS Een ander heel krachtig principe is dat je in Unity je eigen EditorScripts kunt schrijven. Als je een EditorScript wilt maken dan moet je het script in een map met de naam Editor opslaan. Al deze scripts komen in een los project te staan en dit project wordt uitgevoerd terwijl je in de Editor bezig bent. Hierdoor kan je code die je niet nodig hebt in de build maar wel wilt kunnen gebruiken om je level op te bouwen makkelijk gescheiden houden van code die daadwerkelijk in game wordt gebruikt. Ook door de editor te veranderen (v.b. windows en menutjes toevoegen) kan je bepaalde processen vereenvoudigen. 19
COROUTINES EN HET YIELD-KEYWORD In Unity zit een Coroutines systeem. Dit systeem is erg handig voor het animeren van game elementen en andere tijdgebaseerde events. Omdat ik altijd graag wil weten hoe zoiets werkt achter de schermen ben ik dit gaan uit zoeken en heb ik het aan een aantal collega’s gevraagd. Wat ik heb geleerd is dat dit geen zwarte magie is, maar dat deze coroutines een slimme toepassing zijn van het yield-keyword.
YIELD KEYWORD Om goed te kunnen begrijpen hoe Coroutines werken is het handig om eerst te weten wat het yield keyword doet. Het yield-keyword is een keyword dat gebruikt wordt om collecties op te bouwen. Een functie waarin een het yield-keyword wordt gebruikt moet een IEnumerable, IEnumerable, IEnumerator, or IEnumerator als return type hebben. Elke keer als je yield return aanroept geef je eigenlijk het volgende element terug uit de collectie. Op deze manier kan je heel makkelijk een collectie opbouwen vanuit code.
VOORBEELD YIELD-KEYWORD We moeten System.Collections.Generic importeren omdat we een IEnumerable gaan returnen.
Vervolgens maken we een hele simpele functie die een groep personen beschrijft. Dit is dus de collectie van personen die opgebouwd wordt uit door middel van het yield-keyword.
Vervolgens kunnen we met foreach de collectie doorlopen en per persoon de gegevens printen.
20
De output van dit stuk code staat hieronder. Zoals je ziet wordt op basis van de yield return een collectie opgebouwd. Bij de yield break zeg je tegen de foreach-loop dat de collectie klaar is. Hierdoor wordt persoon ‘niemand’ met leeftijd 0 niet geprint.
Een handige toepassing kan in dit voorbeeld zijn om alle personen die aan een bepaalde voorwaarde voldoen te printen. De voorwaarde die ik in dit geval gebruikt is dat je een minimale leeftijd moet hebben. In het volgende stuk code doorlopen we weer de groep van personen en ‘yield-en’ we elk persoon die voldoet aan de minimum leeftijd.
Als we door deze collectie heen willen lopen met als minimum leeftijd 19 jaar oud kunnen we weer een foreach gebruiken.
De output van dit stuk code zal dus alleen nog personen bevatten die voldoen aan de minimum leeftijd. Voldoen ze niet aan deze voorwaarde, dan wordt hun yield return niet aangeroepen en dan bevinden ze zich niet in de opgebouwde collectie.
21
SNELHEIDSVOORDELEN Het mooie van dit alles is dat door de manier waarop yield werkt, je niet de hele collectie hoeft te doorlopen voordat je dingen kunt doen met de collectie. Wat ik hiermee bedoel is dat wanneer je bijvoorbeeld alleen de eerste ‘x’ aantal personen uit de groep nodig hebt, je dan niet de hele collectie hoeft te doorlopen. Hieronder staat de code voor het uitlezen van een ‘x’ aantal personen uit de groep van personen. Ik blijf nieuwe personen returnen tot dat we het verwachte aantal personen hebben geyield. Dan kunnen we breaken met yield break.
In het bovenstaande voorbeeld heb ik ook een log toegevoegd om te kunnen zien hoeveel personen de applicatie daadwerkelijk doorloopt bij het uitlezen van alleen de eerste persoon uit de groep. We kunnen deze functie aanroepen door de AantalUitGroep te doorlopen met als parameter 1. Dit zal dus alleen de eerste persoon uit de groep yielden.
De output van deze code staat hier onder. Je kunt zien dat de enige persoon die de code uit de collectie gehaald heeft ‘Simon’ is. De code hoeft namelijk niet eerst de hele lijst van GroepPersonen op te bouwen om de eerste persoon te kunnen uitlezen. Met dit voorbeeld zal dit qua tijdsbesparing niet zoveel uitmaken, maar je kan je waarschijnlijk wel voorstellen dat bij lijsten van duizenden objecten het wel heel erg handig kan zijn dat je, om de eerste twee objecten te bekijken, niet eerst alle objecten hoeft te doorlopen.
22
COROUTINES Nu we de basics weten over het yield-keyword kunnen we kijken hoe Unity dit keyword gebruikt in zijn coroutines systeem. Als je een nieuwe coroutine start moet je hierbij een functie meegeven die yield returns gebruikt. Deze functie zal dus een collectie opbouwen. Maar waarvan? Unity heeft bedacht dat elke keer als je iets yield, dit aangeeft hoelang Unity wacht tot hij verder gaat met het ‘opbouwen’ van de collectie. Als je in een Coroutine de volgende code uitvoert zal Unity 1 frame wachten voordat het volgende item uit de collectie wordt opgevraagd.
Daarnaast zijn er ook uitgebreidere objecten die je kan returnen, namelijk een WaitForSeconds object. Dit object wacht, zoals de naam al zegt, voor een bepaald aantal seconden. De code ziet er als volgt uit.
Door deze makkelijke schrijfwijze is deze manier van programmeren handig te gebruiken bij game elementen of GUI elementen die goede timing vergen of opeenvolgende gebeurtenissen moeten uitvoeren. Het stukje pseudocode hieronder laat zien hoe je makkelijk een object maakt en het vervolgens beweegt van een punt naar een ander punt waarna het object een geluidje maakt en weer wordt verwijderd.
Het mooie van deze manier van schrijven is dat je meerdere gedragshandelingen in één functie kunt stoppen. Je moet alleen zorgen dat je niet je hele code zo gaat schrijven omdat je wel heel snel overzicht kwijt bent van wat je classes nu aan het doen zijn en of ze al klaar zijn met hun coroutines.
23
LAMBDA EXPRESSIONS / LINQ Bij Sticky Studios ben ik ook begonnen met het gebruiken van Linq in C#. Met Linq kan je makkelijk door collecties heen lopen en opdrachten hierop uitvoeren. In mijn uitleg over het yield-keyword kwam ik met het voorbeeld om alle personen boven een bepaalde leeftijd te kiezen uit een lijst. Deze code had ik toen op de volgende manier gemaakt:
Deze code zorgt er dus voor dat alleen de personen die voldoen aan een minimum leeftijd in de nieuwe collectie terecht komen. Deze code is met gebruik van Linq te herschrijven naar 1 regel. We moeten natuurlijk als eerste System.Linq importen om gebruik te kunnen maken van de functies in Linq.
Nu kunnen we op collecties, functies aanroepen die System.Linq heeft geïmplementeerd. Een van de vele functies is de functie .Where(). Deze functie verwacht een beschrijving waarop hij elke item uit de collectie moet testen. Als deze beschrijving true returned zal hij dit item toevoegen aan de lijst.
Zoals je hierboven ziet gebruiken we de .Where() functie op de collectie van de groep personen. Elke persoon wordt vervolgens onderworpen aan de functie tussen ( en ). De functie in dit geval is:
Dit lijkt misschien niet op een functie maar dit is het wel degelijk. Dit is een zogenaamde inline functie. De syntax van de functie lijkt misschien nogal vaag. Het werkt echter eenvoudig. Wat hier staat is een functie die als parameter een persoon verwacht. Linq kan het type van deze parameter bepalen doordat het weet wat het type is van de collectie waar je doorheen loopt. Aangezien we een collectie van personen hebben is de enige parameter die we meegeven dus van het type persoon.
24
Vervolgens komt het => teken, het pijltje. Bij Sticky noemde we Linq ook wel pijltjes magie. Dit omdat de basis van het handig gebruiken van Linq eigenlijk neerkomt op het gebruiken van deze inline functies. Dit pijltje is eigenlijk niks minder dan de scheiding tussen de parameters en de daadwerkelijk uitvoering van de functie. De uitvoering van de functie is vervolgens het zelfde stuk code als we eerst in de foreach loop hadden. Aan de werking van het kiezen van een persoon is immers niks veranderd. Deze bewerking geeft een boolean waarde terug. Dit is het return type van de functie. Als de inline functie true returned dan zal de persoon aan de nieuwe collectie worden toegevoegd. Returned de inline functie false, dan zal de persoon niet worden toegevoegd.
IN DE PRAKTIJK Met gebruik van deze methode zijn veel stukken code die zonder gebruik van Linq tientallen regels code nodig hebben nu in een paar of soms zelfs in een enkele regels code te schrijven. Een goed voorbeeld waarbij ik het gebruikt heb is het volgende.
Dit is één regel code. Ik heb het even onder elkaar gezet voor de duidelijkheid. Ik had deze functie geschreven om te zorgen dat ik een aantal nodes, die het dichts bij een bepaald punt in de wereld liggen, kon selecteren. Wat hier stap voor stap gebeurt is het volgende: Er is een collectie nodes in een grid. Op deze collectie selecteer ik alle nodes die niet isNull zijn (Where). Vervolgens verander ik de selectie (Select) in een nieuwe lijst van een inline gedefinieerde class die de node en de afstand van de node tot het punt in de wereld bijhoud. Hierna sorteer (OrderBy) ik de lijst op deze afstand en pak (Take) ik alleen het aantal nodes dat ik nodig heb. Vervolgens zet ik de collectie van de inline gedefinieerde class weer om (Select) naar een collectie van nodes. En ten slotte zet ik de collectie om in een List (ToList). Als programmeur kan je je misschien wel voorstellen dat dit zonder Linq een heel karwei zou zijn geweest om te programmeren. En op deze wijze past dit gewoon in één regel! Eerst was ik zelf ook zonder Linq begonnen, maar toen ik ongeveer 20-30 regels code had geschreven en eigenlijk pas bij stap 3 was, vermoedde ik dat dit makkelijker moest kunnen in Linq. En dat was zo. Daarnaast is deze code door de snelheidsvoordelen, die ik beschreven heb bij het uitleggen van het yieldkeyword, ook nog eens erg snel en redelijk optimaal. Het grootste voordeel in dit voorbeeld is dat Linq niet eerst de hele lijst ordend (OrderBy) voordat hij verder gaat met het pakken (Take) van de nodes die ik nodig heb. Dit betekend dus dat als (OrderBy) zeker weet wat de kleinste waardes zijn hij niet de hele lijst hoeft te gaan sorteren. Stel iemand vraagt dus maar 3 nodes op dan sort die ook maar tot die de 3 nodes gevonden heeft. Dit is erg veel sneller dan eerst de gehele lijst sorteren en de computer is dus geen werk voor niks aan doen.
25
UITJES MET HET WERK Het wsa altijd erg gezellig op werk. Ook ben ik met een aantal uitspajes mee geweest die belangrijk zijn om de onderlingen contacten in het bedrijf goed te houden. Omdat dit vor mij ook bepaalt hoe de werksfeer was, vind ik het leuk de ‘uit stapjes’ nog even te noemen.
WEEK EINDE Vrijdag na het werk was het altijd gezellig met wat bier erbij en er werden spellen gespeeld. Ik vond dit leuk de voor collegiale contacten, meer dan alleen te samen werken en vaak ook samen in de bus te zitten. De laatste maanden van mijn stage was dit wel minder, omdat het erg druk was waardoor iedereen bezig was en er niet zoveel tijd over bleef.
VRIJDAG 28 SEPTEMBER 2012 Dit was de laatste officiële werkdag van Dave. Ik zeg officiële omdat hij een paar weken later toen het echt heel erg druk was nog is ingezet op een project. We hebben deze avond met z’n allen op een terrasje op het Neude gezeten. Ik heb het met Tom en Dennis gehad over de games die ze al gemaakt hebben en wat hun ervaringen waren hiermee. Allemaal erg leuke verhalen. We hebben de hele avond onder een warmte lamp zitten praten waarna we gelukkig nog de laatste trein hebben gehaald. Ik hield het geld bij en zorgde dat er aan het einde van de avond was betaald. Het was ongeveer 41 bier.
WEEK AMERIKA Week naar Amerika geweest met Marc en Tom. Hiervoor heb ik een aparte pagina op mijn site gemaakt. Zie bijlage B voor meer informatie hierover.
VRIJDAG 14 DECEMBER 2012 We zouden eigenlijk met heel Sticky wat gaan drinken in Utrecht, maar blijkbaar was het niet voor iedereen duidelijk. Toch gingen we uiteindelijk nog met z’n zessen weg. We waren met Bob, Bastian, Ramana, Jordy en Dennis. Dennis en Bastian waren met de auto dus we konden lekker met de auto naar Utrecht centrum. De parkeergarage was echt een chaos. Het leek wel of Escher de parkeergarage had ontworpen, allemaal rare verdiepingen en verdiepingen waar je niet kon komen. Uiteindelijk was de lift maar 1 verdieping naar beneden en toen stonden we weer op de begaande grond. Gezellig de rest van de avond aan het Neude in een cafeetje gezeten. En ja Marc is een programmeur. Deze avond heb ik weer het geld bij gehouden.
26
VRIJDAG 21 DECEMBER 2012 Vandaag was de laatste dag dat, de stagiaires, Marc en Lars er waren. Het was ook de laatste dag voor de vakantie. Om deze redenen zijn we wat gaan drinken met hele bedrijf. Helaas konden Jeroen en David niet mee gaan. Ik heb natuurlijk veel met Marc gewerkt dus het was wel jammer dat hij weg ging. Hij moest na de vakantie weer naar school. Ik ben vanuit Sticky weer met Bastian mee gereden. We hebben weer bij de Escher garage geparkeerd. Zie de foto hieronder. We hebben eerst bij Broodje Ploff wat gegeten om vervolgens buiten in de kou op het Neude te zitten, hierna zijn we naar de wat warmere Winkel van Sinkel gegaan en hebben hier tot middernacht gezeten.
De super gare indeling van de parkeer garage.
27
CONCLUSIES Mijn voorbereiding heeft me erg goed geholpen met het vinden van een leuk en uitdagende stage. Via mijn portfoliosite wilde ik overbrengen dat ik meer doe dan alleen vakken volgen op school. De sollicitatie is mede hierdoor goed verlopen. Na het sollicitatiegesprek wisten we van elkaar wat we konden verwachten. De manier van werken bij Sticky en de opdrachten die ze krijgen spreken me erg aan. Dit komt omdat de projecten ongeveer 2-3 maanden lopen voor een film en dan ook echt af moeten zijn. Hierdoor blijft je werk heel erg gevarieerd en kan je daarnaast mooie resultaten neerzetten. Ook is het bedrijf niet al te groot waardoor je altijd bij het ontwikkelen van de hele game betrokken bent en je niet 2 -3 maanden bezig bent met één specifiek onderwerp of gedrag. Ik ben meteen goed op mijn plek terecht gekomen. Wat ik vooral geleerd heb is erg veel handige dingen bij programmeren in C# met Unity. Ik begrijp beter hoe bepaalde onderwerpen in C# in elkaar zitten en ook hoe Unity werkt en wat er goed, minder goed en slecht is aan Unity. Ook heb ik veel geleerd over het plannen van taken en het werken met grotere teams via een project server. Het vergaderen en overleggen over wat iedereen doet heeft me ook een hoop geleerd. Game Development is dé baan voor mij. Stage lopen bij Sticky Studios is me erg goed bevallen. Ik heb er veel gedaan en ook veel geleerd. Ik weet zeker dat ik de goede keuze heb gemaakt qua stage en dus ook qua studie. Game Development en programmeren zijn echt mijn ding.
28
BIJLAGEN BIJLAGE A: HET LOGBOEK Mijn logboek is terug te vinden op http://www.simonkarman.nl/internship.php
BIJLAGE B: AMERIKA Hieronder het verslag van de reis naar Amerika. Te vinden op http://www.simonkarman.nl/internship.php Hier een kort artikel erover: http://www.simonkarman.nl/recent/16
BIJLAGE C: MIJN WEBSITE Mijn website: http://www.simonkarman.nl Voor extra informatie over wat ik doe en heb gedaan.
BIJLAGE D: WEBSITE STICKY STUDIOS De website van mijn stage bedrijf, Sticky Studios: http://www.stickystudios.com Voor extra informatie over wat Sticky Studios doet en contact informatie.
BIJLAGE E: REFLECTIEVERSLAG De beoordelingsformulieren die ik van het stage bedrijf en van medestudenten aan school moet leveren. Ook bevat dit de reflectie en nabeschouwing van de stage. Dit verslag is een los verslag bij mijn stageverslag.
29