Il Flusso Di Sviluppo Di Un Videogame: Risoluzione Di Bug Per Milestone Ed Unreal Engine
Total Page:16
File Type:pdf, Size:1020Kb
Università degli Studi di Padova Dipartimento di Matematica "Tullio Levi-Civita" Corso di Laurea in Informatica Il flusso di sviluppo di un videogame: risoluzione di bug per Milestone ed Unreal Engine Tesi di laurea Relatore Prof. Davide Bresolin Laureando Riccardo Damiani Anno Accademico 2018-2019 Riccardo Damiani: Il flusso di sviluppo di un videogame: risoluzione di bug per Milestone ed Unreal Engine, Tesi di laurea, c Dicembre 2019. È sapiente solo chi sa di non sapere, non chi s’illude di sapere e ignora così perfino la sua stessa ignoranza. — Socrate Sommario Il presente documento descrive il lavoro svolto durante il periodo di stage, della durata di circa trecentoventi ore, presso l’azienda Milestone Srl con sede a Milano. Lo scopo dello stage è stato apprendere le metodologie di sviluppo software nell’ambito gaming. Particolare attenzione è stata posta sui processi, gli strumenti ed il way of working dell’azienda ospitante. Tra gli strumenti più rilevanti per un programmatore all’interno dell’azienda ci sono senz’altro il motore di gioco Unreal Engine 4, che oltre a fare da ossatura ai vari giochi permette anche lo sviluppo multi-platform, il sistema di versionamento Helix ed il sistema di project management JIRA. 0.1 Organizzazione del testo Il primo capitolo descrive brevemente l’industria dei videogiochi, dalla sua nascita ai giorni d’oggi, e l’azienda che mi sta ospitando come stagista. Il secondo capitolo tratta il workflow di una software house di videogames, con riferimento all’azienda ospitante. Il terzo capitolo introduce il game engine utilizzato da Milestone, Unreal Engine 4, da un punto di vista della programmazione C++. Il quarto capitolo approfondisce ulteriormente Unreal Engine 4, ma da un punto di vista del sistema dei Blueprint. Il quinto capitolo descrive i tools utilizzati all’interno dell’azienda per il supporto allo sviluppo, ed i framework con cui vengono strutturati i diversi giochi di casa Milestone. Il sesto capitolo tratta della mia esperienza iniziale di risoluzione bug, che mi è stata utile per fare i primi passi all’interno del mondo di Unreal e del game development, e per inserirmi in azienda nel team di Moto GP. v Ringraziamenti Le prime persone a cui devo dire grazie per questo traguardo sono i miei genitori, fonte di sostegno e di coraggio, che mi hanno trasmesso la passione per lo studio e la voglia di raggiungere questo traguardo senza arrendermi di fronte alle difficoltà. Vorrei inoltre ringraziare il Prof. Davide Bresolin, relatore della mia tesi, per l’aiuto e il sostegno fornitomi durante la stesura del lavoro. Padova, Dicembre 2019 Riccardo Damiani vii Indice 0.1 Organizzazione del testo . .v 1 L’Industria Videoludica1 1.1 Introduzione . .1 1.2 I Diversi Ruoli . .1 1.3 L’Azienda . .5 1.4 Le Fasi dello Sviluppo . .6 1.5 Le Milestones . 11 2 Il Workflow 15 2.1 Le Fasi dello Sviluppo . 15 2.2 Le Milestones . 19 3 Unreal Engine: Dalla prospettiva del codice 23 3.1 Game Engines . 23 3.2 Programmare in C++ con Unreal Engine 4 . 24 3.2.1 C++ e i Blueprint . 24 3.2.2 Estendere una classe C++ tramite Blueprint . 28 3.2.3 Invocare funzioni da C++ ed internamente ai Blueprint . 29 3.2.4 Le classi di Gameplay: Objects, Actors e Components . 32 3.2.5 Unreal Objects . 32 3.2.6 AActor . 32 3.2.7 UActorComponent . 33 3.2.8 UStruct . 34 3.3 Unreal Reflection System . 35 3.4 Object/Actor Iterators . 37 3.5 Gestione della memoria e Garbage Collection . 37 3.5.1 Garbage Collection e UObject . 38 3.5.2 Garbage Collection e AActor . 38 3.5.3 Riferimenti a Non-UObject . 39 3.6 Prefissi per la nomenclatura delle classi . 40 4 Unreal Engine: Dalla prospettiva dei Blueprint 41 4.1 Il sistema dei Blueprint . 41 4.1.1 Il Blueprint Editor . 41 4.1.2 Le Variabili . 42 4.1.3 Gli Eventi . 43 4.1.4 Le Azioni . 45 4.1.5 Eventi Custom . 46 ix x INDICE 4.1.6 Le Funzioni . 49 4.1.7 Gli Array . 50 4.1.8 Le Struct . 51 4.1.9 Gli Enum . 52 4.1.10 I Branch Condizionali . 54 4.1.11 Switch On Int . 54 4.1.12 For Each Loop . 55 5 Gli Strumenti ed i Framework di Supporto 57 5.1 I Plug-In per UE4 ed Ignition . 57 5.2 Perforce Helix . 58 5.2.1 Helix Core . 59 5.2.2 Gli Stream . 59 5.2.3 Helix Visual Client . 61 5.2.4 I Depot . 61 5.2.5 I Workspace . 62 5.2.6 P4Merge . 62 5.2.7 Helix Swarm . 62 5.3 JIRA . 63 5.3.1 I Core Component di JIRA . 63 5.3.2 Custom Workflows . 63 5.3.3 Bug Workflow . 64 5.3.4 Feature Workflow . 65 6 La mia esperienza a Milestone 67 6.1 Bug Fixing . 67 6.1.1 SX3 - Bug della camera durante caduta del pilota . 67 6.1.2 MGP20 - FastForward Cheat . 68 6.1.3 MGP20 - Audio Collision Debug . 69 6.1.4 MGP20 - Cambio camera . 71 Bibliografia 75 Elenco delle figure 3.1 C++ e i Blueprint - Proprietà di default della classe . 27 3.2 C++ e i Blueprint - Valori di default impostati . 27 3.3 C++ e i Blueprint - Valori caricati dopo il costruttore . 28 3.4 C++ e i Blueprint - Valori dopo l’invocazione di PostInitProperties() . 28 3.5 Estendere una classe C++ tramite Blueprint - Valori modificati . 28 3.6 Estendere una classe C++ tramite Blueprint - Valori "DamagePerSe- cond" aggiornato . 29 3.7 Invocare funzioni da C++ ed internamente ai Blueprint - Categorie associate alle funzioni . 30 3.8 Invocare funzioni da C++ ed internamente ai Blueprint - Aggiornamento di "TotalDamage" . 30 3.9 UActorComponent - Albero dei componenti . 34 3.10 UActorComponent - I componenti nell’editor . 35 4.1 Editor dei Blueprint . 42 4.2 Le Variabili - Tipi di variabili . 43 4.3 Le Variabili - Creazione di una variabile . 44 4.4 Gli Eventi - Categorie di Eventi . 44 4.5 Gli Eventi - Eventi d’esempio . 45 4.6 Le Azioni - Inizializzazione con BeginPlay . 45 4.7 Le Azioni - Inizializzazione di due variabili . 45 4.8 Le Azioni - Distruzione di "Self" . 46 4.9 Le Azioni - Distruzione di "Other" . 46 4.10 Le Azioni - Distruzione di "ItemBP" . 46 4.11 Eventi Custom - Aggiunta di un nuovo Evento . 47 4.12 Eventi Custom - Configurazione Evento Custom . 47 4.13 Eventi Custom - Custom Event "AddScore" . 48 4.14 Eventi Custom - "Cast To" Action . 48 4.15 Eventi Custom - Caso d’uso di "Set Timer By Event" . 48 4.16 Le Funzioni - Aggiunta di una nuova Funzione . 49 4.17 Le Funzioni - Configurazione di una Funzione . 49 4.18 Le Funzioni - Esempio di funzione: "EnemiesLeft" . 50 4.19 Gli Array - Trasformazione di una variabile in un Array . 50 4.20 Gli Array - Popolamento di un Array . 50 4.21 Gli Array - Caso d’uso: Calcolo del punteggio . 51 4.22 Le Struct - Popolamento di una Struct . 51 4.23 Le Struct - Trasformazione di una variabile in una Struct . 51 4.24 Le Struct - Esempio di Struct "TNT" . 52 xi xii ELENCO DELLE FIGURE 4.25 Le Struct - Azioni "Break" e "Make" di una Struct . 52 4.26 Gli Enum - Aggiunta di un nuovo Enum . 53 4.27 Gli Enum - Popolamento di un Enum . 53 4.28 Gli Enum - Configurare un Enum . 53 4.29 Gli Enum - Caso d’uso: Cambio di mesh . 53 4.30 I Branch Condizionali - Caso d’uso: Controllo del punteggio . 54 4.31 I Branch Condizionali - Caso d’uso: Gestione salute . 54 4.32 Switch On Int - Caso d’uso: Difficoltà e num. nemici . 55 4.33 Switch On Int - Caso d’uso: Risposta in base al num. di domande . 55 4.34 For Each Loop - Caso d’uso: Aggiornamento "Best Score" e "Best Player" 56 4.35 For Each Loop - Caso d’uso: Spegnimento lampade . 56 5.1 Lo stato attuale dei moduli di Ignition . 58 5.2 Gli Stream di Helix Core . 59 5.3 Lo Stream Mainline . 59 5.4 Lo Stream Release . 60 5.5 Lo Stream Development . 60 5.6 Lo Stream Task . 60 5.7 Lo Stream Virtual . 61 5.8 Default Workflow . 64 6.1 Modifiche apportate a GameBaseVehicle.h ................ 68 6.2 Modifiche apportate a GameBaseVehicle.cpp .............. 69 6.3 Modifiche apportate a IgnitionPlayerController.cpp ........... 70 6.4 Modifiche apportate.