¿Cómo puedo implementar una función de "avance rápido" en mi juego?

15

¿Cómo puedo implementar la función de avance rápido para mi juego de defensa de la torre como en http://fieldrunners.com/ y otros juegos de TD?

Estoy usando Unity 3D. ¿Habría algo para gestionar menos fotogramas por segundo o algún tipo de movimiento rápido de enemigos establecido manualmente y velocidad de disparo de la torre, etc.?

Syed
fuente
¿Has intentado aumentar la frecuencia de actualización? puede que tenga que salten fotogramas ..
concept3D

Respuestas:

7

Si su juego no tiene simulaciones complicadas o computacionalmente costosas que requieren separarlas en líneas de tiempo de actualización independientes, puede usar un enfoque simple de basar el código en sus Update()funciones en el valor Time.time de Unity, y en su código establecer el valor de Time .timeScale para ser lo que quieras. 0 == en pausa, 1 = normal, a nuestros evaluadores les encanta establecer timeScale> 1 para hacer las cosas más rápido.

http://unity3d.com/support/documentation/ScriptReference/Time-timeScale.html

Programador de juegos crónicos
fuente
18

Enfoque: mayor tasa de simulación

Su sincronización para su interfaz de usuario debe estar desacoplada de su ciclo de juego real, al igual que su representación. Digamos, por ejemplo, que su mundo corre a una velocidad 4x. Digamos que a tu velocidad básica (1x), tu juego ejecuta 30 actualizaciones por segundo.

Entonces tendría algo como lo siguiente, cuando esté en modo de avance rápido:

  • World logic ejecuta 4 actualizaciones para cada actualización de la interfaz de usuario y el procesador. Esto significa que necesita ejecutar 120 actualizaciones por segundo. Por lo tanto, su modelo mundial (datos) se actualiza a este ritmo.
  • El procesador y la lógica de la interfaz de usuario continúan sondeando o hacen lo que sea a 30 actualizaciones por segundo.

En otras palabras, el juego en su conjunto no funciona más rápido. La parte de simulación es.

Puedes deducir dos cosas de esto:

  1. Debes mantener la lógica de tu juego lo suficientemente simple como para poder ejecutarla cuatro veces más rápido en tu plataforma objetivo, O necesitas introducir métodos para extrapolar varios aspectos de la jugabilidad más rápidamente; sin embargo, esto puede resultar en un modelo que es diferente de lo que hubiera sido si simplemente hubiera utilizado una simulación de ritmo más rápido. Por lo tanto, la compensación sería el costo de procesamiento por precisión. Ver enfoque 2, más abajo.

  2. Es la separación de preocupaciones lo que le permite acelerar fácilmente su simulación mundial, siendo esa separación modelo, vista y controlador ( MVC ). Si sus datos mundiales (M), la lógica de procesamiento (V) y la lógica del juego (C) están todos mezclados, realmente no podrá hacer esto, al menos no sin una migraña masiva.

Enfoque: extrapolación basada en deltas de tiempo

Como se mencionó anteriormente, deberá calcular el movimiento en función de lo lejos que habría viajado algo en un momento dado. Sin embargo, esto supone que la física de su juego es inherentemente más realista en su simulación, lo cual puede no ser el caso. Este es un tema bastante más amplio y considerablemente más complejo. Tendrá que hacer más preguntas sobre si desea saber. Básicamente, harás algunos cálculos para hacer las cosas bien. Tendrá que lidiar con la interpenetración en colisiones y una serie de otros problemas que no abordaré aquí.

Para concluir

Esto te da el esquema general. Tu elección de idioma es tuya, presumiblemente sabes cómo hacerlo en Unity o no. El tiempo en cualquier idioma requiere que comprenda los entresijos en detalle, sugiero comenzar con los artículos de Gaffer y consultar los documentos de la API de Unity.

Ingeniero
fuente
Si va a utilizar el enfoque de tasa de simulación más alta y desea admitir la desaceleración , probablemente necesite tener una tasa de simulación de base extremadamente lenta y luego ejecutarla de manera predeterminada en 100 pasos / cuadro de simulación.
bobobobo
9

Como principio general, la actualización de la lógica del juego debe estar desacoplada de la actualización de los gráficos del juego, es decir, la simulación de su juego, IA, movimiento de la unidad, etc., no debe estar vinculada a la velocidad a la que se desarrolla el juego . Por lo general, el ciclo principal del juego calcula cuánto tiempo real ha transcurrido desde la última actualización del juego y envía ese paso de tiempo delta a las rutinas de actualización de cada objeto lógico del juego individual.

En tal escenario, se vuelve simple implementar la escala de tiempo (incluido el avance rápido) en su juego. Simplemente premultiply el paso del tiempo de la lógica del juego por un valor escalar que controla cuánto "adelantar" o ralentizar el tiempo. Por defecto, este valor sería uno y, por ejemplo, una vez que el usuario presiona la tecla "avance rápido", lo establece en 1.5, y toda la simulación parecería ir un 50% más rápido. Sin embargo, aún renderizarías al mismo ritmo.

No estoy muy familiarizado con Unity y, por lo tanto, podría estar equivocado en la siguiente sugerencia, pero Unity tiene un componente de gestión del tiempo que puede ser útil para implementar esto. De hecho, ya tiene una propiedad de escala de tiempo. La descripción del componente implica que la clase fue diseñada para objetos de física, pero también puede ser aplicable a su escenario.


fuente
1
Definitivamente es aplicable a su escenario. Todo lo que necesitaría hacer es establecer Time.timeScale en algún multiplicador y todo irá más rápido. Es un cambio en todos los ámbitos, por lo que si hay cosas como las interacciones del menú y otras, también irán más rápido.
Tetrad
gracias de nuevo Tetrad :)
Syed