¿Cómo puedo mantener sincronizados a dos jugadores de carreras?

8

Estoy trabajando en un juego móvil de Unity, al igual que una versión multijugador de Temple Run . Veo una latencia de red fluctuante (generalmente 200-500 ms) debido a la plataforma móvil.

Los dos personajes jugadores se muestran corriendo por el mismo camino y deben realizar acciones simples (saltar, deslizarse, encendido, etc.) para pasar obstáculos.

Cuando un mensaje llega tarde, el juego asume que el jugador remoto pasó un obstáculo. Esto generalmente funciona bien, pero en caso de que un jugador muera por un obstáculo, quiero que el jugador remoto parezca morir en el mismo obstáculo / posición que el jugador local. Debido a la latencia, el jugador remoto parece haber cruzado el obstáculo antes de que llegue el mensaje que anuncia su muerte.

¿Cómo puedo mantener los jugadores sincronizados?


Intenté mover el reproductor remoto de nuevo a la posición de muerte de los jugadores locales inmediatamente cuando llega el mensaje de muerte, se ve incómodo visualmente y podría generar otros problemas de sincronización.

Zohaib Javed
fuente

Respuestas:

10

Análisis del problema

La comunicación en tiempo real a través de una conexión de alta latencia es obviamente imposible.

Usted puede intentar, por supuesto, una ilusión (como lo está haciendo, haciendo que el jugador remoto parece haber superado un obstáculo cuando todavía no se sabe). Cuando esa ilusión falla (como la tuya cuando el jugador remoto no pasó el obstáculo, sino que murió ), ya no se puede hacer nada.

el problema

En un caso (como aquí) donde el fracaso de la ilusión se ve muy mal , podría ser más fácil aceptar los hechos y hacer todo lo posible para representar la situación tal como es en realidad.

Solucion potencial

¿Qué tal si literalmente ralentizamos al otro jugador si su decisión toma tiempo para propagarse?

una solución

Cada jugador ve una imagen del otro, pero esa imagen se ralentiza cuando se acerca a obstáculos para los cuales el mensaje de decisión aún está en el aire. Solo una vez que se recibe el mensaje, parecen pasar o fallar el obstáculo. Después del obstáculo, la imagen se acelera nuevamente para alcanzarla, disminuyendo la velocidad nuevamente para la siguiente, si es necesario.

En una conexión de baja latencia, la decisión llega pronto y la desaceleración y la aceleración serán insignificantes. En una conexión de alta latencia, esto hará que el otro jugador parezca estar rezagado, pero asegura que el estado del juego más importante de "quién ha superado este obstáculo" es consistente para ambos jugadores.

Anko
fuente
Gracias por su respuesta. Ya hemos probado la posible solución que ha propuesto, pero no la encontramos factible debido a las siguientes razones: 1. La primera razón es la alta velocidad de mi juego. Para cubrir una ventana de 200 ms, tendría que reducir la velocidad del reproductor remoto a 1/4 de velocidad, lo que causa una anomalía visual muy desagradable y visible, especialmente en el caso en que el jugador corría de lado a lado. 2. Dado que la latencia fluctúa, es realmente difícil calcular la reducción de velocidad para el reproductor remoto, lo que garantizaría que el mensaje llegue antes de que cruce el obstáculo.
Zohaib Javed
2
@ZahaibJaved A menudo, la única solución real es ocultar la latencia a través de animaciones. En lugar de reducir la velocidad a medida que se acercan al obstáculo, considere detenerse por completo en el borde y realizar una animación de "preparación para saltar" que toma un segundo completo para jugar. Una vez que llega el paquete "lo lograron", realiza el salto real y salta hacia adelante a su posición real.
BlueRaja - Danny Pflughoeft
Lo siento por la respuesta tardía. Entonces, la solución que implementé en la escena de inicio se juega donde se pueden ver todos los jugadores. El jugador local siempre está en primera posición. Después de que la escena finalice. Solo muevo todo el reproductor remoto lo suficiente para que puedan tener tiempo para recibir la información de que el jugador local murió en un obstáculo específico o se deslizó o saltó correctamente en el camino. Y al final hay un camino recto donde solo sincronizo jugadores nuevamente. Entonces ese resultado se muestra correctamente.
Zohaib Javed
4

Para complementar la respuesta de Anko, puede cambiar un poco el diseño de su juego agregando la consecuencia del obstáculo fallido después de la falla, por ejemplo, un salto fallido resulta en aterrizar en un charco de lodo que descalifica al jugador. De esta manera, el otro jugador nota el fracaso al ver al otro caer en el barro, mientras que el jugador que falla lo ve de inmediato.

Aquí hay una buena publicación de blog sobre este tema (no es tan reciente pero es bastante interesante): Gestión y sincronización del tiempo de Darrin West .

Vaillancourt
fuente
1

¿Es tan importante para el jugador local saber la posición exacta de la muerte del jugador remoto? Digamos que el jugador remoto no pudo saltar uno de tus obstáculos, y por lo tanto murió.

El jugador muerto vería su muerte de inmediato y continuaría desde el lugar del accidente. Nada mágico aquí.

El jugador local (el que sigue vivo y pateando) vería al jugador remoto pasar el obstáculo con éxito. Llegaría una notificación de muerte. El jugador remoto tropezaría con sus pies, se caería y se desvanecería lentamente. La próxima vez que conozca la posición del jugador remoto, el jugador se desvanecería en esa posición exacta, corriendo normalmente de nuevo. En tal configuración, los jugadores serían conscientes de la latencia, pero la latencia se representaría como un elemento del juego (tropezar) en lugar de aparecer y desaparecer de forma brusca.

Si la velocidad de los dos jugadores es constante, la trayectoria de carrera está predefinida y se conoce el tiempo que lleva recuperarse de una caída, puede eliminar por completo la parte de desvanecimiento / desaparición. Imagina a un jugador remoto muriendo en uno de los obstáculos. Su representación local todavía se está ejecutando cuando llega una notificación. Se muestra al jugador tropezando de inmediato. Les lleva tiempo levantarse y comenzar a correr nuevamente. En realidad, lleva tanto tiempo como si se vieran muriendo en el obstáculo. Por lo tanto, cuando están en funcionamiento nuevamente, se sincronizan las posiciones locales y remotas.


fuente