El humo y los espejos de las buenas cuentas atrás, Parte 2

Lo que vas a crear

La última vez, vimos las cuentas regresivas en los juegos, cómo están configuradas y qué elementos puedes usar para hacerlos más atractivos. Sin embargo, hay mucho más de lo que cabe en un solo artículo, aunque!

Esto continuará desde la Parte 1, por lo que comenzaremos en el número siete..

Listo? Vamonos!

7: Tener una velocidad de tictac constante diferente

Este es un truco simple que ni siquiera requiere que le mientas al jugador. Simplemente diga "cuando se agote el tiempo" y muestre un reloj de tic tac. Lo que no mencionas es el unidad que se muestra.

Si muestra un "10", el jugador intuirá que esto es de 10 segundos, pero el número puede disminuir más lentamente que los segundos. Si modifica el valor con un 0.5 multiplicador, por ejemplo, se agotará después de 20 segundos en lugar de solo 10.

Puedes ver cómo funciona esto en mi juego Ludum-Dare, Cada diez segundos un gatito se ahoga..

Un temporizador en Cada diez segundos un gatito se ahoga. El temporizador es lo suficientemente lento como para darle al jugador una buena cantidad de tiempo mientras sigue apareciendo muy bajo

El tema de la mermelada requería que 10 segundos se utilizan, pero 10 segundos reales son una cantidad de tiempo demasiado baja para lograr algo significativo.

8: Adaptar la velocidad de tictac durante el juego

Esto también funciona mejor si las unidades de tiempo no se mencionan y al jugador se le da una idea aproximada de "hasta que esto suceda"..

Si tiene una serie de paneles que se iluminan para mostrar el progreso del temporizador, no necesita activarlos a la misma velocidad. De hecho, se volverá más intenso si los primeros se iluminan rápidamente y los últimos tienen más tiempo entre ellos. En el juego lleno de acción, el jugador no se dará cuenta de esto y tendrá una experiencia mucho más intensa..

Esto no debe emplearse con unidades de tiempo reales, ya que los jugadores pueden sentirse engañados y mentidos. No rompas la confianza del jugador en tu sistema..

Esto se puede ver en un nivel de Starfox 64, donde el jugador tiene que defender una posición contra una nave gigante que se aproxima.

Minimapa en Starfox 64. La nave nodriza atacante (el círculo negro) se está moviendo hacia la base en el medio, lo que le da al jugador un reloj de tiempo aproximado de cuánto tiempo queda para destruirlo

A primera vista, tienes una idea aproximada de cuánto tiempo queda, pero la nave parece moverse a diferentes velocidades y no en línea recta..

En esencia, el temporizador se está adaptando al vuelo, cuyo proceso se oculta detrás del humo y los espejos..

9: usar sonidos

¡Las cuentas regresivas no tienen que ser puramente ópticas! Un pitido cada pocos segundos mejorará enormemente la inmersión.

Una vez que tenga eso, también puede adaptar la frecuencia una vez que haya transcurrido una cierta cantidad de tiempo. Si el pitido se produce cada cinco segundos, en los últimos 30 segundos del temporizador se notificará al jugador sin tener que mirar el número y calcular mentalmente cuánto queda.

Del mismo modo, también ayuda si un personaje comenta sobre el progreso. Que alguien diga "¡Estamos a medio camino!" le brinda una información bien enmarcada que es mucho más fácil de entender que analizarla desde una lectura.

10: Utilizar imágenes de escala

Esto funciona muy bien cuando el contador está llegando a su fin. Cada vez que transcurra otro segundo, amplíe todo el contador durante medio segundo..

Además de color y sonido, esto lo hará mucho más jugoso.

11: hacer algo cuando llega a cero

Asegúrate de que un temporizador nunca se vuelva negativo; esto confundirá a mucha gente y parecerá un error, ya que los temporizadores de errores y mal creados tienden a hacer eso..

Tener un flash sería un buen toque, ya que de nuevo subraya el punto de que acaba de agotarse.

Si tiene un temporizador positivo, es un elemento divertido simplemente dejar que siga funcionando y usar ese elemento como puntaje alto. El juego Dagas del diablo hace una cosa similar, donde el objetivo principal es "Sobrevivir 500 segundos".

Jugabilidad de Dagas del diablo

Qué no hacer que rompería la confianza del jugador

Una vez que se han establecido las reglas de un temporizador, deben permanecer aproximadamente consistente, con más margen de maniobra, menos exacto es el temporizador. La pregunta principal debe ser: "¿De qué manera esta regla oculta beneficia a la experiencia?"

