Creare un prototipo parte 4

In apertura direi di salvare il file con un’altro nome (o numero), esattamente come negli articoli precedenti. Come annunciato parlo dell’Outliner, cos’è e a cosa serve.
Una piccola descrizione la trovi sulla pagina relativa all’interfaccia (layout) del Game Logic di Blender. Ma vediamo in dettaglio questa finestra e il suo uso. 

Nota. Per questioni di spazio ho tagliato l’immagine seguente che mostra l’Outliner.

In basso si trovano due voci di menù, dal menù View è possibile decidere alcuni parametri e oggetti che si vuole visualizzare (non scendo in dettaglio in questo articolo, ma prova pure tutte le voci che sono nel menù); dalla seconda voce Search è possibile scegliere cosa cercare nella ricerca, che è il campo con la lente d’ingrandimento, molto utile se si lavora su livelli con molti oggetti e se si ha rinominato a dovere gli oggetti; il menù a tendina (mostra l’opzione scelta, in questo caso è quella di default All Scene) ha diverse opzioni, sono abbastanza intuitive, se si lavora su più scene (esempio : quando si crea una HUD) è ottimo per selezionare gli oggetti senza dover ogni volta cambiare scena. Ho volutamente fatto una carrellata veloce perchè mi voglio soffermare sulle tre icone bordate di giallo, che sono utilissime nella realizzazione di alcuni passaggi della creazione di un gioco.

Ogni icona ha un suo compito :

  • L’Occhio visualizza e nasconde l’oggetto in questione nella finestra 3D View, in modo da facilitarci nella visualizzazione e nel lavoro.
  • La Freccia del mouse (parlo sempre delle icone sull’Outliner) serve a rendere un’oggetto selezionabile e non, questa opzione si può avere anche nascondendo l’oggetto con l’Occhio, ed è molto utile se si fa fatica a selezionare un’oggetto perchè circondato da altri oggetti.
  • La Camera fotografica rende l’oggetto invisibile all’avvio del motore di gioco, un pò come succede se clicchi sul pulsante Invisible nelle proprietà fisiche di un’oggetto. 

Ultima cosa, ma non meno importante, è possibile selezionare, anche con selezione multipla, direttamente cliccando sull’oggetto che ti interessa col tasto sinistro, mentre col tasto destro appare un menù a tendina con le azioni; si può anche rinominare un’oggetto senza dove andare a cercare l’opzione della tab della mesh.

Detto questo direi di tornare al nostro prototipo, iniziando proprio dall’Outliner, come puoi ben notare la finestra mostra una lista di cubi abbastanza lunga; ho volutamente lasciato i nomi dei cubi di default perchè in questa fase non è importante rinominare gli oggetti perchè possibilmente verranno cancellati in seguito. Però posso ridurre drasticamente questa lista, semplicemente imparentando (le parentele verranno trattate in un tutorial specifico perchè è un’argomento importante) tutti i cubi, o tutti gli oggetti di uno stesso tipo, ad una Empty (le Empty sono degli oggetti vuoti utili a svariate procedure che mostrerò man mano nei vari tutorial).

Aggiungi una Empty (Shift+A), Blender ne mette a disposizione di diverse forme, userò la prima. Spostati in una visuale laterale o frontale (Tn1 oppure Tn3) e muovi la Empty in basso di 5 unità (oppure premi G+Z+-5, o di quanto credi ti serva); adesso devi selezionare tutti i cubi che formano il livello di gioco, senza però selezionare il resto degli oggetti (muri, player, camera, luce, ecc ecc), la procedura più semplice è quella di disabilitare la selezione, cliccando sulla freccia del mouse dell’Outliner, degli oggetti che non ci interessano, quelli citati nella parentesi, e usare il box select (tasto B) per selezionare tutti i cubi in un colpo solo. Una volta selezionati i cubi tenendo premuto Shift seleziona la Empty, adesso premi CTRL+P, apparirà un finestrella con due opzioni, clicca su Object (Keep Transformation), in questo modo i cubi resteranno dove sono ma diventeranno figli della Empty. Ecco come si presenta la mia scena

Le linee tratteggiate mostrano che ogni singolo cubo è imparentato con la Empty (si possono disabilitare per una visione più limpida del livello, lo mostrerò più avanti); questo significa che se muovo la Empty tutti i cubi la seguiranno, ma posso riposizionare uno o più cubi se è necessario. La cosa più importante è che nell’Outliner la lista si è ridotta notevolmente, come mostra l’immagine successiva

Questo perchè ora tutti i cubi sono sotto la Empty e cliccando il punsantino col + a sinistra della stessa puoi visualizzarli tutti, la rinomino Empty_muri e salvo il file.

 La Camera

Adesso visto che il prototipo è abbastanza maturo da poter iniziare a dare una sorta di gameplay è arrivato il momento di dare alla Camera un ruolo ben preciso. Se ricordi sto cercando di creare una sorta di platform 3D sulla falsa riga di Mario 64, quindi voglio che la mia camera segua il player.

La prima cosa da fare è posizionare la Camera dietro il player, ci sono svariati modi per farlo, ma visto che sto lavorando con semplicità mi porto sulla vista dall’alto (Tn7), seleziono la Camera e la sposto dietro il player manualmente, aiutandomi con le frecce oppure premendo G e di seguito tenendo premuto CTRL per agganciarla alla griglia. Ecco la visualizzazione dall’alto dopo lo spostamento

