Actualmente estoy emprendiendo un proyecto bastante ambicioso. En resumen, es un juego de estrategia multijugador en tiempo real que tiene mecánica de bacterias.
Esencialmente, tengo dos jugadores remotos en el entorno, y pueden generar unidades similares a bacterias que se atacan entre sí y se multiplican, duplicándose hasta que se alcanza un límite de recursos. A menudo, esto genera más de 200 objetos de juego en la pantalla, cada uno con su propio estado y movimiento. Esto suena mal, pero la jugabilidad local contra un bot es realmente muy buena, y he logrado que sea bastante eficiente.
Sin embargo, el problema surge cuando intento conectar en red este juego. Ya he intentado seguir esta guía para implementar esta función: http://www.paladinstudios.com/2013/07/10/how-to-create-an-online-multiplayer-game-with-unity/
Esto produce una experiencia de juego bastante lenta y desagradable, incluso con la mejor latencia. Esto es probablemente causado por tener que transmitir datos de movimiento para cientos de unidades.
La pregunta que estoy planteando:
¿Cómo puedo optimizar la conexión en red y la sincronización de muchas unidades móviles entre dos clientes?
Ya he pensado en una forma de hacer esto. Después de engendrar una unidad, solo viajarán en una dirección hasta que golpeen algo, ¿tal vez pueda sincronizar solo cuando las unidades se generan y cuando interactúan con otro objeto? ¿Tendría esto mucho beneficio? ¿Cuál es la forma ideal de implementar esto?
Gracias de antemano por las respuestas!
fuente
Respuestas:
Para más de 200 objetos en movimiento, definitivamente querrás hacer que tu juego sea el paso. Con el paso cerrado, surge la necesidad de determinismo, pero eso no debería ser demasiado difícil para las bacterias (que se pueden simular con colisiones círculo-círculo).
Si no le importa mi descarado autoenchufe y quiere un ejemplo con la lógica de red y simulación de un juego de bloqueo, vea este activo de forma gratuita: https://www.assetstore.unity3d.com/en/#!/ contenido / 36206 . Desafortunadamente, esa versión no incluye todo el código fuente, pero siéntase libre de hackearlo con mi bendición;). Aquí hay un video de una prueba temprana de DPhysics: https://www.youtube.com/watch?v=NEzOghxfMdU .
La esencia del bloqueo es sincronizar la entrada en lugar de la salida. Esto se debe a que con una simulación síncrona, lo único que todos los clientes no saben son las entradas de otros clientes. El artículo que vinculó en su comentario lo explica bastante bien. No estoy seguro de cuán en profundidad desea que le explique el paso a paso, así que lo cortaré aquí y ampliaré esta respuesta si tiene más preguntas.
Actualización: piense en él como un servidor autorizado, excepto que el servidor envía información en lugar del estado del juego. Dado que cada jugador puede producir el estado del juego para sí mismo a partir de la entrada, no hay necesidad de que el servidor distribuya el estado del juego.
fuente