Combattimento
Il combattimento è meno di un sistema discreto e più di uno astratto... È la complessa interazione di vari sistemi differenti che operano insieme e la complessità dell'implementazione dipende enormemente da quella del design.
Nel nostro gioco, il design è molto semplice. Il giocatore ha un solo attacco: saltare su un nemico. I nemici hanno due diversi modi di attaccare il giocatore: mischia e corpo a corpo, in base al tipo di nemico.
Per l'attacco del giocatore e l'attacco in mischia del nemico i fondamenti sono quasi esattamente gli stessi. Disponiamo di una o più hitbox posizionate sulla mesh scheletrica del personaggio in base a come può attaccare in mischia, oltre a una o più hurtbox per approssimare l'area in cui desideriamo testare i colpi subiti.
Per l'attacco ravvicinato del nemico utilizziamo il collisore capsula del nemico per verificare se il giocatore è entrato in contatto con esso ed eseguire le stesse azioni di colpi effettuati in mischia. Puoi vedere l'implementazione di ciò che avviene quando un personaggio è colpito nella nostra classe di base del personaggio, che si trova qui: Parrot\Source\Parrot\Public\Character\ParrotCharacterBase.h. La logica funzionale è contenuta qui e nelle sottoclassi ParrotPlayerCharacter.h e ParrotEnemyCharacterBase.h.
Il personaggio giocatore
La configurazione del giocatore è unica riguardo al modo di attaccare un nemico. Quando il giocatore si sovrappone con un'hurtbox del nemico, il nemico ritrasmette questa informazione al giocatore per chiedere se l'attacco è stato valido. In tal caso, verifica se il giocatore si trova al di sopra della cima dell'hurtbox per assicurare che il giocatore atterri sopra e non colpisca dai lati o sotto. Se l'attacco è valido, il nemico segnala al giocatore di eseguire un salto. Se il giocatore sta ancora tenendo premuto il pulsante di salto quando entra in contatto con l'hurtbox, salterà più in alto. Rilasciarlo prima di entrare in contatto con l'hurtbox comporterà un salto più basso.
Il personaggio nemico
La configurazione per il nemico è un po' più complicata per alcune ragioni. Vogliamo che gli attacchi in mischia sembrino realistici, allora le hurtbox del nemico sono posizionate sul bordo delle loro armi. Le hitbox, le hurtbox e la configurazione del collisore capsula sono visibili nella viewport della blueprint del personaggio nemico, come quella che si trova qui: Blueprints > Enemy > Skeleton > BP_EnemyCharacter_Skeleton.
In questo esempio, puoi vedere l'hurtbox sulla testa, l'hitbox sull'arma e il collisore capsula. Ciascuno di questi trigger guida gli eventi di sovrapposizione verso le funzioni genitore nella classe di base del personaggio.
In aggiunta le animazioni dell'attacco inviano eventi di notifica che abilitano solo le hitbox delle armi durante la parte di animazione quando l'arma viene brandita. In questo modo, si ha l'impressione che il giocatore sia colpito realmente dall'arma e non che sia semplicemente venuto a contatto con un nemico e subisca danni in un momento a caso. Queste notifiche di animazione sono inserite nell'animazione dell'attacco in punti specifici per attivare l'hurtbox da abilitare e poi disabilitare. Puoi vedere le notifiche di animazione in Blueprints > Enemy/EnemyBase > BP_AnimNotify_EnemyAttackBegin e Blueprints > Enemy > EnemyBase > BP_AnimNotify_EnemyAttackEnd con la configurazione nell'animazione dell'attacco di un personaggio nemico specifico, come Assets> Quaternius > PirateKit > Characters > Headless_Skeleton > Animations > Characters_Skeleton_Headless_Anim_CharacterArmature_Sword.
Il personaggio nemico è quello che verifica la presenza di sovrapposizioni ed eventi trigger: ciò significa che il nemico attiva sia il proprio HitCharacter() sia le funzioni HitCharacter() del giocatore quando sono rilevate sovrapposizioni appropriate.
Puoi vedere il codice con cui le azioni su hitbox e hurtbox si sovrappongono qui: Parrot\Source\Parrot\Public\Character\ParrotEnemyCharacterBase.h nelle funzioni HitBeginOverlap() e HurtBeginOverlap().
Combattimento contro il boss
Per il nostro combattimento contro il boss, c’è una funzione aggiuntiva quando questo è colpito dal giocatore al fine di riprodurre una sequenza di "ira". Puoi visualizzare il codice blueprint che attiva una risposta del boss qui: Blueprints > Enemy > BossShark > BP_EnemyCharacter_BossShark.
La sequenza di "ira" è una semplice sequenza temporizzata che riproduce un'animazione "scrolla testa" telegrafata prima di aumentare la velocità di camminata del boss e di abilitare una fiamma verde della componente Niagara per VFX. Durante la sequenza, disabilita anche l'hurtbox così il capo è invincibile.