Cuando reduzca la velocidad de un temporizador en los últimos tres segundos, la situación se volverá más tensa y le dará al jugador algunos segundos más para lograrlo. Ralentizarlo aleatoriamente en el medio, o acelerarlo, solo romperá la confianza del jugador en tus reglas.

Vamos a construirlo

Esto continuará con el código base del último tutorial y se construirá sobre él. Si aún no lo has comprobado, ¡hazlo ahora! También puede descargar la fuente terminada en la parte superior derecha de este artículo.

La última vez que dejamos nuestro temporizador, se veía así:

Ahora, las nuevas adiciones harán que se comporte de manera más interesante. Continuaremos con la cuenta atrás.cs-script, que debería verse así:

utilizando UnityEngine; utilizando System.Collections; Cuenta atrás de clase pública: MonoBehaviour float timer = 60f; AudioBip público SoundBlip; void Update () if (timer> 0f) timer - = Time.deltaTime;  else timer = 0f;  si (temporizador < 10f)  GetComponent() .color = Color.red;  else if (temporizador < 20f)  GetComponent() .color = Color.yellow;  GetComponent() .text = timer.ToString ("F2");  

Hacer que suene

Hagamos que nuestro temporizador emita un pitido cada segundo, para que el jugador sepa que está disminuyendo incluso sin mirarlo..

Primero, necesitamos un buen punto luminoso en un radar efecto de sonido. Puede encontrar un archivo de audio en los archivos de origen o crear uno bonito con la herramienta gratuita BFXR. Una vez que tenga uno, cópielo en su carpeta de activos.

Agregue un componente AudioSource a su objeto de cuenta atrás a través de Componente> Audio> AudioSource. Agregue esta variable al script de cuenta atrás:

AudioBip público SoundBlip;

También es necesario asignar el archivo de sonido a la SoundBlip variable:

Y agrega este bloque a la Actualizar función:

if (Mathf.Round (timer * 100) / 100% 1f == 0) GetComponent() .PlayOneShot (soundBlip); 

Esto verificará si el temporizador está en la segunda marca completa, y si es así reproduce el archivo de sonido.

El funcionamiento real de este código es un poco más complicado. Lo que hace es primero redondear el temporizador de punto flotante a dos puntos decimales, luego dividirlo por 1 y ver si hay un resto. Si el resto es cero, significa que el temporizador ha alcanzado un segundo completo y que se puede reproducir el sonido de blip.

Si no lo hacemos, el sistema podría activarse mucho más a menudo, lo que no será divertido ni propicio para un buen temporizador..

Velocidad diferente

Esto agregará un multiplicador que reducirá o acelerará la velocidad del reloj. Agrega esta variable al principio:

multiplicador de flotación = 0.6f;

Ahora encuentra la línea que reduce el temporizador, es este:

timer - = Time.deltaTime;

Y adaptarlo para que se vea así:

temporizador - = Time.deltaTime * multiplicador;

Si el multiplicador está abajo 1.0 el temporizador ahora funcionará más lento, y si está arriba 1.0 se ejecutará más rápido. Poniéndolo en 1.0 no hará nada.

Trate de experimentar para encontrar un buen valor! Siento una velocidad ligeramente menor, como 0.85f, hará que el jugador sienta más el tic tac del reloj.

Disminuir la velocidad cuando baja

Ahora que tenemos un componente multiplicador, podemos cambiarlo durante el juego.!

Ve al bloque de código que cambia de color:

si < 10f)  GetComponent() .color = Color.red;  else if (temporizador < 20f)  GetComponent() .color = Color.yellow; 

Aquí ya tenemos las condiciones en las que sería apropiado un cambio en la velocidad de marcación, así que solo podemos agregarlo!

si < 10f)  GetComponent() .color = Color.red; multiplicador = 0.6f;  else if (temporizador < 20f)  GetComponent() .color = Color.yellow; multiplicador = 0.8f;  else multiplicador = 1.0f; 

Cuando el temporizador se vuelve amarillo en 20 segundos, ahora marcará con una velocidad del 80%. Una vez que se vuelva rojo, bajará a un 60% de la velocidad normal. De lo contrario, se ajustará a 100% de velocidad..

Escala cuando baja

Otra gran manera de hacer que un temporizador se quede sin tiempo se destaque es escalarlo cada segundo que pasa cuando está bajo. Como ya tenemos un código que se activa cada segundo, podemos adaptarlo aún más!

Primero, necesitamos una función para aumentar y disminuir el tamaño de nuestra pantalla. Añade esta función:

