L’Advisor Leader dell’area Game di NABA, Marco Secchi, ti insegnerà come migliorare la gestione degli oggetti in-game e la loro comunicazione utilizzando Unity Engine e Design Pattern Component.
● Ingegneria Informatica - Politecnico di Milano
● Freelancer - 2005/Present
● NABA Lecturer - 2016/Present
● NABA Lead Advisor - 2022/Present
● AIV - 2022/Present
● Teacher:
○ ZuruTech
○ DigitalBros Game Academy
○ HDEMIA Santa Giulia
● Envato Reviewer - 2009/2015
Il resto lo trovate su LinkedIn…
https://www.linkedin.com/in/secchimarco/
BIO
UN GAME ENGINE E’ UNA COSA COMPLESSA
● Centinaia (o migliaia) di asset, di diversi tipi:
○ Grafica 2D (texture, sprite)
○ Modelli 3D (geometria, scheletri)
○ Animazioni e sequenze animate (cut scenes)
○ Suoni, musica e voice-over
○ Testi
○ Parti di livello (props, blueprints, prefabs)
○ Livelli
○ Etc.
● E non dimentichiamoci del codice…
Un game engine è composto da due componenti principali
Rilevo
evento
Editor
Gira sul PC
dello sviluppatore
Serve per creare e
organizzare gli assets
Rilevo
evento
Runtime
Gira sull’hardware
del giocatore
“Esegue” gli assets sotto
forma di applicazione
EDITOR E RUNTIME
● Input
○ Rilevamento delle interazioni del giocatore (gamepad, tastiera, mouse)
○ Analisi dei dati in funzione della situazione
● Update
○ Calcolo del movimento del giocatore e della telecamera
○ Simulazione dei nemici e della fisica
○ Applicazione della logica di gioco
● Render
○ Output 3D della visuale dal punto di vista della telecamera
○ Output audio in 2D/stereo
ESEMPIO: SPACE SHOOTER
● Il Game Loop continua a ripetersi, anche in assenza di interazioni da parte del
giocatore. Ci sono operazioni che non possono aspettare:
○ Di gioco: fisica, nemici, altri giocatori, effetti visuali, etc.
○ Non di gioco: interfaccia utente, gestione network, etc.
TIME WAITS FOR NOBODY
“Allow a single entity to span multiple domains
without coupling the domain to each other.”
INTENT
MOTIVATION
● Gli oggetti gestiti da un game engine necessitano di comportamenti
complessi combinati tra di loro
● Per progetti di medie/grosse dimensioni risulta impossibile implementare
queste logiche semplicemente tramite ereditarietà
● Spesso risulta impossibile conoscere quali capacità avrà un determinato
oggetto se non a runtime
● L’idea dietro questo pattern è avere la possibilità di aggiungere
comportamenti differenti (e disaccoppiati) ad un oggetto in modo da
renderlo più complesso e funzionale
PATTERN
● Una singola “entità” può comprendere più domini (collisioni, audio, logica di
movimento, etc.)
● Per mantenere ogni dominio isolato, il codice viene implementato in un
componente
● L’entità diventa un semplice contenitore di componenti
UNITY E COMPONENTI
● In Unity il pattern viene implementato tramite:
○ GameObjects: oggetti vuoti il cui compito è contenere componenti
○ Sottoclassi di MonoBehaviour: i componenti veri e propri
● Un GameObject possiede sempre almeno il componente Transform che
contiene le informazioni di Posizione/Rotazione/Scala dell’oggetto