¿Unity tiene soporte existente para Timelines?

13

Estoy planeando el desarrollo de un juego en Unity3D, y estoy tratando de aceptar lo que el motor ya ha proporcionado y lo que debo codificar.

El juego en sí será un juego de ritmo, lo que significa sincronizar audio y eventos gráficos para que siempre jueguen cuando se supone que deben hacerlo. Lo que estoy buscando evitar es un posible escenario de retraso en el que el audio o los gráficos comienzan a progresar más rápido que el otro.

Cuando discutimos este tipo de sistema de coordinación en mi clase de diseño de juegos en la universidad, mi profesor llamó a este tipo de diseño una clase de "Línea de tiempo". La idea es que puede crear una instancia de uno o más de estos para progresar a diferentes velocidades, programar cosas que sucederán en el futuro y sincronizar eventos periódicos. Sin embargo, llamar a esto una clase de "Línea de tiempo" parece haberse limitado a mi propio profesor, ya que buscar en Google si ciertas características de API tienen la funcionalidad "Línea de tiempo" ha sido un esfuerzo infructuoso.

¿Hay algún nombre más común para este tipo de funcionalidad? ¿Tiene Unity algún método preexistente para coordinar la programación de eventos como este, o es este el tipo de cosas que deben integrarse en el motor? Y si es así, ¡agradecería que me señalaran algunos tutoriales!

Soñador cuervo
fuente
También he usado clases de línea de tiempo similares (incluso tenían el mismo nombre). Un nombre más común para el patrón es desconocido para mí, pero probablemente a menudo se implementa a través de programación funcional-reactiva, rutinas u otros conceptos asincrónicos.
Interphx

Respuestas:

10

Si bien esta funcionalidad no está disponible en Unity, una implementación básica de dicha línea de tiempo no debería ser demasiado difícil de hacer.

Así es como lo haría:

  • Su clase Timeline utiliza internamente una cola de prioridad como estructura de datos para almacenar eventos.
  • Un evento podría ser solo un momento y una devolución de llamada. Por lo que añadir eventos a la línea de tiempo serían tan simple como: timeline.AddEvent(0.25f, MyCallback).
  • Con cada Update, la clase de línea de tiempo:

    1. Incremente el cursor de reproducción (un simple float) por el tiempo transcurrido
    2. Verifique el encabezado de la cola de prioridad y elimine y llame a la devolución de llamada de todos los eventos que tienen una prioridad (por ejemplo, tiempo) menor o igual al cabezal de reproducción actual.

Si necesita algún tipo de funcionalidad de rebobinado o reproducción , por supuesto sería una tontería eliminar todos los eventos de la cola (lo que significa que tendría que agregarlos nuevamente cuando se rebobine). En cambio, también podría usar una matriz que contenga sus eventos . Un evento consistiría en un Timey Callback. Tendría que mantener su matriz ordenada por Time.

Luego, en lugar de eliminar elementos de la matriz, debería realizar un seguimiento del índice de matriz actual y , con cada actualización, buscar desde ese índice y ejecutar todas las devoluciones de llamada al Playhead >= Timetiempo que aumenta el índice en consecuencia.

Implementar una velocidad de reproducción más rápida funciona con ambas implementaciones y sería tan simple como:

Playhead += Time.deltaTime * playbackSpeed
bummzack
fuente
2
"Incremente la cabeza lectora (un flotador simple) por el tiempo transcurrido" - Si hace esto, obtendrá errores de coma flotante agregados. En su lugar, debes usar Time.time (el tiempo desde que comenzó el juego) .
BlueRaja - Danny Pflughoeft
4

No, Unity3D no tiene tal API fuera de la caja.

Sin embargo, admite corutinas, y le sugiero que las examine. Las corutinas generalmente hacen que la programación y sincronización de eventos sea realmente fácil.

No importa
fuente
1

No estoy seguro de si esto es nuevo desde las respuestas en 2012, pero Unity en realidad tiene soporte para el control de la línea de tiempo a través del Editor de animación (heredado) .

Aunque esta función está destinada principalmente a animar parámetros de objetos con curvas, incluye la capacidad de activar scripts en eventos de animación . Estas secuencias de comandos podrían controlar sus gráficos y audio.

DMGregory
fuente