Come si vede dall’immagine la Camera non guarda il player, a questo proposito possiamo usare una fila di Mattoni oppure ruotarla fisicamente in modo da posizionarla a favore del player. La soluzione più semplice non è in questo caso la migliore, cioè usare i Mattoni, perchè il comportamento che ne risulta non è facile da gestire (perchè è preconfezionato), quindi non fa quello che diciamo noi, e perchè non è esattamente quello che voglio ottenere, ma visto che l’ho menzionata è mio dovere approfondire questo aspetto, poi sarai tu a scegliere se utilizzare questo metodo oppure il metodo successivo.

Metodo 1, Mattoni

Seleziona la Camera (se non è già selezionata), aggiungi un Sensor Always, clicca il True Level Triggering, il primo pulsante con i puntini in alto, questo dirà a blender che il Sensor deve inviare il segnale positivo ogni frame, aggiungi ora un’Actuator Camera, imposta i parametri come nell’immagine seguente e collegali tra di loro attraverso un Controlle And.

Se sei curioso e vuoi sperimentare trovi la spiegazione dei parametri di questo Actuator nella sua scheda. Questo metodo in realtà non è male, anzi per alcuni versi è migliore del seguente, siamo sempre in ambito prototipo quindi è tutto relativo a quello che vuoi ottenere, e puoi sempre cambiarlo.

Metodo 2, la parentela

Come hai già fatto per i cubi e la Empty, è possibile imparentare anche gli oggetti che si muovono, come appunto il player e la Camera. La cosa importante in questo metodo a differenza del precedente è che la Camera dev’essere posizionata manualmente a guardare il player, la procedura teorica è semplice devi azzerare la rotazione della Camera (ALT+R) per poi ruotarla verso il player come meglio desideri. Per velocizzare il procedimento mostro i valori della posizione e della rotazione da inserire nella tab dell’oggetto Camera nella finestra delle proprietà. Ho notato che il pivot (centro del player) è posizionato nello spazio sull’asse X a -35, correggi il dato della Camera relativo all’asse X con -35. 

 

A questo punto possiamo implementare due tipi di parentele, la prima è uguale a quella tra i cubi e la Empty usando un’opzione della Camera, la Slow Parent che si trova nella tab Relations Extras delle proprietà dell’oggetto Camera. Con questo tipo di parentela la camera seguirà il player meccanicamente, la Slow Parent darà alla Camera un ritardo nel ritornare alla posizione originale della parentela, questo sistema è ottimo se si vuole che la Camera resti sempre dietro il player.


Il secondo metodo è quello di imparentare la Camera soltanto ad un vertice del cubo (ed è quella che userò io), in questo modo la Camera guarderà sempre il player restando fissa in un punto ma senza ruotargli intorno, vediamo come fare.
La prima cosa è quella di selezionare un vertice del cubo player in Edit Mode (tasto Tab, quello a sinistra della Q), ritorna in Object Mode (sempre tasto Tab), seleziona la Camera e poi il player, adesso premi CTRL+P e scegli dal menù Vertex. Così facendo però ho imparentato un vertice che non è centrale alla mesh, il che sposta la Camera di qualche millimetro rispetto all’asse che si forma con una parentela semplice (quella del primo metodo) che punta al pivot dell’oggetto. Per ovviare a questo inconveniente bisogna suddividere il cubo. Come prima cosa rimuovi la parentela dalla Camera, selezionala e premi ALT+P e dal menù scegli Clear and Keek Transformation, poi seleziona il player e entrando in Edit Mode (tasto Tab), seleziona tutto il cubo tasto A (se hai ancora selezionato il vertice premi la A due volte) e poi premi la W, dal menù che appare seleziona la prima voce Subdivide. Adesso le facce del cubo hanno due loop che le tagliano esattamente a metà, deseleziona tutto (sempre tasto A) e seleziona soltanto il vertice posto al centro della faccia superiore, dovresti aver ottenuto un risultato come in figura

Ora ripeti l’operazione della parentela al vertice. Torna in Object Mode, seleziona la Camera, seleziona il player, premi CTRL+P e scegli Vertex dal menù. Puoi posizionare la Camera come meglio preferisci, se le coordinate fornite da me non sono di tuo gradimento. Se fai partire il gioco puoi notare che la Camera segue il player in modo meccanico ma se ruoti il player la Camera resta fissa su di lui senza ruotare. Questo è un tipo di parentela molto usata in tanti video giochi, certo poi è raffinata mediante script, ma non è il nostro caso. 

Usa il metodo di parentela che preferisci, quello a Mattoni, quello semplice con Slow Parent o quest’ultimo al vertice; puoi sempre cambiare o modificare la posizione della Camera come ti piace. Come sempre salva il file più e più volte, Blender non lo fa in automatico; prova e riprova il livello, sperimenta sulla meccanica della Camera e imparenta altri oggetti ad altre Empty (ad esempio i muri di cinta del livello ed il pavimento) in modo da ridurre ulteriormente gli oggetti nell’Outliner. Nel prossimo articolo implementerò le monete, delle aree di ‘morte’, dei punti dove se il giocatore cade perde una vita.