UNIVERSITÀ DEGLI STUDI DI TRENTO
FACOLTÀ DI SCIENZE MATEMATICHE, FISICHE E NATURALI
Corso di Laurea Triennale in INFORMATICA
Elaborato Finale
SVILUPPO DI UN SERIOUS GAME PER LA SCUOLA
DI BASE CON IMPIEGO DI WIIMOTE
QUALE NUOVA METAFORA D’INTERAZIONE
Relatore:
prof. Alberto Montresor
Correlatori: dott. Raffaele de Amicis
dott. Gabrio Girardi
Candidato:
Silvia Bordin
ANNO ACCADEMICO
2008 - 2009
2
Indice
1
Introduzione
1
2
Motivazioni e riferimenti teorici
4
2.1 Perché un serious game? . . . . . . . . . . . . . . . . . . . . . . . .
4
2.2 Digital natives e digital immigrants . . . . . . . . . . . . . . . . . .
6
2.3 Efficacia dei videogames per l’apprendimento: la sperimentazione DANT 6
3
Il controller Wii Remote
4
Strumenti di sviluppo: Unity3D
4.1 Caratteristiche principali di Unity3D . . . . . . . . . . . . . . . . . .
4.2 Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.1 Il plugin UniWii . . . . . . . . . . . . . . . . . . . . . . . .
4.2.2 Funzioni impiegate . . . . . . . . . . . . . . . . . . . . . . .
4.3 Scripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3.1 Glossario . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3.2 Funzioni principali . . . . . . . . . . . . . . . . . . . . . . .
4.3.3 Differenze tra C# e JavaScript . . . . . . . . . . . . . . . . .
4.3.4 Istruzione yield . . . . . . . . . . . . . . . . . . . . . . . .
4.3.5 Coroutines . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3.6 Compilazione degli script e comunicazione fra linguaggi diversi
14
15
15
16
17
19
19
20
20
21
22
24
5
Storyboard
5.1 Le novità introdotte . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Storyboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2.1 Il primo microgame . . . . . . . . . . . . . . . . . . . . . . .
5.2.2 Il secondo microgame . . . . . . . . . . . . . . . . . . . . .
5.2.3 Il terzo microgame . . . . . . . . . . . . . . . . . . . . . . .
5.2.4 Il quarto microgame . . . . . . . . . . . . . . . . . . . . . .
5.2.5 Il quinto microgame . . . . . . . . . . . . . . . . . . . . . .
5.3 Gestione del movimento della pallina a partire dai dati letti dal WiiMote
26
26
27
32
33
34
35
36
38
8
i
6
Activity diagrams
40
7
Difficoltà incontrate
7.1 UniWii non supporta la Balance Board . . . . . . . . . . . . . . . . .
7.2 Unitron non prevede debugger . . . . . . . . . . . . . . . . . . . . .
7.3 Scarsa documentazione tecnica reperibile per WiiMote . . . . . . . .
52
52
53
53
8
Sviluppi possibili
8.1 Sviluppi tecnici . . . . . . . . . . . . . . . . . . .
8.1.1 Il multiplayer . . . . . . . . . . . . . . . .
8.1.2 Versione per dispositivo mobile . . . . . .
8.2 Sviluppi contenutistici . . . . . . . . . . . . . . .
8.2.1 Struttura flessibile . . . . . . . . . . . . .
8.2.2 Raccolta statistiche . . . . . . . . . . . . .
8.3 Sviluppi metodologici: questionario di valutazione
55
55
55
56
56
56
57
57
9
Nota conclusiva
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
58
Bibliografia
58
ii
Capitolo 1
Introduzione
Questa tesi è il risultato dell’ampliamento e dell’approfondimento di quanto appreso e sperimentato durante lo stage presso la Fondazione GraphiTech di Trento. Tale
opportunità mi ha permesso di accostarmi alle realizzazioni nell’ambito della computer
graphics del gruppo di lavoro della stessa azienda; il mio percorso è quindi approdato
alla costruzione di un prototipo di serious game rivolto agli alunni della scuola di base.
L’impiego dei videogiochi nell’ambito formativo ed educativo, non solo ludico, è
sempre più esteso e specializzato: la parola chiave che spiega questo crescente successo è edutainment, un neologismo anglosassone che fonde i due termini educational ed
entertainment: imparare giocando. Numerose sperimentazioni e ricerche hanno dimostrato che il learning e il play possono fondersi attraverso le tecnologie dando vita ad
un circolo virtuoso in cui ci si diverte imparando e si impara divertendosi.
Naturalmente, accanto agli entusiasti dei serious games ci sono coloro che, invece, ne sottolineano gli aspetti negativi (riduzione dell’istruzione ad intrattenimento,
disattenzione e disorientamento cognitivo): molti studi, comunque, rilevano che ormai
l’approccio alla conoscenza dei digital natives – non lineare, simultaneo, iconico –
non può prescindere dai videogiochi. Il problema è come collocare nel contesto scolastico, strutturato piuttosto per un tipo di apprendimento tendenzialmente frontale e
riproduttivo, il videogioco, identificando quali stimoli susciti e quali specifiche abilità
consenta di esercitare meglio di altri strumenti.
1
Oggi la letteratura sull’apprendimento tramite videogiochi è ricca e varia e molti
sono stati i lavori di ricerca sperimentale condotti in diversi ambiti, da quello militare
a quello della finanza, della scienza, delle attività produttive, delle relazioni sociali,
della scuola.
In questa tesi mi soffermo su un segmento di quest’ultimo settore, quello della
scuola primaria: dopo alcuni brevi riferimenti teorici sulle ragioni pedagogiche e didattiche dell’impiego dei serious games, riassumo i contenuti e i risultati del progetto
dell’IPRASE di Trento denominato “DANT”, una sperimentazione curricolare durata
quattro anni, attentamente monitorata e validata, che ha visto un gruppo di ricercatori
realizzare dei videogiochi bidimensionali che hanno contribuito a migliorare le conoscenze matematiche e linguistiche dei bambini della scuola primaria.
Passo quindi a sottolineare gli aspetti tecnici e le novità del prototipo che ho costruito: un serious game tridimensionale con utilizzo di WiiMote in sostituzione di
mouse e tastiera. Scopo del gioco, intitolato L’isola di Wii, è far correre una biglia
lungo un percorso che si snoda in un’isola e risolvere i microgames di argomento matematico in cui ci si imbatte lungo tale percorso.
L’ultima sezione della tesi ipotizza quali sviluppi tecnici e metodologici si potrebbero apportare a L’isola di Wii: dalla sperimentazione sul campo ad una maggiore
configurabilità dei microgames.
2
Ho scelto di sviluppare un videogioco da proporre in ambito scolastico in seguito
ad uno stimolante colloquio con il prof. Romano Nesler, coordinatore del progetto
DANT, e con alcuni insegnanti della scuola primaria che avevano utilizzato in classe i
videogiochi.
Dopo aver letto il rapporto sull’attività di ricerca e sperimentazione del progetto
DANT e la convincente presentazione del prof. Antinucci – studioso molto critico nei
confronti del tradizionale modo di apprendere su cui si fonda la scuola ed autore di un
testo dal titolo eloquente, La scuola si è rotta [21] –, ho chiesto ad alcune maestre un
parere su questa nuova modalità di insegnamento / apprendimento: queste sono state
concordi nel sottolineare l’efficacia dei giochi da loro utilizzati, sia per consolidare
nell’alunno concetti già trattati, sia nell’apprendimento per scoperta, cioè come primo
approccio ai contenuti. Mi hanno inoltre riferito che i bambini si esercitavano volentieri anche a casa con i giochi proposti e consideravano le lezioni con il computer come
un vero e proprio premio, un’ora di divertimento.
Il prof. Nesler, in base alle sue esperienze e ai risultati delle sue indagini, mi ha indirizzato nella scelta della disciplina su cui impostare il nuovo gioco, la matematica, e
sui contenuti da privilegiare: calcolo mentale rapido, calcolo scritto, tavola pitagorica,
addizioni e sottrazioni.
3
Capitolo 2
Motivazioni e riferimenti teorici
2.1
Perché un serious game?
Durante il mio tirocinio presso la Fondazione GraphiTech ho avuto modo di entrare
in contatto con alcune ricostruzioni virtuali di beni culturali ed archeologici: in particolare, il team di GraphiTech ha lavorato al progetto NETConnect [1], che ha coinvolto
diverse università europee con l’obiettivo di promuovere il patrimonio culturale ed artistico attraverso la ricostruzione virtuale di tre importanti siti archeologici presenti in
Italia, Germania e Polonia.
Ho potuto constatare che per realizzare progetti di questo tipo è necessaria la collaborazione interdisciplinare di figure professionali diverse, dallo storico all’archeologo,
dall’informatico all’esperto di pedagogia e di didattica. Il prodotto finale, oltre che il
risultato di una riuscita integrazione di diversi linguaggi e tecnologie, è un ottimo mezzo di divulgazione culturale.
Questa esperienza, che ha immediatamente suscitato il mio interesse, mi ha dato l’opportunità di ampliare le mie conoscenze sulle ricostruzioni virtuali di ambienti
storici ed artistici: consultando vari siti ed articoli sul tema, ho notato che spesso, per
avvicinare i giovani all’apprendimento dell’arte e della storia, si ricorre ai videogiochi,
una forma di comunicazione ludica a loro particolarmente gradita e congeniale (The
forbidden city sviluppato da IBM [2], Rome Reborn sviluppato dall’Università della
Virginia [3], Travel in Europe promosso dall’Unione Europea [4], VeGame a cura dell’Università di Genova [5]).
La diffusione dei serious games come strumento di apprendimento è giustificata
da varie ragioni: il gioco è un’attività coinvolgente e motivante, accresce sia la com-
4
petizione che la collaborazione tra pari e può migliorare lo sviluppo di alcune abilità,
soprattutto nella generazione dei digital natives.
5
2.2
Digital natives e digital immigrants
La fortunata espressione digital natives, coniata da Marc Prensky [35], indica la
prima generazione interamente digitale, che padroneggia come una lingua madre il linguaggio del computer, di Internet, dei telefoni cellulari; essa, esposta fin dall’infanzia
ad un apprendimento visivo ed iconico in cui la qualità della grafica riduce l’importanza del testo, ha modalità di apprendimento diverse da quelle dei digital immigrants,
cioè di coloro che hanno appreso in età adulta ad utilizzare tecnologie digitali e sulle
quali hanno trasferito il loro atteggiamento ancora “gutenberghiano” [6].
Questi ultimi apprendono in modo sequenziale, privilegiano il testo scritto e considerano le immagini un corollario, stampano i documenti digitali per revisionarli, telefonano al destinatario della mail per avere conferma della ricezione. I digital natives,
invece, apprendono le informazioni da fonti multiple, hanno sviluppata una naturale
propensione per processi definiti “multitasking”, ovvero svolgono più attività contemporaneamente (ad esempio, mentre rispondono al cellulare fanno zapping con la TV e
nello stesso tempo sono attivi in una chat); hanno più attenzione per l’immagine che
per il testo scritto, imparano ad usare un software istintivamente e senza leggerne prima il manuale di istruzioni [35].
Risulta evidente la distanza tra i sistemi di apprendimento tradizionali e quelli delle nuove generazioni; si spiega altresı̀ perché i serious games siano considerati da
molti pedagogisti strumenti innovativi congeniali allo stile di apprendimento dei digital natives e, quindi, siano utilizzati anche a scuola, all’interno delle normali attività
didattiche.
2.3
Efficacia dei videogames per l’apprendimento: la
sperimentazione DANT
Il progetto DANT (Didattica Assistita dalle Nuove Tecnologie), rivolto soprattutto
alla scuola primaria e promosso dall’IPRASE del Trentino, è stato realizzato da un
gruppo di docenti coordinato dal prof. Romano Nesler con la supervisione scientifica
del prof. Francesco Antinucci dell’Istituto di Scienze e Tecnologie della Cognizione
del CNR di Roma.
La ricerca ha preso l’avvio da quanto emerso nel VI rapporto del Comitato di Valutazione del sistema scolastico trentino: nel 2001 il 20% degli alunni trentini usciva
dalla scuola primaria con carenze nei contenuti fondanti della matematica e dell’italiano. Attraverso la sperimentazione DANT si è voluto dimostrare che l’utilizzo di
6
videogiochi a supporto della didattica ordinaria aumenta la motivazione degli alunni e
le loro prestazioni.
Il progetto DANT, condotto dall’anno scolastico 2001/02 all’anno scolastico
2004/05, ha coinvolto 1865 docenti e 35000 alunni in tutto il territorio nazionale ed
ha prodotto 101 giochi relativi a varie materie. Tali giochi, sperimentati per almeno
tre anni, hanno subito numerose revisioni in base ai suggerimenti e alle proposte dei
docenti sperimentatori. Essi sono tutti disponibili sul sito dell’IPRASE [7]: si possono
scaricare gratuitamente (versione per Windows), oppure fruire direttamente (versione
per browser); entrambe le versioni del software sono realizzate a partire dallo stesso
codice sorgente Flash. Ad ogni gioco è associata una scheda informativa che ne riporta
il titolo, una breve descrizione della dinamica di funzionamento, il contenuto, l’età del
bambino a cui è rivolto, le possibilità di configurazione e note tecniche.
Per la metodologia utilizzata dal gruppo degli sperimentatori (circa trenta persone:
esperti di grafica, comunicazione, tecnologie e molti insegnanti) rinvio alla dettagliata
esposizione del prof. Nesler contenuta nel rapporto sul quadriennio della sperimentazione DANT [34].
Il monitoraggio sulla sperimentazione ha prodotto una notevole quantità di dati riguardanti l’efficacia dei giochi, le modalità di utilizzo da parte dei docenti e i risultati
ottenuti [34]. Tali dati hanno confermato le due ipotesi fondanti del progetto: i serious games sono capaci di migliorare i risultati di apprendimento e di aumentare la
motivazione degli alunni.
Per questo il progetto DANT da attività di tipo sperimentale è diventato prassi
didattica quotidiana. I giochi si sono rapidamente diffusi dall’ambiente scolastico ad
altri contesti e cosı̀ sono diventati risorse per la comunità educante nel suo complesso
e non solo per la scuola in sé [34].
7
Capitolo 3
Il controller Wii Remote
Una delle componenti che differenzia L’isola di Wii dagli altri serious games presi
in esame durante la fase di ricognizione dello stato dell’arte è l’impiego del controller
Wii Remote (altrimenti detto WiiMote) come metafora d’interazione.
Figura 3.1: La console Nintendo Wii
8
Il WiiMote è il controller principale per la console Nintendo Wii. La caratteristica
più innovativa del dispositivo è la sua capacità di rilevare i movimenti grazie all’impiego di un accelerometro a tre assi, in grado di misurare le accelerazioni lungo ciascuno
degli assi cartesiani; unitamente al design simile a quello di un telecomando, questa
feature rende l’esperienza di gioco tramite WiiMote più intuitiva e coinvolgente, in
quanto si richiede al giocatore di simulare effettivamente dei gesti anziché limitarsi a
premere dei pulsanti. L’utente, dunque, sperimenta immersivamente il gioco in prima
persona, invece di osservare semplicemente il movimento del proprio personaggio.
Figura 3.2: Il controller WiiMote
9
Figura 3.3: Il controller WiiMote all’interno
10
Il WiiMote è anche in grado di rilevare le rotazioni lungo i tre assi cartesiani, come
illustrato in figura 3.4. Il controller presenta inoltre vari pulsanti e ha la possibilità di
vibrare in corrispondenza di particolari azioni.
Figura 3.4: Assi e rotazioni del WiiMote
11
Le capacità del WiiMote non si limitano però al solo “motion sensing”: il controller, infatti, comprende anche un sensore ottico che, insieme alla cosiddetta Sensor
Bar, ne consente l’uso anche come dispositivo di puntamento. La Sensor Bar presenta
cinque Led a ciascuna estremità e va posizionata sopra o sotto lo schermo verso cui
punterà il WiiMote. Il sensore a infrarossi integrato nel WiiMote è in grado di rilevare
la luminosità dei Led e di calcolare, a partire da essa, a quale distanza il controller
stesso si trovi rispetto alla Sensor Bar e di quanto esso sia ruotato rispetto al terreno;
ciò consente quindi un puntamento efficace.
Figura 3.5: La Sensor Bar
Il WiiMote prevede inoltre una porta di espansione alla quale possono essere collegati diversi devices aggiuntivi, in modo da estendere le funzionalità del controller. È
utile citare il Nunchuk , in quanto è l’espansione di default, nonché quella utilizzata in
L’isola di Wii: si tratta di un controller più piccolo ed ovoidale, provvisto di un joystick
analogico, due pulsanti e un accelerometro analogo a quello del WiiMote. Il Nunchuk
completa il controller principale, permettendo al giocatore di utilizzare entrambe le
mani per interagire con i giochi per Wii.
12
Figura 3.6: L’espansione Nunchuk
Più avanti, nel paragrafo 7.1, verrà menzionata anche la Wii Balance Board , un’estensione del tutto simile ad una bilancia pesapersone che, contenendo quattro sensori di pressione, può essere utilizzata per rilevare baricentro e peso del giocatore e
controllare dunque le azioni di gioco tramite gli spostamenti corporei.
Figura 3.7: La Wii Balance Board
13
Capitolo 4
Strumenti di sviluppo: Unity3D
Unity3D [8] è un game development tool multipiattaforma per lo sviluppo di contenuti 3D interattivi, quali videogames, ricostruzioni di ambienti o animazioni. Come
i più diffusi game engines (quali Torque, per citare uno dei più celebri), prevede un
ambiente grafico integrato che costituisce il mezzo principale attraverso il quale realizzare il design del gioco.
Figura 4.1: Il logo di Unity3D
La prima versione di Unity3D risale al giugno 2005 ed era funzionante unicamente su sistema operativo Mac OS. Nel corso degli anni sono state rilasciate versioni
compatibili anche con Windows, fino a giungere alla versione 2.5, che è quella da me
impiegata nella realizzazione di questo progetto: essa, in base al tipo di licenza acquistata, è in grado di sviluppare videogames per Mac OS X, Windows (XP e Vista),
browser, Wii ed iPhone.
14
4.1
Caratteristiche principali di Unity3D
• Unity3D prevede, come detto sopra, un editor grafico, i cui componenti principali sono un property inspector gerarchico (da cui è possibile modificare facilmente, e soprattutto tramite drag-and-drop, le proprietà degli oggetti inseriti
nelle varie scene) e una finestra di preview del gioco;
• i programmi sviluppati con Unity3D sono fruibili da numerose piattaforme e
browser;
• è possibile importare facilmente modelli tridimensionali realizzati con i più comuni applicativi dedicati, quali Maya, 3DStudio Max, Blender;
• gli Assets, ossia i files e risorse che costituiscono un progetto, vengono automaticamente importati ed aggiornati sia che vengano modificati internamente che
esternamente all’editor;
• il motore grafico può utilizzare sia DirectX che OpenGL che API proprietarie,
garantendo cosı̀ il funzionamento dei software sviluppati sul maggior numero
possibile di sistemi operativi e schede grafiche;
• la fisica è gestita automaticamente dal physics engine PhysX [9], sviluppato da
Ageia ed ora acquisito da Nvidia;
• Unity3D consente la creazione di script in C#, JavaScript e Boo: i tre linguaggi
vengono indifferentemente compilati in codice nativo di rapida esecuzione. I
tre linguaggi sfruttano tutti un’implementazione open source della piattaforma
.NET, Mono [10].
4.2
Plugins
Esistono vari tipi di licenza per Unity3D: alcuni sono dedicati allo sviluppo per
particolari piattaforme, come iPhone o Nintendo Wii, ma i due principali [11] sono
relativi allo sviluppo di applicativi per Mac e Windows. Unity Indie è la versione “base”, con la quale è comunque possibile realizzare videogames di tutto rispetto; alcuni
aspetti avanzati, però, come il supporto per plugins scritti in C, C++, Objective C, richiedono invece l’utilizzo della licenza Unity Pro. Questo è anche il caso di L’isola di
Wii, che è dunque stato realizzato proprio sotto quest’ultimo tipo di licenza in quanto
la comunicazione con il WiiMote avviene tramite un plugin.
I plugins devono essere copiati all’interno di una directory dedicata (Assets/Plugins), che contiene anche la maggior parte degli script. Includendo sia il file .bundle
15
che il file .dll per uno stesso plugin, Unity3D si occupa automaticamente di scegliere
il plugin adatto alla piattaforma su cui si sta correntemente eseguendo l’applicativo
(rispettivamente Mac OS X o Windows): la realizzazione di software cross-platform è
dunque molto semplice.
Quando le funzioni offerte dal plugin devono essere impiegate all’interno di uno
script in C#, è necessario dichiararle esplicitamente all’inizio del file:
Listing 4.1: Dichiarazione di funzioni offerte da plugins esterni
1
2
[ DllImport ( ' ' PluginName ' ' ) ]
p r i v a t e s t a t i c e x t e r n v o i d PluginFunction ( ) ;
4.2.1
Il plugin UniWii
UniWii [12] è il plugin per Unity3D che ho impiegato per realizzare la comunicazione con il WiiMote. Inizialmente disponibile solo per Mac e recentemente sviluppato
anche per Windows, UniWii si appoggia al framework DarwiinRemote [13] per connettere via Bluetooth il controller al computer e leggere da esso i dati di movimento
rilevati; il plugin espone poi un’interfaccia che consente di manipolare facilmente tali
dati.
DarwiinRemote è basato su un modello event-driven, ma Unity3D non è in grado di rilevare eventi che accadano al di fuori dell’engine stesso: la lettura di dati dal
WiiMote, dunque, è effettuata tramite polling. In particolare, le funzioni rese disponibili dall’interfaccia vengono sempre chiamate all’interno di metodi quali Update()
o OnTriggerStay(), che per loro natura vengono eseguiti ciclicamente.
UniWii supporta gli accelerometri e i pulsanti sia del WiiMote che del Nunchuk,
oltre ai sensori a infrarossi e alla vibrazione: non è però in grado di gestire la Balance
Board.
Da prove preventivamente eseguite in GraphiTech, inoltre, è emerso che il funzionamento di UniWii con la Sensor Bar presenta delle fastidiose pecche: ad esempio,
succede che la direzione del movimento rilevata si inverta improvvisamente. Abbiamo ritenuto, quindi, di sfruttare piuttosto il Nunchuk per ottenere un puntamento più
preciso.
In generale, comunque, anche i dati che UniWii riporta dagli accelerometri sono
ancora imprecisi: ad esempio, non è stato possibile riuscire a distinguere un movimento orizzontale da uno verticale tramite la sola lettura dei dati relativi al WiiMote.
16
Questo ha inevitabilmente posto delle limitazioni alla gestualità rilevabile e quindi alle
tipologie di microgames implementabili.
4.2.2
Funzioni impiegate
Segue una descrizione delle funzioni offerte da UniWii impiegate in L’isola di Wii.
Listing 4.2: Funzioni di avvio e spegnimento dei WiiMote
1
2
3
4
5
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n v o i d wiimote_start ( ) ;
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n v o i d wiimote_stop ( ) ;
La prima funzione rileva i WiiMote accesi e si occupa di instaurare la connessione
Bluetooth fra essi e il computer; la seconda spegne i WiiMote al termine del gioco.
Listing 4.3: Calcolo del numero di WiiMote
1
2
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n i n t wiimote_count ( ) ;
Restituisce il numero di WiiMote rilevati e connessi.
Listing 4.4: Rilevamento espansioni
1
2
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n b o o l wiimote_isExpansionPortEnabled ( i n t which ) ;
Restituisce true se il WiiMote individuato dall’indice passato come parametro ha un’espansione (un Nunchuk) collegata alla propria porta.
Listing 4.5: Lettura dei dati forniti dall’accelerometro di un WiiMote
1
2
3
4
5
6
7
8
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n b y t e wiimote_getAccX ( i n t which ) ;
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n b y t e wiimote_getAccY ( i n t which ) ;
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n b y t e wiimote_getAccZ ( i n t which ) ;
Rilevano il valore registrato dall’accelerometro di un dato WiiMote lungo un certo asse
cartesiano.
17
Listing 4.6: Lettura del roll
1
2
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n f l o a t wiimote_getRoll ( i n t which ) ;
Rileva il valore di roll (cioè l’oscillazione lungo l’asse Y) di un dato WiiMote.
Listing 4.7: Lettura dei valori ottenuti dalla leva del Nunchuk
1
2
3
4
5
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n b y t e wiimote_getNunchuckStickX ( i n t which ) ;
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n b y t e wiimote_getNunchuckStickY ( i n t which ) ;
Rileva i valori di spostamento della leva del Nunchuk collegato ad un dato WiiMote.
Listing 4.8: Lettura degli accelerometri di un Nunchuk
1
2
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n b y t e wiimote_getNunchuckAccZ ( i n t which ) ;
Rileva il valore che l’accelerometro contenuto nel Nunchuk collegato ad un dato WiiMote legge lungo l’asse Z (verticale).
Listing 4.9: Rilevamento della pressione dei pulsanti di un WiiMote
1
2
3
4
5
6
7
8
9
10
11
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n b y t e wiimote_getButtonA ( i n t which ) ;
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n b y t e wiimote_getButtonPlus ( i n t which ) ;
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n b y t e wiimote_getButtonMinus ( i n t which ) ;
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n b y t e wiimote_getButtonHome ( i n t which ) ;
Restituiscono true fintantoché il pulsante considerato di un dato WiiMote resta premuto.
Listing 4.10: Rilevamento della pressione dei pulsanti di un Nunchuk
1
2
[ DllImport ( ' ' UniWii ' ' ) ]
p r i v a t e s t a t i c e x t e r n b o o l wiimote_getButtonNunchuckZ ( i n t which ) ;
Restituisce true finché il pulsante Z del Nunchuk collegato ad un dato WiiMote resta
premuto.
18
4.3
Scripting
Come accennato in 4.1, Unity3D supporta la creazione di script in tre linguaggi
diversi: C#, JavaScript e Boo. Durante lo sviluppo del progetto, ho impiegato principalmente C#; JavaScript è stato invece riservato alla gestione delle coroutines, come
verrà spiegato più dettagliatamente in seguito (paragrafo 4.3.5).
4.3.1
Glossario
Introduciamo innanzitutto un breve glossario che illustra la terminologia di base
riguardante Unity3D.
• MonoBehaviour: classe base da cui ereditano tutti gli script, in qualsiasi linguaggio essi siano scritti.
• GameObject: classe base per tutti gli oggetti che compaiono in una scena; consente l’accesso a proprietà comuni come la posizione, la rotazione,
i Components associati.
• Component: un qualunque oggetto “figlio” di un GameObject, cioè associato
ad esso: quindi, un Component è anche un GameObject, ma un GameObject che
funge da root di una gerarchia di oggetti non è un Component.
• Rigidbody: Component che si occupa della gestione della fisica applicata al
GameObject cui è associato.
• Collider: componente che fa sı̀ che il GameObject cui è associato rilevi le collisioni con altri corpi. Esso prevede una proprietà detta IsTrigger: se questa
è impostata a true, le collisioni non vengono più rilevate dal rigidbody, bensı̀
generano tre tipi di messaggio:
OnTriggerEnter: generato quando un Collider entra nel trigger;
OnTriggerStay: generato una volta per ogni frame fintantoché un Collider permane all’interno del trigger;
OnTriggerExit: generato all’uscita di un Collider dal trigger;
tali messaggi vengono ricevuti da funzioni dedicate eventualmente presenti negli
script associati ai due GameObject coinvolti nella collisione.
Ciascuno script, per funzionare, dev’essere associato come Component ad un
GameObject.
19
4.3.2
Funzioni principali
Vediamo ora le principali funzioni di cui è previsto l’override in uno script Unity3D:
• Start(): comprende tutte le azioni di inizializzazione che devono essere compiute al momento del caricamento dello script e comunque prima che la funzione
Update() venga chiamata per la prima volta;
• Update(): funzione che viene automaticamente chiamata all’inizio di ogni
frame e che dunque contiene la maggior parte del codice;
• OnGUI(): funzione che viene anch’essa chiamata automaticamente all’inizio
di ogni frame e che si occupa di gestire gli eventi e gli oggetti relativi alla GUI;
• OnTriggerEnter(): quando un Collider entra nel trigger che circonda un
GameObject, tale funzione viene chiamata sia nello script associato al GameObject che ha generato la collisione sia nello script associato al
GameObject che è stato urtato;
• OnTriggerStay(): questa funzione viene chiamata automaticamente una
volta per ogni frame fintantoché un Collider rimane nel trigger che circonda un
GameObject; essa viene invocata sia nello script associato al GameObject che ha
generato la collisione sia nello script associato al GameObject che è stato urtato;
• OnTriggerExit(): quando un Collider esce dal trigger che circonda un
GameObject, tale funzione viene chiamata sia nello script associato al GameObject che ha generato la collisione sia nello script associato al GameObject che
è stato urtato.
4.3.3
Differenze tra C# e JavaScript
Le differenze salienti tra tali due linguaggi sono le seguenti:
• Ereditarietà da MonoBehaviour: MonoBehaviour è la classe base da cui
tutti gli script devono ereditare. In JavaScript l’ereditarietà è implicita, mentre
in C# dev’essere specificata esplicitamente.
Listing 4.11: Ereditarietà esplicita in C#
1
2
3
4
p u b l i c c l a s s StarScript : MonoBehaviour
{
// ...
}
20
• Inizializzazione: ogni script in JavaScript è una raccolta di variabili e funzioni,
mentre ciascuno script in C# costituisce invece una classe a sé stante. Pertanto,
il codice di inizializzazione va posto al di fuori di tutte le funzioni in JavaScript,
in Start() o Awake() nel caso di C#.
Listing 4.12: Inizializzazione in C#
1
2
3
4
5
6
7
8
v o i d Start ( ) {
wiimote_start ( ) ;
/ / a v v i a l a c o n n e s s i o n e con i l WiiMote
fader = GameObject . Find ( ” F a d i n g S c r i p t ” ) ;
DontDestroyOnLoad ( fader ) ;
/ / i m p e d i s c e che l ' o g g e t t o i n c a r i c a t o d i a p p l i c a r e i l f a d i n g
/ / venga d i s t r u t t o d u r a n t e i l c a r i c a m e n t o d e l l i v e l l o s u c c e s s i v o
}
• Nome del file: in C#, ogni classe dev’essere rinominata manualmente con lo
stesso identificativo del file che la contiene.
• Diversa sintassi delle coroutines: in C#, una coroutine deve avere IEnumerator
come tipo di ritorno e dev’essere esplicitamente avviata, come vedremo più
dettagliatamente in seguito.
4.3.4
Istruzione yield
Di per sé, Unity3D presuppone che il comportamento di un oggetto venga descritto frame per frame. Si consideri, ad esempio, la funzione principale di ogni script,
cioè Update(): essa viene richiamata una volta per ciascun frame. In alcuni casi,
però, può essere necessario descrivere un comportamento lungo un arco di tempo che
occupa vari frame: diventa allora conveniente impiegare l’istruzione yield. Si tratta
di un tipo particolare di istruzione return, che fa in modo che la funzione di cui fa
parte riprenda la propria esecuzione dall’istruzione successiva a quella di yield la
prossima volta che è richiamata.
Un utilizzo particolare di yield prevede l’introduzione di WaitForSeconds(),
istruzione che ritarda l’esecuzione di Update() di un numero di secondi passati
come parametro ad essa.
Listing 4.13: Utilizzo di WaitForSeconds()
1
yield WaitForSeconds ( 2 . 0 ) ; / / s o s p e n d e l ' e s e c u z i o n e p e r due s e c o n d i
Yield può essere impiegata in due modi:
• avvia un thread parallelo, ma continua immediatamente l’esecuzione della funzione chiamante;
21
Listing 4.14: Thread parallelo che non sospende l’esecuzione principale (JavaScript)
1
2
3
4
5
6
7
8
9
10
11
12
13
print ( ” Tempo d i i n i z i o : ” + Time . time ) ;
WaitAndPrint ( ) ;
print ( ” C o n c l u s i o n e : ” + Time . time ) ;
f u n c t i o n WaitAndPrint ( ) {
yield WaitForSeconds ( 2 . 0 ) ; / / s o s p e n d e l ' e s e c u z i o n e p e r due s e c o n d i
print ( ” W a i t A n d P r i n t : ” + Time . time ) ;
}
//
//
//
//
l ' output e ` i l seguente :
Tempo d i i n i z i o : 0 . 0
Conclusione : 0.0
WaitAndPrint : 2.0
• avvia un thread figlio e ne attende la terminazione prima di riprendere l’esecuzione della funzione principale.
Listing 4.15: Thread parallelo di cui si attende la terminazione (JavaScript)
1
2
3
4
5
6
7
8
9
10
11
12
13
4.3.5
print ( ” Tempo d i i n i z i o : ” + Time . time ) ;
yield WaitAndPrint ( ) ; / / n o t a r e l ' u s o d i y i e l d
print ( ” C o n c l u s i o n e : ” + Time . time ) ;
f u n c t i o n WaitAndPrint ( ) {
yield WaitForSeconds ( 2 . 0 ) ; / / s o s p e n d e l ' e s e c u z i o n e p e r due s e c o n d i
print ( ” W a i t A n d P r i n t : ” + Time . time ) ;
}
//
//
//
//
l ' output e ` i l seguente :
Tempo d i i n i z i o : 0 . 0
WaitAndPrint : 2.0
Conclusione : 2.0
Coroutines
L’impiego delle coroutines, la cui esecuzione può essere sospesa in qualsiasi momento proprio da un’istruzione yield, è diverso in JavaScript e C#. Ad esempio, nel
primo linguaggio l’avvio delle coroutines è eseguito implicitamente dal compilatore,
mentre in C# è necessario chiamare esplicitamente l’istruzione StartCoroutine:
tale funzione ritorna immediatamente, ma è possibile passare il suo risultato all’istruzione yield per attendere la terminazione della coroutine prima di proseguire con
l’esecuzione della funzione principale. Ecco infatti come si presentano gli esempi
precedenti in C# anziché in JavaScript:
22
Listing 4.16: Thread parallelo di cui si attende la terminazione (C#)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
v o i d Start ( ) {
print ( ” I n i z i o : ” + Time . time ) ;
StartCoroutine ( WaitAndPrint ( ) ) ;
print ( ” C o n c l u s i o n e : ” + Time . time ) ;
}
IEnumerator WaitAndPrint ( ) {
yield r e t u r n new WaitForSeconds ( 2 . 0 ) ;
print ( ” W a i t A n d P r i n t : ” + Time . time ) ;
}
//
//
//
//
l ' output e ` i l seguente :
Tempo d i i n i z i o : 0 . 0
Conclusione : 0.0
WaitAndPrint : 2.0
Listing 4.17: Thread parallelo che non sospende l’esecuzione principale (C#)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
IEnumerator Start ( ) { / / i l t i p o d i r i t o r n o non \ `{ e } p i \ `{ u} v o i d
print ( ” I n i z i o : ” + Time . time ) ;
yield r e t u r n StartCoroutine ( WaitAndPrint ( ) ) ; / / n o t a r e l ' u s o d i y i e l d r e t u r n
print ( ” C o n c l u s i o n e : ” + Time . time ) ;
}
IEnumerator WaitAndPrint ( ) {
yield r e t u r n new WaitForSeconds ( 2 . 0 ) ;
print ( ” W a i t A n d P r i n t : ” + Time . time ) ;
}
//
//
//
//
l ' output e ` i l seguente :
Tempo d i i n i z i o : 0 . 0
WaitAndPrint : 2.0
Conclusione : 2.0
La gestione delle coroutines e l’impiego dell’istruzione yield sono risultati piuttosto macchinosi in C#, soprattutto perché una coroutine non può essere avviata dall’interno di Update() ed è invece necessario chiamare un’altra funzione, il cui tipo
di ritorno dev’essere IEnumerator, che contenga a sua volta l’istruzione di yield.
Ho ritenuto perciò opportuno realizzare in JavaScript tutti gli script in cui era necesario sospendere l’esecuzione di una funzione, come per gli effetti di fading o per il
movimento di comparsa e scomparsa degli animali nel terzo microgame.
Listing 4.18: Fade in
1
2
3
4
5
6
7
f u n c t i o n fadeIn ( ) {
f o r ( i = 0 . 0 ; i<=1.0; i + = 0 . 0 1 ) {
alpha = 1.0 −i ;
yield ;
}
alpha = 0 . 0 ;
}
23
4.3.6
Compilazione degli script e comunicazione fra linguaggi diversi
Tutti gli script, in qualunque linguaggio (C#, JavaScript, Boo) siano scritti, vengono compilati da Unity3D in librerie .dll di .NET: tali librerie vengono poi a loro volta
compilate just-in-time a runtime. Ciò consente un’esecuzione degli script notevolmente rapida.
Gli script che vengono compilati per primi sono quelli contenuti nella cartella Plugins, seguiti da quelli che si trovano al di fuori di essa (nel caso di L’isola di Wii, in
OtherScripts). Gli script di quest’ultimo tipo hanno accesso a quelli che si trovano in
Plugins, ma non viceversa.
Questa caratteristica torna utile qualora si voglia realizzare la comunicazione fra
script di linguaggi diversi. Consideriamo, ad esempio, FadeInOutScript, dedicato a realizzare gli effetti di fading tra una scena e l’altra e ad eseguire, nel frattempo,
le operazioni di caricamento e setup dei vari livelli: esso è scritto in JavaScript e si
trova nella cartella OtherScripts. È allora possibile che un’istruzione come la seguente
venga eseguita correttamente:
Listing 4.19: Comunicazione da JavaScript verso C#
1
v a r sbs = pallina . GetComponent ( ” S p h e r e B e h a v i o u r S c r i p t ” ) ;
Nell’esempio precedente, SphereBehaviourScript è uno script in C# collocato
nella cartella Plugins, dedicato a gestire il movimento della biglia.
Un caso particolare di comunicazione fra script è quello in cui sono coinvolti script
associati allo stesso GameObject, indipendentemente dal linguaggio in cui essi sono
scritti. Esiste infatti la possibilità di inviare un messaggio in broadcast, passando come
primo parametro una stringa; il messaggio verrà ricevuto da tutti gli script associati
al GameObject, che eseguiranno la funzione eventualmente presente in essi avente lo
stesso nome della stringa parametro. Vediamo un esempio tratto dal quinto microgame,
in cui l’utente deve inserire l’operatore mancante in un’addizione o sottrazione:
Listing 4.20: Comunicazione tramite messaggi
1
SendMessage ( ” w i i m o t e ” ) ;
L’istruzione descritta nel listato 4.20 fa parte di OperatorScript: tale script è
scritto in C# e il codice in esso contenuto rileva il sollevamento del WiiMote e del
Nunchuk e associa a tali movimenti rispettivamente un “+” o un “-”. Associati allo
stesso GameObject, ci sono altri due script:
24
• GUIistrQuintoGiocoScript, che contiene il codice per la realizzazione
delle schermate di inizio e fine del microgame;
• GUIQuintoScript, che contiene invece il codice per la realizzazione della
GUI del microgame vero e proprio.
GUIistrQuintoGiocoScript non contiene una funzione chiamata wiimote()
e dunque ignora il messaggio ricevuto da OperatorScript. GUIQuintoScript,
invece, contiene la seguente funzione:
Listing 4.21: Comunicazione tramite messaggi
1
2
3
4
5
6
7
f u n c t i o n wiimote ( ) {
i f ( ! imp )
{
imp = t r u e ;
cambiaOperatore ( 1 ) ;
}
}
Essa, sostanzialmente, imposta la GUI in modo da inserire un “+” nell’operazione visualizzata.
SendMessage può anche accettare più di un parametro: il primo resta sempre il nome della funzione da chiamare, gli altri diventano i parametri da passare a
quest’ultima.
25
Capitolo 5
Storyboard
5.1
Le novità introdotte
Come detto a pagina 1, lo sviluppo della presente tesi è iniziato durante il mio periodo di tirocinio presso GraphiTech. La Fondazione utilizza abitualmente Unity3D
per la realizzazione di ricostruzioni tridimensionali: è stato quindi naturale pensare
da subito L’isola di Wii in ottica 3D. L’impiego del WiiMote quale nuova metafora
d’interazione ha costituito poi un ulteriore elemento di innovazione: la maggior parte
dei serious games presi in esame, infatti, presenta una grafica bidimensionale, adatta
soprattutto alla fruizione via web; inoltre, la metafora d’interazione è solitamente rappresentata dalla combinazione di mouse e tastiera, e ciò consente un coinvolgimento
indubbiamente più limitato di quello ottenibile tramite il WiiMote.
26
5.2
Storyboard
Una volta avviato L’isola di Wii, la prima schermata che compare invita l’utente ad
assicurare correttamente il laccio del WiiMote intorno al proprio polso e a premere i
pulsanti “1” e “2” posti sul controller stesso.
Figura 5.1: La schermata di avvio
27
Quando i due pulsanti vengono premuti contemporaneamente, i Led del WiiMote
iniziano a lampeggiare e la connessione Bluetooth con il computer viene avviata. Una
volta che la connessione è instaurata, viene verificato che il Nunchuk sia collegato al
WiiMote: se l’estensione è presente, viene chiesto all’utente di premere il pulsante “A
” per proseguire, altrimenti viene visualizzato un messaggio informativo.
Figura 5.2: Connessione avvenuta
28
Compare ora una nuova schermata, dalla quale è possibile scegliere il colore della
biglia che costituirà poi l’avatar dell’utente durante tutto il gioco. L’utente può scegliere una fra le tre textures disponibili premendo rispettivamente “- ”, “Home ” o “+
”: quando viene premuto uno di questi pulsanti, la texture corrispondente viene evidenziata. L’utente può quindi iniziare effettivamente il gioco premendo il pulsante “A
”.
Figura 5.3: La scelta della texture per la biglia
29
La scena successiva è ambientata su di un’isola, lungo la quale si snoda una pista
tracciata sul terreno: il giocatore deve far rotolare la propria biglia attraverso tale pista,
imprimendo il movimento e la rotazione tramite gesti effettuati con il WiiMote.
Figura 5.4: L’isola
30
Lungo il percorso si trovano alcuni hot spots: quando la biglia entra in contatto
con uno di essi, viene caricato un microgame; l’utente visualizza le istruzioni relative
e preme il pulsante “A”, posto sul WiiMote, per iniziare a giocare.
Figura 5.5: Un hot spot
31
5.2.1
Il primo microgame
Su di un prato sono sparse alcune coppie di funghi, ad ognuna delle quali è associata un’addizione; ogni volta che scade un timer, la distribuzione dei funghetti sul
terreno cambia. Il giocatore sposta la propria pallina sul prato muovendo la leva del
Nunchuk: quando la pallina si avvicina ad una coppia di funghetti, questa viene evidenziata applicandovi una texture di colore verde acceso e l’addizione ad essa associata viene mostrata su di un’etichetta apposita. Se il risultato dell’operazione è 10,
il giocatore deve avvicinare ancora di più la pallina ai funghetti fino a urtarli e quindi
“raccoglierli”: altrimenti, deve evitarli. Se il giocatore urta i funghetti, questi scompaiono; se se ne allontana, essi riprendono il colore rosso originale e l’etichetta che
mostra l’addizione ad essi associata viene nascosta.
Il giocatore guadagna dei punti se raccoglie i funghetti per i quali l’addizione associata dà come risultato 10, mentre ne perde se raccoglie gli altri. Il microgame termina
con un messaggio quando sono state raccolte tutte le coppie di funghetti che danno un
punteggio positivo; il giocatore preme allora il pulsante “A ” posto sul WiiMote per
tornare all’isola.
Figura 5.6: Il primo microgame
32
5.2.2
Il secondo microgame
L’ambientazione è un laghetto in cui nuotano dei polipi: per ogni round, al giocatore viene proposta un’addizione da risolvere. Simulando con il WiiMote il lancio
di una lenza, il giocatore deve muovere la propria pallina come se questa fosse un
galleggiante tramite il Nunchuk, fino ad avvicinarsi ad uno dei polipi: l’animaletto si
evidenzia in giallo e comincia a ruotare vorticosamente su se stesso. Il giocatore deve
allora “pescarlo ” traendo a sé il WiiMote; quando ritiene di aver pescato tanti polipi
quanti indicati dal risultato dell’operazione proposta, deve premere il pulsante “Z ”
posto sul Nunchuk. Se il risultato è effettivamente corretto, il giocatore guadagna dei
punti, altrimenti subisce una penalità.
Viene generata una nuova operazione da risolvere ogni volta che il pulsante “Z ”
viene premuto, fino a quando non sono stati completati tutti i round previsti. A quel
punto compare un messaggio conclusivo e l’utente può ritornare all’isola premendo il
pulsante “A ” sul proprio WiiMote.
Figura 5.7: Il secondo microgame
33
5.2.3
Il terzo microgame
In un orto sbucano dal terreno vari animaletti, ad ognuno dei quali corrisponde un
numero. Il giocatore muove un mirino tramite il Nunchuk e lo posiziona sull’animaletto contrassegnato dal numero 0; l’animaletto inizia a tremare e l’utente deve “colpirlo
”, simulando con il WiiMote un colpo di martello, prima che esso si ritiri di nuovo
sotto terra o che il numero che lo etichetta cambi. Scopo del microgame è colpire gli
animaletti secondo un ordinamento crescente, da quello cui è associato il numero 0 a
quello cui è associato il numero 9; colpire l’animaletto corretto secondo l’ordinamento
fa guadagnare dei punti al giocatore e distrugge l’animaletto in questione, colpirne uno
non corretto applica una penalità.
Il gioco termina quando tutti gli animaletti sono stati colpiti (e distrutti): anche qui,
compare un messaggio conclusivo e l’utente può ritornare all’isola premendo “A ” sul
proprio WiiMote.
Figura 5.8: Il terzo microgame
34
5.2.4
Il quarto microgame
All’inizio del microgame, al giocatore viene assegnato un certo fattore. Utilizzando il Nunchuk, il concorrente muove la propria biglia all’interno di un labirinto.
Lungo il percorso, si imbatterà in varie stelle, ognuna etichettata con un numero: il
giocatore dovrà “saltare ” (avvicinandosi alle stelle e sollevando contemporaneamente
WiiMote e Nunchuk) solo in corrispondenza delle stelle etichettate con un multiplo del
fattore assegnatogli in precedenza, pena la perdita di alcuni punti. Il giocatore dovrà
cercare di raccogliere il maggior numero possibile di stelle contrassegnate da un multiplo del fattore assegnatogli prima di raggiungere l’uscita: a questo punto, al giocatore
verrà assegnato un bonus ed egli potrà ritornare all’isola premendo il pulsante “A ” sul
proprio WiiMote.
Figura 5.9: Il quarto microgame
35
5.2.5
Il quinto microgame
Il concorrente deve cercare di inserire l’operatore mancante nel maggior numero
possibile di operazioni presentate. In ciascuna operazione, il giocatore può inserire
un “+ ” sollevando il WiiMote, un “- ” sollevando il Nunchuk. Se l’operatore inserito è quello corretto, il giocatore guadagna dei punti; altrimenti, l’operazione viene
evidenziata in rosso e il punteggio viene decrementato.
Il microgame termina allo scadere del conto alla rovescia, cioè dopo trenta secondi.
Figura 5.10: Il quinto microgame
36
Al termine di quest’ultimo microgame, compare una schermata conclusiva di congratulazioni; premendo il pulsante “A ” sul WiiMote, si esce dall’applicazione.
Figura 5.11: Il messaggio conclusivo
37
5.3
Gestione del movimento della pallina a partire dai
dati letti dal WiiMote
Di seguito, un frammento di codice posto in SphereBehaviourScript: esso
è dedicato al rilevamento dei dati letti dal WiiMote e alla loro conversione in forze da
applicare alla biglia per muoverla lungo il percorso.
Listing 5.1: Gestione del movimento della pallina a partire dai dati letti dal WiiMote
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
v o i d FixedUpdate ( ) / / f u n z i o n e i n v o c a t a ad o g n i frame , ma con un f r a m e r a t e f i s s o
{
i n t c = wiimote_count ( ) ; / / c o n t a i WiiMote c o l l e g a t i
i f ( c > 0 ) / / s e vengono r i l e v a t i d e i WiiMote
{
f o r ( i n t i = 0 ; i <= c − 1 ; i++)
/ / c i c l a s u i WiiMote ( i l c o d i c e e ' a d a t t a b i l e a m u l t i p l a y e r )
{
i f ( IsWiimoteActive ( ) )
{
/ / WIIMOTE
/ / r i l e v a l ' a c c e l e r a z i o n e lungo l ' asse Y
y = wiimote_getAccY ( i ) ;
/ / r i l e v a l a r o t a z i o n e lungo l ' asse Y
f l o a t roll = Mathf . Round ( wiimote_getRoll ( i ) ) ;
i f ( y > X11_JUMP )
/ / s e l ' a c c e l e r a z i o n e l u n g o Y e ' s u p e r i o r e ad una c e r t a s o g l i a
{
i f ( y > maxy ) maxy = y ;
}
i f ( maxy > y )
/ / s e i l v a l o r e a p p e n a l e t t o e ' un p i c c o
/ / ( un movimento v e r s o l ' a l t o e ' r a p p r e s e n t a b i l e come un ' onda
/ / d a l p u n t o d i v i s t a d e l l ' a c c e l e r a z i o n e l u n g o Y)
{
f l o a t val = CalcComponent ( X11_JUMP , X12_JUMP , X21_JUMP , X22_JUMP ,
maxy ) ;
/ / i l valore di picco viene scalato ;
/ / dal r i s u l t a t o s i r i ca v a n o l e componenti d e l l a f o r z a
/ / da a p p l i c a r e a l l a b i g l i a p e r m u o v e r l a i n a v a n t i
V e c t o r 3 f = new V e c t o r 3 ( Mathf . Sin ( transform . rotation . eulerAngles .
y * Mathf . Deg2Rad ) * val , 0 , Mathf . Cos ( transform . rotation .
eulerAngles . y * Mathf . Deg2Rad ) * val ) ;
rigidbody . AddForce ( f ) ;
maxy = −1000;
}
i f ( roll >= X11_RIGHT && roll <= X12_RIGHT )
{
/ / i l WiiMote e ' r u o t a t o v e r s o d e s t r a
rotationX +=
CalcComponent ( X11_RIGHT , X12_RIGHT , X21_RIGHT , X22_RIGHT ,
roll ) ;
rotationX = ClampAngle ( rotationX , −360F , 360F ) ;
/ / i l valore l e t t o viene scalato
Quaternion xQuaternion =
Quaternion . AngleAxis ( rotationX , V e c t o r 3 . up ) ;
transform . localRotation = originalRotation * xQuaternion ;
38
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Freccia . transform . localRotation = originalRotation * xQuaternion ;
/ / la rotazione viene applicata sia a l l a b i g l i a
/ / c h e a l l a f r e c c i a c h e ne i n d i c a l ' o r i e n t a m e n t o
}
e l s e i f ( roll >= X11_LEFT && roll <= X12_LEFT )
{
/ / i l WiiMote e ' r u o t a t o v e r s o s i n i s t r a
rotationX +=
CalcComponent ( X11_LEFT , X12_LEFT , X21_LEFT , X22_LEFT , roll ) ;
rotationX = ClampAngle ( rotationX , −360F , 360F ) ;
/ / i l valore l e t t o viene scalato
Quaternion xQuaternion =
Quaternion . AngleAxis ( rotationX , V e c t o r 3 . up ) ;
transform . localRotation = originalRotation * xQuaternion ;
Freccia . transform . localRotation = originalRotation * xQuaternion ;
/ / la rotazione viene applicata sia a l l a b i g l i a
/ / c h e a l l a f r e c c i a c h e ne i n d i c a l ' o r i e n t a m e n t o
}
}
/ / NUNCHUCK
i f ( IsNunchuckActive ( ) )
{
/ / a l l ' i n t e r n o d i a l c u n i m i c r o g a m e s devono e s s e r e r i c h i a m a t e
/ / f u n z i o n i a u s i l i a r i e c h e g e s t i s c o n o i l movimento d e l l a b i g l i a
/ / i n b a s e a i d a t i l e t t i d a l Nunchuk
i f ( IsFirstMicrogame ( ) ) First ( i ) ;
e l s e i f ( IsSecondMicrogame ( ) ) Second ( i ) ;
e l s e i f ( IsFourthMicrogame ( ) ) Fourth ( i ) ;
}
}
}
}
39
Capitolo 6
Activity diagrams
Di seguito, gli activity diagrams che descrivono le fasi di setup e movimento e i
microgames.
40
Figura 6.1: Connessione del WiiMote e selezione del colore da assegnare alla biglia - parte 1
41
Figura 6.2: Connessione del WiiMote e selezione del colore da assegnare alla biglia - parte 2
42
Figura 6.3: Conversione dei gesti eseguiti con WiiMote in movimento della biglia
43
Figura 6.4: Esempio di caricamento di un microgame
44
Figura 6.5: Il primo microgame
45
Figura 6.6: Il secondo microgame - parte 1
46
Figura 6.7: Il secondo microgame - parte 2
47
Figura 6.8: Il secondo microgame - parte 3
48
Figura 6.9: Il terzo microgame
49
Figura 6.10: Il quarto microgame
50
Figura 6.11: Il quinto microgame
51
Capitolo 7
Difficoltà incontrate
7.1
UniWii non supporta la Balance Board
Come detto sopra, nel paragrafo 4.2.1, il plugin UniWii non prevede il supporto per
estensioni diverse dal Nunchuk e dunque non è in grado di gestire la Balance Board.
All’inizio dello sviluppo del progetto, però, abbiamo lungamente tentato di aggirare
questo inconveniente.
WiimoteLib [14] è una libreria in C# sviluppata da Brian Peek; essa rileva e gestisce sia il WiiMote che le sue varie estensioni (Nunchuk, Classic Controller, chitarra e
batteria per Guitar Hero e cosı̀ via), tra cui appunto la Balance Board.
Compilata sotto Visual Studio 2008, la libreria funzionava perfettamente ed offriva
numerose funzioni di interfaccia. Il mio tutor mi ha dunque suggerito di compilare la
libreria e copiare il risultante file .dll all’interno del progetto in Unity3D: la .dll avrebbe quindi dovuto occuparsi esternamente di gestire la comunicazione con il WiiMote
e le sue estensioni, riportando poi a Unity3D solo i valori rilevati, in modo del tutto
trasparente all’applicazione.
Sfortunatamente, l’operazione non è andata a buon fine. WiimoteLib fa transitare la comunicazione verso il WiiMote su di un file stream: proprio sull’apertura
di tale oggetto Unity3D generava un’eccezione, impedendo cosı̀ l’instaurarsi della
comunicazione con il controller.
Dopo un lungo e attento lavoro di debugging, sono giunta alla conclusione che le
piattaforme .NET, su cui si appoggia Visual Studio 2008, e Mono [10], su cui invece
si appoggia Unity3D, gestiscano i file stream in maniera differente. Ho ugualmente
approfondito lo studio del caso, informandomi su come Mono trattasse i file stream a
livello di codice (questo è stato reso possibile dal fatto che Mono sia una piattaforma
open source). Ho tentato di scrivere un’implementazione personalizzata della classe
52
File Stream da far utilizzare a Unity3D e che prevedesse solo le azioni che mi sarebbero state effettivamente utili nella comunicazione con il WiiMote; man mano che
proseguivo nel lavoro, però, diventava chiaro che l’onere sarebbe stato eccessivamente
gravoso e che soprattutto mi avrebbe distolta completamente dallo sviluppo di L’isola
di Wii, che restava invece il mio obiettivo principale e per me più interessante.
In conclusione, ho deciso di rinunciare a sfruttare la Balance Board e di realizzare l’interazione con il serious game solo tramite WiiMote e Nunchuk, sfruttando le
funzionalità offerte da UniWii.
7.2
Unitron non prevede debugger
L’editor che Unity3D fornisce di default si chiama Unitron ed è davvero spartano:
prevede il syntax highlighting ma non l’indentazione automatica e l’autocompletion
è poco maneggevole. La problematica principale è però il fatto che Unitron, essendo
poco più che un editor di testo, non comprende un debugger: essendo io abituata a
lavorare in NetBeans, questa mi è sembrata una forte limitazione.
Va detto che Unity3D consente comunque di specificare il proprio editor esterno
preferito, sostituendolo a Unitron: mentre sviluppavo il progetto sotto Windows, ho
infatti utilizzato SharpDevelop [15]; gran parte del progetto, però, è stata sviluppata
sotto Mac OS, piattaforma per la quale, al momento, non sembrano essere disponibili
editor gratuiti per C#: in questa situazione, Unitron era una scelta obbligata.
7.3
Scarsa documentazione tecnica reperibile per WiiMote
La documentazione tecnica disponibile per il WiiMote è poca e difficilmente reperibile: non sono riuscita a trovare, nemmeno sul sito di Nintendo, informazioni
pubbliche riguardanti il funzionamento del controller (come delle indicazioni circa
i valori letti dall’accelerometro). Suppongo che questo dipenda dal fatto che l’azienda
è molto restrittiva nel concedere l’autorizzazione allo sviluppo di giochi per Wii, e che
di conseguenza non ritenga necessario divulgare le specifiche del controller o della
console.
È stato quindi necessario dedicare un periodo di studio alle caratteristiche del WiiMote, prima di iniziare lo sviluppo effettivo de L’isola di Wii. In particolare, sono stati
realizzati dei piccoli progetti di testing atti a capire i valori che UniWii trasmetteva
53
a Unity3D in corrispondenza dei vari gesti compiuti con il WiiMote (in verticale, in
orizzontale, le rotazioni lungo i vari assi).
Fra le cose interessanti emerse, è risultato che UniWii riceve dall’accelerometro gli
stessi valori sia per un gesto compiuto in orizzontale che per uno compiuto in verticale.
Questo ha comportato una riprogettazione del quinto microgame: inizialmente, infatti,
avevo pensato che il giocatore avrebbe potuto inserire l’operatore mancante tracciando
in aria con il WiiMote un “+ ” o un “- ”. Dato però che i gesti da compiere sarebbero risultati indistinguibili, ho deciso piuttosto di effettuare l’inserimento di ciascun
operatore in corrispondenza del sollevamento del WiiMote o del Nunchuk.
54
Capitolo 8
Sviluppi possibili
Il prototipo realizzato si presta a varie possibilità di miglioramento ed evoluzione, sia da un punto di vista contenutistico che tecnico. Ne espongo alcune, anche
alla luce di quanto emerso dai colloqui con il prof. Nesler e dalle rilevazioni della
sperimentazione DANT.
8.1
8.1.1
Sviluppi tecnici
Il multiplayer
Un tipico esempio dell’impiego di UniWii, descritto anche nella pagina web dedicata al plugin [12], è il seguente:
Listing 8.1: Utilizzo di UniWii
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using
using
using
using
UnityEngine ;
System ;
System . Collections ;
System . Runtime . InteropServices ;
p u b l i c c l a s s UniWiiCheck : MonoBehaviour {
[ DllImport ( ” UniWii ” ) ]
p r i v a t e s t a t i c e x t e r n v o i d wiimote_start ( ) ;
[ DllImport ( ” UniWii ” ) ]
p r i v a t e s t a t i c e x t e r n v o i d wiimote_stop ( ) ;
[ DllImport ( ” UniWii ” ) ]
p r i v a t e s t a t i c e x t e r n i n t wiimote_count ( ) ;
p r i v a t e String display ;
v o i d OnGUI ( ) {
i n t c = wiimote_count ( ) ;
55
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
i f ( c>0) {
display = ” ” ;
f o r ( i n t i = 0 ; i<=c−1; i++) {
display += ” Wiimote ” + i + ” f o u n d ! \ n ” ;
}
}
e l s e display = ” P r e s s t h e ' 1 ' and ' 2 ' b u t t o n s on y o u r Wii Remote . ” ;
GUI . Label ( new Rect ( 1 0 , Screen . height−100 , 5 0 0 , 1 0 0 ) , display ) ;
}
v o i d Start ( )
{
wiimote_start ( ) ;
}
v o i d OnApplicationQuit ( ) {
wiimote_stop ( ) ;
}
}
Il codice riportato in 8.1 rileva i controller attivi e, ad ogni frame, stampa su GUI una
stringa per ciascun WiiMote individuato.
Si noti come il ciclo for predisponga già il codice del prototipo ad essere modificato per offrire anche la possibilità di un gioco multiplayer. UniWii, infatti, è in grado
di gestire vari WiiMote, contrassegnandoli ognuno con un indice: tutte le funzioni che
fanno parte della libreria e che rilevano i dati da un controller richiedono quindi come
parametro proprio l’indice che lo caratterizza.
8.1.2
Versione per dispositivo mobile
Unity3D consente anche di realizzare progetti per iPhone: tale piattaforma è versatile ed accattivante nell’interazione, e sarebbe dunque interessante realizzare una
versione di L’isola di Wii anche per essa. Sarebbe cosı̀ possibile confrontare il grado
di interazione e coinvolgimento ottenuto con iPhone e con WiiMote.
8.2
8.2.1
Sviluppi contenutistici
Struttura flessibile
Innanzitutto, il gioco può essere esteso con l’inserimento di altri microgames, non
necessariamente di argomento matematico. Una prospettiva stimolante, a mio avviso,
è quella di costituire una raccolta di microgames multidisciplinari, tramite i quali il
bambino possa esercitarsi nelle varie materie pur sfruttando un’unica piattaforma.
56
Un ulteriore vantaggio dell’avere una struttura modulare e variabile è quello di poter mantenere alta l’attenzione e la motivazione anche in giocatori ormai “esperti” e,
nel contempo, evitare che i principianti siano frustrati da esercizi di difficoltà superiore
al livello delle abilità fino ad allora possedute.
8.2.2
Raccolta statistiche
Agli insegnanti che intendano utilizzare L’isola di Wii nella scuola di base potrebbe essere utile configurare il livello di difficoltà dei microgames o il tempo massimo
da dedicare a ciascun gioco, e poi registrare il tempo di utilizzo globale e quello effettivamente impiegato per risolvere ciascun gioco; l’analisi di questi dati potrebbe
aiutarli ad individuare gli argomenti non ben assimilati dagli alunni e a calibrare meglio gli interventi di recupero da effettuare. (Questo punto era già stato evidenziato
dai questionari di valutazione della sperimentazione DANT). L’isola di Wii, o una sua
versione estesa, potrebbe dunque trovare applicazione nel consolidamento, a scuola o
a casa, delle abilità di calcolo elementare.
8.3
Sviluppi metodologici: questionario di valutazione
Per garantire validità scientifica al lavoro e capire efficacemente in quali punti migliorarlo, sarebbe necessario sottoporre il software ad un campione di allievi dei primi
anni della scuola di base e, attraverso un questionario, raccogliere opinioni, percezioni
e dati di apprendimento utili per migliorare il gioco e le sue modalità di utilizzo; in base ai risultati del questionario di valutazione, si potrebbe poi procedere alla revisione
del prototipo.
In sintesi, questi potrebbero essere gli ulteriori sviluppi de L’isola di Wii:
• ampliare gli ambiti disciplinari;
• rendere possibile la personalizzazione del contenuto da parte del docente;
• consentire la regolazione del livello di difficoltà da parte del giocatore;
• somministrare un questionario di valutazione.
57
Capitolo 9
Nota conclusiva
Ormai nessuno discute più sull’opportunit di utilizzare le TIC (Tecnologie dell’Informazione e della Comunicazione) a scuola: che il computer sia uno strumento utile
per l’apprendimento è un dato di fatto condiviso dagli esperti sia di pedagogia che di
didattica. Più dibattuta è invece la questione su quali materiali e strategie usare per
rendere più efficace e piacevole l’apprendimento mediato dalle TIC.
Con la realizzazione del prototipo de L’isola di Wii ritengo di aver dato un contributo a questa discussione, non solo documentando le fasi di realizzazione del gioco
in quanto prodotto software, ma anche mostrando alcune innovazioni introdotte dal
WiiMote, componente ancora poco esplorata nell’ambito dei serious games.
La fisicità espressa attraverso l’interazione con il WiiMote può offrire una marcia
in più per mantenere alto il livello di interesse e di coinvolgimento del bambino, che
può anche rischiare di annoiarsi quando ha utilizzato il gioco per un certo tempo. A
questo obiettivo è legata anche la scelta di realizzare un “contenitore” per microgames:
lo sviluppo di più giochi mi ha consentito di sperimentare l’impiego di varie gestualità, di capire quali fossero implementabili (per lo meno con il game development tool
utilizzato) e, fra queste, quali potessero attirare maggiormente l’attenzione dell’utente
e spingerlo a mettersi, per l’appunto, “in gioco”. Con il WiiMote anche un feedback
negativo può essere accolto simpaticamente e stimolare a riprovare il percorso del gioco con più entusiasmo, attenzione ed energia.
In conclusione, penso che il controller WiiMote potrà rivelarsi un mezzo per un apprendimento senso-motorio più persistente (nonché più coinvolgente) di quello simbolicoriproduttivo tipicamente sfruttato dai metodi di insegnamento pi tradizionali.
58
Bibliografia
[1] NETConnect project — http://www.netconnect-project.eu.
[2] The Forbidden City — http://www.beyondspaceandtime.org.
[3] Rome Reborn — http://www.romereborn.virginia.edu.
[4] Travel In Europe — http://www.tieproject.eu.
[5] VeGame — http://www.elios.dibe.unige.it/showroom/vegame/index.html.
[6] La scuola digitale — http://scuoladigitale.blogspot.com/.
[7] Giochi della sperimentazione DANT — http://www.iprase.tn.it/prodotti/software didattico/giochi
[8] Unity3D game development tool — http://unity3d.com.
[9] PhysX, physics engine — http://www.nvidia.it/object/nvidia physx it.html.
[10] Mono, framework open source per .NET — http://mono-project.com/Main Page.
[11] Licenze per Unity3D — http://unity3d.com/unity/licenses.
[12] UniWii plugin — http://www.unifycommunity.com/wiki/index.php?title=UniWii.
[13] Darwiin Remote — http://sourceforge.net/projects/darwiin-remote/.
[14] WiimoteLib — http://www.codeplex.com/WiimoteLib.
[15] SharpDevelop editor — http://www.icsharpcode.net/OpenSource/SD/.
[16] Wikipedia, Unity3D — http://en.wikipedia.org/wiki/Unity (game engine).
[17] Raccolta di giochi 3D per web browser realizzati con Unity3D —
http://www.wooglie.com/.
[18] Community degli utenti di Unity3D — http://www.unifycommunity.com.
59
[19] Forum degli utenti di Unity3D — http://forum.unity3d.com.
[20] Imparo
Giocando,
a
cura
http://www.iprase.tn.it/giocando.asp.
di
IPRASE
Trentino
—
[21] Francesco Antinucci. La scuola si è rotta. Perché cambiano i modi di apprendere.
Laterza, Roma, 2001.
[22] Antonio Calvani. Educazione, comunicazione e nuovi media. UTET, Torino,
2005.
[23] Antonio Calvani. Rete, comunità e conoscenza. Erickson, Trento, 2005.
[24] Antonio Calvani. Teorie dell’istruzione e carico cognitivo. Erickson, Trento,
2009.
[25] Anna Carletti e Andrea Varani, editor. Ambienti di apprendimento e nuove
tecnologie. Erickson, Trento, 2007.
[26] Guillaume Denis e Pierre Jouvelot. Motivation-driven educational game design:
applying best practices to music education. In Proc. Int. Conf. on Advances in
Computer Entertainment Technology. ACM Press, 2005.
[27] Paolo Ferri e Susanna Mantovani, editor. Digital kids. Fondazione IBM Italia,
Etas, Milano, 2008.
[28] Paolo Ferri. La scuola digitale. Bruno Mondadori, Milano, 2008.
[29] Jessie Herz. Il popolo del joystick. Feltrinelli, Milano, 1998.
[30] Rita Teso Italo Tanoni. Il curricolo tecnologico. Erickson, Trento, 2009.
[31] Gianpiero Lotito. Emigranti digitali. Bruno Mondadori, Milano, 2008.
[32] Roberto Maragliano. Joystick. Pedagogia e videogame.
Company Italia S.p.A., Milano, 2003.
The Walt Disney
[33] Romano Nesler, editor. Didattica assistita dalle nuove tecnologie. IPRASE
Trentino, Trento, 2004.
[34] Romano Nesler. Imparo giocando. Videogiochi e apprendimento. IPRASE
Trentino, Trento, 2007.
[35] Mark Prensky. Digital natives, digital immigrants. On the horizon, 9(5), 2001.
60
[36] Mark Prensky. Mamma non rompere, sto imparando! Multiplayer.it Edizioni,
Perugia, 2007.
[37] Kurt Squire.
Video games in education.
International
Journal
of
Intelligent
Simulations
and
Gaming,
2003.
http://www.cyberfest.us/Education/Video Games in Education-MIT Study.pdf.
[38] Italo Tanoni. Videogiocando si impara. Erickson, Trento, 2003.
61
Scarica

Sviluppo di un Serious Game per la Scuola di Base con impiego di