In questo tutorial ti mostrerò come creare un semplice effetto di frantumazione per il tuo gioco Unity. Invece di "cancellare" una cassa (o qualsiasi altro oggetto) quando viene colpita o distrutta, possiamo farla scheggiare in pezzi più piccoli.
Per questo tutorial, avrai bisogno della versione più recente di Unity e di alcune esperienze di base. Per l'effetto più avanzato più avanti nel tutorial, sarà anche necessario uno strumento di modellazione 3D. Se non ne hai uno disponibile o non vuoi modellare tu stesso gli oggetti, li ho inclusi nei download di origine. (I file Unity sono disponibili anche lì.)
Nella versione base di questo effetto, un cubo verrà distrutto, lasciando molti frammenti nella sua scia che cadranno realisticamente al suolo:
Successivamente, cambieremo il cubo per un modello di canna più complicato:
Puoi provarlo tu stesso qui:
Clicca per provare la demo. (La demo del cubo è disponibile anche qui.)Crea un nuovo progetto Unity e apri una nuova scena. Crea un piano, che fungerà da nostro terreno, e un cubo, che sarà l'oggetto distruttibile. Inoltre, posiziona una luce direzionale per rendere le cose più visibili. Crea due nuovi materiali e assegnali al pavimento e al cubo, in modo che possiamo distinguerli e spostare la fotocamera in modo che tutto possa essere visto:
Ci sono molti modi per "distruggere" il cubo. Per ora, prenderemo l'approccio più semplice possibile.
Crea un nuovo file JavaScript e chiamalo destructionController.js
. In questo, metteremo tutte le funzionalità di rimozione del cubo e creazione dei frammenti. Aggiungi le seguenti righe:
function Update () if (Input.GetKey (Keycode.space)) Destroy (gameObject);
Ora aggiungi lo script al cubo trascinandolo sopra. Avvia il gioco e fai una corsa di prova. Se si preme spazio, il cubo dovrebbe essere cancellato.
Dopo essere stato rimosso, non apparirà più nella gerarchia, come puoi vedere nello screenshot.
Ora crea otto cubi più piccoli; questi saranno i "frammenti" del cubo attuale. Dai loro lo stesso materiale del cubo. (Non preoccuparti per il look ancora, li faremo sembrare fantastici in seguito.) Dovrebbero assomigliare a questo:
Impila tutti e 8 i cubi per formare un cubo più grande, senza che si intersechino:
Dai a ogni cubo un corpo rigido, imposta il loro massa a 22
, attivare usa la gravità, e disattivare è cinematico. Questo farà cadere i frammenti e userà la fisica. Se lo desideri, puoi modificare questi valori in un secondo momento per ottenere risultati più adatti al tuo gioco.
Ora raggruppa i cubi sotto un nuovo vuoto gameObject
e chiamalo remainsCube
. Quando il cubo originale viene distrutto, verrà sostituito con questo nuovo oggetto formato da cubetti più piccoli.
Trascina il remainsCube
oggetto nella cartella del progetto per creare un prefabbricato. Una volta che è nella cartella prefabbricata, eliminarlo dalla scena principale ed è pronto per l'uso.
Aggiungi le linee evidenziate al destructionController
script:
var rimane: GameObject; function Update () if (Input.GetKey (Keycode.space)) Instantiate (remains, transform.position, transform.rotation); Destroy (gameObject);
Questo creerà una copia dei resti nella posizione esatta del cubo. Successivamente, il cubo verrà rimosso, dando l'illusione che il nuovo sia effettivamente il vecchio, ma "rotto".
Per farlo funzionare correttamente, devi assegnare manualmente i resti al cubo. Fare clic su di esso e nel Ispettore dovresti vedere una scheda contenente il Controller di distruzione script. Dovrebbe esserci uno spazio chiamato Resti, che dovrebbe attualmente essere vuoto. Trascina il resti
prefabbricato dalla cartella del progetto in questo slot. Il Controller di distruzione sceneggiatura nel Ispettore ora dovrebbe assomigliare a questo:
Fai una corsa di prova! Se tutto è impostato correttamente, quando si preme lo spazio, i resti dovrebbero sostituire il cubo. Se sei fortunato, dovrebbero poi cadere a terra.
Quindi, questo cubo di base:
... dovrebbe trasformarsi in qualcosa di simile a questo:
Purtroppo, non è garantito che i frammenti rotolino in un modo carino. Fortunatamente, ci sono modi per risolverlo.
Crea un nuovo vuoto gameObject
e dargli un collisore di sfere, ma nessun corpo rigido. Tira i resti nella scena, in modo che tu possa modificarli. Aggiungi l'oggetto del collisore di sfere ai resti e posizionalo in modo che si intersechi con alcuni dei cubi:
Ora i frammenti si scontreranno immediatamente con la sfera, creando un effetto tumble:
A seconda del gioco che stai costruendo, non possiamo permetterci troppe "schegge" contemporaneamente in una scena. La soluzione semplice è eliminarli dopo alcuni secondi. Per fare ciò, crea un nuovo file JavaScript e chiamalo selfDestruct.js
. Inserisci il seguente codice:
function Start () yield WaitForSeconds (4.0); Destroy (gameObject);
Quando l'oggetto viene creato, aspetterà per quattro secondi e quindi si cancellerà. Aggiungi questo codice al resti
oggetto. Se ora distruggete il cubo e create i frammenti, i resti si distruggeranno da soli dopo quattro secondi.
E questo è tutto! Ora hai le basi per fare in modo che un oggetto "si frantumi" in modo efficiente in diversi pezzi più piccoli quando viene distrutto. Puoi usare questo effetto così com'è, ma facciamo un po 'di più e vediamo come usarlo con un oggetto più complesso.
Ora che abbiamo messo a punto il sistema di base, possiamo renderlo più carino sostituendo i cubi con oggetti reali.
Se sei esperto in uno strumento di modellazione 3D, puoi creare i tuoi oggetti. In caso contrario, o se non ne hai uno disponibile, puoi ottenere il file 3D preparato dal download di origine.
Copia il file nella tua cartella di asset e i modelli 3D verranno automaticamente importati per il tuo uso. Prima di usarli, fare clic sul file nel Asset Explorer e assicurarsi che i file di origine vengano importati correttamente con un fattore di scala di 1
(non 0.1
o 0.001
; questo complica solo le cose).
Se guardi gli oggetti, puoi vedere un campo chiamato meshfilter nel Ispettore. Se si fa clic, si ottiene un elenco di tutte le mesh disponibili nel progetto. Ora sostituisci tutti i cubi nel cubo con le parti del barile.
Il cubo intatto ottiene il barile
maglia; i frammenti di cubo più piccoli hanno bisogno delle maglie barrel_fragment_01
a barrel_fragment_08
. Dopo aver assegnato quelli, imposta le loro posizioni locali su (0, 0, 0)
. (I loro punti di articolazione sono stati impostati in modo tale da poter essere facilmente azzerati in questo modo.)
Invece di un collisore di scatole, un collisore di maglie sarebbe molto più conveniente. Rimuovi tutti i collettori di caselle sui frammenti e sostituiscili con i raccoglitori di mesh. Controlla ogni mesh collider e assicurati che a ciascuno sia applicata la mesh corretta (cioè, barrel_fragment_01
ha bisogno del barrel_fragment_01
mesh, e così via).
Fatto ciò, impostare tutti i raccoglitori di mesh su convesso
. (Un collisore di mesh non convesso non può scontrarsi con altri collisori di mesh non convessi È una cosa di programmazione.) Inoltre, rimuovere il collettore di sfere che abbiamo aggiunto ai resti, poiché potrebbe non essere necessario.
Tutto è impostato correttamente, dovresti avere una canna che si separerà in otto pezzi più piccoli.
Lo stesso sistema può anche essere usato per aggiungere altri effetti alla distruzione. Hai un'esplosione? Aggiungilo ai resti! Aggiungi suoni, per un soddisfacente crepa. Metti un effetto particellare lì, creando un piccolo soffio di fumo.
In questo tutorial ti ho mostrato il modo più semplice per trasformare un oggetto in frammenti più piccoli. Ora sai come distruggere un oggetto, rimuovendolo dal gioco; come scambiare l'oggetto con frammenti più piccoli direttamente prima della sua distruzione; e come fare in modo che i frammenti si autodistruggano in seguito.
Questo sistema può ora essere modificato e adattato per adattarsi a molti scopi specifici. Potresti avere una cassa o un barile che si scheggia e frantumi quando sparato. Potresti creare un'esplosione dopo che un aereo è stato colpito. Oppure potresti far dividere una barca in due pezzi. Godere!