Unity ha il supporto esistente per le linee temporali?


13

Sto pianificando lo sviluppo di un gioco in Unity3D e sto provando a fare i conti con ciò che il motore ha già fornito e che cosa devo codificare da solo.

Il gioco stesso sarà un gioco ritmico, il che significa sincronizzare eventi audio e grafici in modo che giochino sempre quando dovrebbero. Quello che sto cercando di evitare è un potenziale scenario di ritardo in cui l'audio o la grafica iniziano a progredire più velocemente dell'altro.

Quando abbiamo discusso di questo tipo di sistema di coordinamento nella mia classe di design del gioco all'università, il mio professore ha definito questo tipo di design una classe "Timeline". L'idea è che è possibile creare un'istanza di uno o più di questi per progredire a velocità diverse, pianificare cose che accadranno in futuro e sincronizzare eventi periodici. Tuttavia, chiamare questa classe "Timeline" sembra essere stato limitato al mio stesso professore, in quanto cercare su un certo API se la funzionalità "Timeline" sia stato uno sforzo inutile.

C'è qualche nome più comune per questo tipo di funzionalità? Unity ha dei metodi preesistenti per coordinare la pianificazione di eventi come questo o è questo il tipo di cose che devono essere integrate nel motore? E se lo fa, apprezzerei essere indirizzato verso alcuni tutorial!


Ho anche usato classi Timeline simili (avevano persino lo stesso nome). Un nome più comune per il modello non mi è noto, ma probabilmente è spesso implementato tramite programmazione funzionale-reattiva, coroutine o altri concetti asincroni.
interphx,

Risposte:


10

Sebbene questa funzionalità non sia disponibile in Unity, un'implementazione di base di una tale sequenza temporale non dovrebbe essere troppo difficile da fare.

Ecco come lo farei:

  • La classe Timeline utilizza internamente una coda di priorità come struttura di dati per archiviare eventi.
  • Un evento potrebbe essere solo un momento e una richiamata. In modo da aggiungere eventi al calendario sarebbe semplice come: timeline.AddEvent(0.25f, MyCallback).
  • Con ogni Update, la classe della sequenza temporale dovrebbe:

    1. Incrementa la testina (un semplice float) del tempo trascorso
    2. Controlla la testa della coda di priorità e rimuovi e chiama la richiamata di tutti gli eventi che hanno una priorità (ad es. Tempo) minore o uguale all'attuale playhead.

Se hai bisogno di una sorta di funzionalità di riavvolgimento o riproduzione , ovviamente sarebbe sciocco rimuovere tutti gli eventi dalla coda (il che significa che dovresti aggiungerli di nuovo quando riavvolti). Invece potresti anche usare un array che contiene i tuoi eventi . Un evento consisterebbe in un Timee Callback. Dovresti mantenere il tuo array ordinato per Time.

Quindi, invece di rimuovere gli elementi dall'array, tieni traccia dell'attuale indice dell'array e con ogni aggiornamento cerca avanti da quell'indice ed esegui tutti i callback Playhead >= Timeaumentando allo stesso tempo l'indice.

L'implementazione di una maggiore velocità di riproduzione funziona con entrambe le implementazioni e sarebbe semplice come:

Playhead += Time.deltaTime * playbackSpeed

2
"Incrementa la testina (un semplice float) del tempo trascorso" - In questo caso otterrai errori in virgola mobile aggregati. Dovresti invece usare Time.time (il tempo trascorso dall'inizio del gioco) .
BlueRaja - Danny Pflughoeft

4

No, Unity3D non ha una simile API pronta all'uso.

Supporta le coroutine, tuttavia, e suggerisco di esaminarle. Le coroutine generalmente rendono la pianificazione e la sincronizzazione degli eventi davvero facili.


1

Non sono sicuro che si tratti di una novità rispetto alle risposte del 2012, ma Unity in realtà ha il supporto per il controllo della sequenza temporale tramite l' Editor animazione (legacy) .

Sebbene questa funzione sia destinata principalmente all'animazione di parametri di oggetti con curve, include la possibilità di attivare script su Eventi di animazione . Questi script potrebbero guidare la tua grafica e audio.

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.