Buone tecniche per sincronizzare le azioni di gioco con tempi di animazione specifici?


10

Quindi ho riscontrato un problema nel gioco a cui sto lavorando, ma sembra essere una cosa piuttosto fondamentale che probabilmente si presenta in molti giochi.

Il mio gioco richiede che alcune funzioni di gioco si verifichino in un momento specifico durante l'animazione del personaggio. E così, come dice il titolo, mi chiedo quali siano alcune buone tecniche e strategie fondamentali per sincronizzare eventi / funzioni / azioni relative al gameplay a punti specifici nell'animazione di un personaggio.

Ecco alcuni semplici esempi di ciò di cui sto parlando in vari tipi di giochi:

  • Il tuo personaggio ricarica la sua pistola in uno sparatutto . Il tuo personaggio gioca la sua animazione di "ricarica", ma è importante che la funzione che imposta la variabile corrente di Ammo sia chiamata solo nel momento esatto in cui il caricatore viene scambiato e l'arma è armato. Questo potrebbe essere un punto nel mezzo dell'animazione di ricarica.

  • In un gioco di ruolo a turni i tuoi personaggi si trovano in una linea di fronte a una linea di nemici. Quando ti viene comandato di attaccare, uno dei tuoi personaggi corre / salta su uno dei nemici e lancia la loro spada gigante prima di correre / saltare di nuovo in piedi. Vuoi assicurarti che il nemico sia danneggiato nel momento esatto in cui viene riprodotta l'animazione di taglio - un punto tra correre e tornare indietro.

  • In un gioco invisibile , il tuo personaggio può intrufolarsi e interagire con computer e pulsanti nel mondo. Forse c'è un pulsante che spegne l'alimentatore delle luci dell'avamposto che stai infiltrando. Quando si preme il pulsante di azione, il personaggio si allunga e preme il pulsante, quindi torna alla posizione di riposo. Si desidera che le luci si spengano nel punto esatto nell'animazione "push_button" quando si preme il pulsante.

Certo, il mio caso particolare è molto simile al secondo esempio , in cui ho creato un'animazione in cui il mio personaggio a turni si lancia in avanti durante un attacco e voglio che il danno sia applicato nel momento esatto in cui l'animazione sembra prendere contatto . Perché il mio gioco usa un sistema a turni (immagina qualcosa come Final Fantasy o Fire Emblem) Voglio il danno / guarigione / magia / ecc. da applicare al momento giusto durante l'animazione di ciascun personaggio, anche se in realtà non utilizzo collisioni / hitbox.

Dovrei menzionare che sto realizzando il mio gioco in un motore di gioco popolare e che in questo momento lo sto gestendo utilizzando i loro eventi di animazione o le notifiche per ottenere qualcosa vicino ai risultati desiderati: il mio personaggio esegue un certo comando e attiva un l'animazione specifica del comando (ovvero: "command_command") e le risorse di animazione per ciascuno dei miei comandi devono includere un evento di animazione / notifica "callback" nella funzione ExecuteCommand dei miei caratteri. In altre parole: il personaggio dice che l'animazione dell'attacco deve essere riprodotta, quindi l'animazione dell'attacco emette un evento / notifica la richiamata nel personaggio nel momento esatto durante l'animazione quando il danno deve essere inflitto.

Onestamente, per ora funziona, ma sembra sbagliato - come se mi perdessi una parte del quadro più grande qui! Parte del motivo per cui questo metodo sembra sbagliato è che accoppia la logica di gioco alle risorse di animazione; se la mia risorsa di animazione dimentica di includere un evento / callback ExecuteCommand (), il comando non verrà eseguito correttamente e sarà necessario un codice aggiuntivo per verificare se l'animazione di un comando è terminata senza eseguire il comando. È disordinato e significa che il mio gameplay ha una strana dipendenza dalle sue risorse. Ovviamente voglio che il danno si verifichi in un punto specifico durante l'animazione dell'attacco, ma mi sento davvero strano nel chiamare il codice di gioco all'interno delle risorse dell'animazione.

Quindi cosa sto trascurando qui? Quali sono alcune buone tecniche generali per gestire questo tipo di situazioni in cui desideri che determinate azioni di gioco importanti si verifichino in momenti specifici durante le animazioni?

Modifica: per chiarire, questa non è una domanda specifica per il motore né sto cercando progetti / tecniche specifici per il motore. Sono interessato alle tecniche generali di sincronizzazione di animazione / gameplay che potresti utilizzare nei tuoi progetti di gioco indipendentemente dalle tecnologie utilizzate.


1
Non ho capito bene. Dici che vuoi che il gameplay dipenda dai tempi delle animazioni, ma poi dici che non vuoi che il tuo gameplay dipenda dalle tue risorse e le animazioni sono un tipo di risorsa. Come pensi che quei desideri siano compatibili?
Anko,

