Tipi di collisione
La collisione in Unreal Engine è simile a Unity, ma presenta alcune differenze che sono qui esposte. Se hai utilizzato il rilevamento di collisione basato sui layer di Unity, le impostazioni di collisione del progetto dovrebbero apparire simili alla matrice di collisione. Puoi accedervi andando su Modifica > Impostazioni progetto > Collisione. Se espandi la scheda Preimpostazioni, puoi vedere tutti i profili predefiniti con una descrizione delle loro azioni.
Noterai che Unreal offre qualche altra opzione quando si tratta di risolvere le collisioni. Questo tema viene approfondito nella Panoramica delle collisioni in Unreal Engine. Questo Livello di granularità nel rilevamento di collisioni è utile e può favorire le prestazioni del tuo gioco. È importante comprendere:
I canali o i singoli collisori possono essere impostati su Bloccante, Sovrapponi o Ignora.
Un errore comune è non avere la casella di spunta Genera eventi di sovrapposizione impostata correttamente sui collisori quando occorrono quegli eventi.
La geometria statica deve essere bloccante e sovrapponibile, ma non deve necessariamente generare eventi di sovrapposizione o di danno, dato che non è necessario per il gameplay.
Gli eventi di sovrapposizione possono essere generati anche se un oggetto blocca un altro oggetto, soprattutto quando si muove a velocità elevate. In Unity, questo può essere un problema se si sta modificando direttamente la traslazione anziché un componente RigidBody. Così facendo, si evitano considerazioni riguardanti la fisica.
In Unreal, quando si chiama qualsiasi funzione che aggiorna una trasformazione dell'attore, ci sono due parametri booleani che determinano il modo in cui si desidera che l'attore si muova:
Sweep imposta su vero le sovrapposizioni dei trigger e interrompe l'attore a corto di destinazione se bloccato. Teleport determina se la velocità della fisica è mantenuta o meno.
I canali possono essere utilizzati anche per le Tracce che equivalgono alla proiezione della fisica di Unity (ossia Raycast, SphereCast ecc.). Puoi trasmettere il canale durante la chiamata di funzione Traccia linea allo stesso modo in cui trasmetteresti la maschera di layer in un Raycast in Unity.
Tipi di collisione personalizzata Parrot
Parrot ha una configurazione di alcuni canali di oggetto collisione personalizzata: Giocatore, Palla di cannone e Nemico.
Aggiungendo questi tipi di oggetti, Parrot è in grado di controllare esattamente come i canali di oggetto interagiscono con i canali delle tracce quando le tracce di collisione accadono nel mondo. Viene impostata una risposta predefinita per ciò che dovrebbe in generale accadere, ma questo può essere personalizzato come si desidera. Parrot dispone inoltre di alcune preimpostazioni dei canali delle tracce personalizzate: Giocatore, OverlapAllPlayers, BlockAllPlayers, Palla di cannone e Nemico.
Le preimpostazioni sono particolarmente utili per i trigger del gameplay. Per esempio, OverlapAllPlayers può ignorare tutte le altre collisioni e rispondere solamente agli eventi di collisione con i tipi di oggetto di collisione del giocatore. Se osservi le impostazioni di collisione per mesh differenti nel gioco, vedrai queste preimpostazioni usate frequentemente.
Le impostazioni di collisione possono essere anche personalizzate per mesh se desiderato.
Limiti del mondo
Quando crei i livelli, un aspetto da tenere a mente sono i Limiti del mondo. Si impostano da Impostazioni mondo > Mondo. Puoi implementare un tipo di danno personalizzato per quando un attore interagisce con questi limiti del mondo definiti. I limiti di Parrot usano una combinazione dell'impostazione del mondo KillZ e dei volumi trigger Fuori dai limiti.
Trigger Volume
Unreal Engine ha attori del volume trigger integrati (vedi Attori del volume attivatore in Unreal Engine) utilizzabili per attivare gli eventi. Esempi in cui gli sviluppatori li usano in Parrot sono i volumi trigger Fuori dai limiti e Linea del traguardo. I volumi trigger sono spesso utilizzati in concomitanza con la blueprint del livello (vedi il documento sviluppatori Blueprint del livello in Parrot), ma non occorre. Il trigger di Parrot per Fuori dai limiti è un attivatore riquadro con un grafico evento semplice:
Se osservi le impostazioni di collisione dell'attore nel pannello Dettagli, vedrai la preimpostazione del canale di collisione svolgere qui la maggior parte del lavoro.
Raccolta potenziamento
Diamo uno sguardo a un esempio pratico del sistema di collisione con l'implementazione della raccolta potenziamento. Se apri BP_PickupBase in Contenuto > Blueprint > Raccolte e osservi la viewport, puoi vedere la gerarchia che contiene il componente di collisione.
Le impostazioni di collisione e Fuori dai limiti hanno una preimpostazione trigger che genera eventi di sovrapposizione con i giocatori:
Se osservi il Grafico eventi, vedrai l'evento ActorBeginOverlap con Altro attore come parametro. Questo evento funziona esattamente come OnCollisionEnter in Unity. La differenza qui è che anziché essere trasmesso come componente di collisione, ti viene assegnato l'attore stesso.
Parrot verifica che l'attore è un giocatore che ha eseguito una sovrapposizione. Poi viene chiamato l'evento OnPickedUp. Questo permette alle classi blueprint derivate di definire il loro comportamento per OnPickedUp mentre la classe di base gestisce l'evento stesso di sovrapposizione dell'attore.
Gli sviluppatori utilizzano la blueprint di base per gestire la disponibilità di tutte le raccolte che riproducono un suono e generano alcuni effetti di particelle. Il suono della raccolta e le variabili degli effetti particellari sono modificabili per l'istanza cosicché possono essere impostati nelle impostazioni predefinite delle classi derivate. Le Impostazioni predefinite della classe sono localizzate nell'editor Blueprint in cima accanto al pulsante di compilazione:
Un esempio di impostazioni predefinite della classe modificate si trova con la raccolta in velocità che usa un sistema Niagara con particelle verdi (cfr. la raccolta di cuori che usa il rosa). In modo simile, la mesh di raccolta stessa può essere impostata su blueprint derivate. L'ultimo passaggio nella logica di sovrapposizione è distruggere l'attore di raccolta poiché non vogliamo che persista dopo che un giocatore l'ha raccolto.
Con solo pochi nodi, sei in grado di creare una logica robusta facilmente estendibile alle blueprint derivate. Tutte le blueprint derivate hanno origine da un evento di sovrapposizione legato all'attore.
Personaggio giocatore che salta sopra a un nemico
Un altro fantastico esempio da esaminare è il giocatore che salta sopra a un nemico. Il tipo di collisore capsula del nemico è "nemico" e si scontra con i tipi di oggetto del giocatore. Anche i nemici con le spade hanno un evento di sovrapposizione simile. Questi sono generalmente riferiti come hitbox e si trovano laddove un attacco è efficace.
Ma quando un giocatore va a saltare sopra a un nemico, come Parrot aggira il problema? La soluzione era posizionare un hurtbox sulla testa dei nemici. Quando il giocatore si sovrappone a questo volume di hurtbox, il personaggio giocatore può dunque effettuare una serie di controlli per vedere se è un salto valido in base alla posizione del personaggio, alla posizione dell'hurtbox e alle estensioni del riquadro. Se i controlli sono superati, il giocatore può effettuare il salto e compire il nemico. Il lavoro sporco è ancora una volta fatto dai canali di collisione che filtrano sulle sole sovrapposizioni che interessano a Parrot: un oggetto di collisione del giocatore e un nemico sul volume dell'hurtbox.