bool privado isBlinking = false; privado IEnumerator Blink () isBlinking = true; float startScale = transform.localScale.x; transform.localScale = Vector3.one * startScale * 1.4f; rendimiento retorno nuevo WaitForSeconds (0.3f); transform.localScale = Vector3.one * startScale; isBlinking = false; 

Esto es un IEnumerador, que es un tipo de función que puede contener comandos de espera. Necesitamos el isBlinking Variable para asegurarnos de que no lo llamemos varias veces..

Una vez iniciado, escalará el tamaño del objeto por el factor de 1.4f, esperará 0.3 segundos y luego volverá a escalar al tamaño original..

Lo llamamos usando este código especial:

if (Mathf.Round (timer * 100) / 100% 1f == 0) GetComponent() .PlayOneShot (soundBlip); si < 10f)  if(!isBlinking)  StartCoroutine(Blink());   

Un IEnumerador necesita ser iniciado llamando a través de InicioCoroutine, De lo contrario, no funcionará.

Se llamará a todo el bloque cuando pase un segundo, momento en el que podemos verificar si el temporizador está lo suficientemente bajo para que parpadee.

Parpadear en cero

Hagamos algo cuando se acabe el tiempo. Tenerlo sentado a cero puede ser aburrido, así que hagamos que parpadee.

Primero, necesitaremos otro IEnumerador función:

bool privado isZeroBlinking = false; privado IEnumerator ZeroBlink () isZeroBlinking = true; GetComponent() habilitado = falso; rendimiento retorno nuevo WaitForSeconds (1.5f); GetComponent() habilitado = verdadero; rendimiento retorno nuevo WaitForSeconds (1.5f); isZeroBlinking = false; 

Esto encenderá y apagará el temporizador en 1.5-segundos intervalos. Dispárelo en el bloque que ya verifica si el temporizador es cero.

if (timer> 0f) timer - = Time.deltaTime * multiplier;  else timer = 0f; if (! isZeroBlinking) StartCoroutine (ZeroBlink ()); 

Antes de ejecutarlo, debemos deshabilitar el pitido y el parpadeo en cero, de lo contrario, se producirán colisiones..

Adapte las condiciones en el bloque para verificar si ha pasado un segundo y también para verificar si la hora actual es más que cero:

if (Mathf.Round (timer * 100) / 100% 1f == 0 && timer> 0f) GetComponent() .PlayOneShot (soundBlip); si < 10f && timer > 0f) if (! IsBlinking) StartCoroutine (Blink ()); 

Esto asegurará que el parpadeo regular y el parpadeo cero funcionen sin interferir entre sí.

La totalidad cuenta regresiva La secuencia de comandos debe tener este aspecto:

utilizando UnityEngine; utilizando System.Collections; Cuenta atrás de clase pública: MonoBehaviour float timer = 5f; multiplicador de flotación = 0.6f; AudioBip público SoundBlip; nula Actualización () if (timer> 0f) timer - = Time.deltaTime * multiplier;  else timer = 0f; if (! isZeroBlinking) StartCoroutine (ZeroBlink ());  if (temporizador < 10f)  GetComponent() .color = Color.red; multiplicador = 0.6f;  else if (temporizador < 20f)  GetComponent() .color = Color.yellow; multiplicador = 0.8f;  else multiplicador = 1.0f;  if (Mathf.Round (timer * 100) / 100% 1f == 0 && timer> 0f) GetComponent() .PlayOneShot (soundBlip); si < 10f && timer > 0f) if (! IsBlinking) StartCoroutine (Blink ());  GetComponent() .text = timer.ToString ("F2");  bool privado isBlinking = false; privado IEnumerator Blink () isBlinking = true; float startScale = transform.localScale.x; transform.localScale = Vector3.one * startScale * 1.4f; rendimiento retorno nuevo WaitForSeconds (0.3f); transform.localScale = Vector3.one * startScale; isBlinking = false;  bool privado isZeroBlinking = false; privado IEnumerator ZeroBlink () isZeroBlinking = true; GetComponent() habilitado = falso; rendimiento retorno nuevo WaitForSeconds (1.5f); GetComponent() habilitado = verdadero; rendimiento retorno nuevo WaitForSeconds (1.5f); isZeroBlinking = false;  

Esto hará el trabajo. Por supuesto, puede hacerlo más elegante y combinar los comandos en un código más eficiente..

Conclusión

Nuestra pequeña cuenta regresiva estándar se ha vuelto mucho más interesante y atractiva. Si creas esto una vez, puedes usarlo y conectarlo a cualquier proyecto que hagas, no importa lo pequeño que sea..

Ahora ve y ponlo en un juego.!