Voglio che alcuni elementi di gioco siano sincronizzati con l'animazione. Tuttavia, la sincronizzazione tra due cose non implica sempre una dipendenza, giusto? Sono interessato ad alcune tecniche che le persone usano per sincronizzare le loro animazioni con il loro gameplay. Ho detto quello che ho provato e quello che sto facendo attualmente per raggiungere questo obiettivo - e quindi la mia domanda è: esiste una tecnica diversa / migliore / alternativa che si potrebbe usare o è questa (eventi di animazione / notifiche / callback inseriti nel risorse) in modo standard? È questo che usi nei tuoi progetti?
MrKatSwordfish

Risposte:


5

Per la sincronizzazione, devi decidere a chi (il tuo codice, le tue animazioni o nessuno dei due) è l' autorità di temporizzazione, il "battito" a cui tutti "ballano".

Accordi diversi si adattano a giochi diversi:

  • Le animazioni sono l'autorità di temporizzazione (la configurazione corrente)

    Il codice di gioco può attivare animazioni. Quando le animazioni raggiungono determinati punti, generano eventi (ad es. Ricarica completata) a cui il codice di gioco potrebbe reagire (ad es. Ripristino delle munizioni disponibili).

    Se i tempi precisi delle animazioni (indipendentemente dallo stato del gioco) sono una parte importante del tuo gioco, o se desideri che i tuoi animatori controllino i tempi, prendi in considerazione questo approccio.

    Gli strumenti di animazione Blender (3D) e Spine (2D) consentono all'animatore di definire eventi a cui il codice di gioco può iscriversi.

  • Il codice è l'autorità di temporizzazione

    Inverso di quanto sopra: Gli eventi che si verificano nel mondo di gioco (ad es. Il giocatore che sceglie di ricaricare la propria arma) causano il funzionamento delle animazioni e il passaggio dei parametri (ad es. Tempo fino al completamento della ricarica). Ogni animazione utilizza i parametri forniti per modificare l'aspetto (ad es. Eseguendo l'animazione a una velocità adeguata in modo tale che la "parte ricaricata" avvenga quando specificato).

    Le animazioni potrebbero anche essere in ascolto di eventi di gioco (ad es. Il giocatore annulla la ricarica o il giocatore si accovaccia durante la ricarica) e modifica il suo aspetto di conseguenza.

    Se le tue animazioni possono permettersi di essere flessibili sui tempi, il tuo gioco si basa fortemente su contenuti generati proceduralmente o se desideri che i tuoi programmatori controllino i tempi, considera questo approccio.

    Le animazioni dei personaggi di Overgrowth sono in gran parte strutturate in questo modo: David Rosen lo spiega nel suo discorso sul GDC 14 (vedi in particolare isegmenti Movimento e Movimento Continua ).

  • Tempistica implicita (autorità esterna)

    Nei giochi ritmici o in altre situazioni in cui il tempo è controllato da una fonte esterna (nei giochi ritmici, il ritmo della traccia musicale), può avere senso modellare le cose in quanto tali. Il codice di gioco e le animazioni possono sia leggere un timestamp globale che lo stato del gioco, quindi comportarsi di conseguenza senza comunicare.

    Se lo stato del gioco e le animazioni dipendono in gran parte da un'autorità di temporizzazione esterna, prendere in considerazione questo approccio.

Ovviamente potresti voler usare approcci diversi per sistemi diversi nel tuo gioco. (Ad esempio, i giochi ritmici usano spesso il ritmo della canzone come un'autorità esterna, ma le animazioni ascoltano ancora gli eventi di interazione del giocatore per annullare o modificare l'aspetto delle note trattenute.)


0

Ho letto da qualche parte che quasi tutti i problemi di calcolo possono essere risolti con un ulteriore livello di astrazione e non vedo il tuo caso diverso.

Per questo requisito generalmente vedo un livello per controllare lo stato del personaggio. In questo modo il personaggio avrà un'animazione corrente e uno stato attuale. Ognuno con la propria responsabilità.

L'animazione è responsabile solo della vista e lo stato gestisce la logica specifica del gioco per quell'azione.

Nel mio gioco di combattimento, lo stato è un oggetto che eredita dalla classe BaseState e ha un metodo Update (). Ogni personaggio ha una raccolta di stati, ma solo uno può essere assegnato alla volta. E il metodo Update () dello stato corrente viene chiamato una volta per frame.

È all'interno dell'aggiornamento () dello stato in cui eseguo tutta quella logica: imposta la velocità del carattere in un frame specifico, incrementa / decrementa la salute ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.