Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Ayuda con tema de multijugador

Iniciado por ebenknot, Enero 17, 2018, 01:01:48 PM

Tema anterior - Siguiente tema
Buenas a todos.Pues estoy realizando un juego con un compi en Unity3D usando C# para el codigo y diseños propios para los sprites y demas.Queremos q sea online,solo online.El tipo de multijugador q buscamos es exactamente el mismo que usa el Slither.io por poner un ejemplo.Entrar a pantalla principal,elegir nick,y para dentro de la partida.Me gustaria saber que herramientas usariais para esto? ya hemos probado con el Networkmanager y va perfecto pero el numero de jugadores es limitado a 20 y hay que crear la partida y una vez empieza ya no se puede unir nadie mas.No es la idea.Necesitamos exactamente la jugabilidad del Slither.io(juego del gusanito).Por donde creeis que deberia tirar?Muchisimas gracias de antemano!un saludo a todos

Primero, ¿Podrías programar Sockets?. Si es asi, entonces esto se podria hacer muy simple, pero logicamente tendria un costo mayor si pensas construir un Back-End que requiera de un VPS para funcionar.
 
Opción económica - si cuentas con un ISP que provee una IP publica dinamica podrias utilizarla para que los clientes se conecten a un Back-End instanciado en tu PC o VirtualPC, para solventar el problema de cambios de IP podrias usar servicios gratis como No-IP o de pago como DynDNS.
 
Ahora vamos a la estructura, si el juego es tan simple como slither.IO entonces te recomiendo una estructura simple - Primero deberias de pensar el modelo.
 
Server
 


  •    Clientes
       


    •          Nombre
            

    •       

    •          Posición
            

    •       

    •          Rotación
            

    •       

    •          Puntuación
            

    •    



Ahora deberias de empezar por programar un server con Socket UDP e implementar un servicio de mensajes seguros y no seguros.
 
 

Gracias por la respuesta,con la cual me doy cuenta q estoy un poco verde jejeje.La idea es pagar unity plus con lo cual te proveen de servers dedicados creo o sino pagar nosotros nuestros propios servers.He visto herramientas como Photon o el asset Nakama y creo q estan hechas para MMOs que seria nuestro caso.Basicamente el juego es como el slither.io pero dentro del juego solamente haria falta saber posicion del jugador y nivel que tiene(1,2,3,4,5) y el nombre.El lenguaje con el que desarrollamos el juego es con C# ,asi que si hay alguna manera de programar en C# lo que nos haga falta para el multijugador mejor.Porque no controlamos ni Java ni javascript.



tanto photon como el "unitynetwork" aka unet te valen de sobra. El "problema" es que son de pago como es logico, la version free aguanta 20 conexiones, si quieres mas gente te toca pagar o como dice francoe1 montarte tu un servidor.
 
Que no se conecte mas gente a la partida es cosa del framework que cierra la conexion cuando le das a "empezar", eso tambien lo hace photon, pero se puede configurar para dejarlo abierto, todo es repasarse bien el framework a usar (sea unet o photon) :)

Gracias por la respuesta.Entonces si quiero 100 jugadores tendre q pagar si o si el Unity Pro,no?el tema de nº de jugadores lo controla Unity y el tema de que el juego tire con tantos jugadores es del servidor,es asi?

Claro, mira te explico el negocio.
 
Los Cloud Server como UNET y PHOTON te cobran por CCU (Conexiones activas) y por MPT/PPT (Paquetes por tiempo), por ejemplo un FPS de 100 clientes activos sería más caro que un juego basado en turno, por la cantidad de información requerida. Si bien UNET te va a resolver multiples problemas termina siendo bastante mas cara para producir que otros framework como RackNet, eNET, Udp Seguro, o Lite UDP estos dos ultimos te dejo el proyecto son los que he utilizado para múltiples trabajos y funcionan de maravilla.
 
https://github.com/andrewzk/Reliable-UDP
https://github.com/RevenantX/LiteNetLib
 
Bien la diferencia entre armar algo con un Framework gratuito o propio es que necesitarás un servidor para funcionar, y por simple lógica este debe contar con un IPS simétrico, Igual Subida que bajada, redundancia de servicio, si se corta 1 tener 2 o 3 de respaldos, redundancia eléctrica para mantener online el servidor mas de 2 horas, con estas características nuevamente el precio se va por las nubes, entonces que opción tenemos, VPS (Servidor virtual privado), este servicio lo proveen muchisimas entidades pero el mas recomendado es Google VPS este ofrece tarifas razonables, y cobra por, Subida, Bajada de internet y el uso del procesador, las ventajas sobre esto es que logicamente es virtualizado por ende el cambio de Memoria y Procesador se pueden realizar en caliente, estos brindan un IP pública y estática por lo que se puede utilizar para cualquier servicio, una WEB, un server FTP, y logicamente el propio servidor del juego, servidor REST y bundle... etc.
 
¿Cual es la ventaja más diferenciada en esta arquitectura?
 
El uso DDBB a antojo, una arquitectura Cliente/Servidor nativa, arquitectura del medio escalable, seguridad a más bajo nivel, tratado de la información con más detalle, precios relativamente más bajos que un Cloud Server -
 
¿Desventajas?
 
El doble o triple de trabajo, debug mas tediosos, nula documentación sobre lo requerido.

Muchisimas gracias por toda la info,estoy aprendiendo lo mas grande para mi proyecto.Entonces el camino a seguir puede ser el de VPS por ejemplo el de google.o he visto q 1&1 tambien podria ser una opcion.Seguire investigando.En serio,muchas gracias.un saludo!

Enero 20, 2018, 12:16:07 AM #9 Ultima modificación: Enero 20, 2018, 12:16:18 AM por ebenknot
Buenas,sigo en el lio.Usando Unet me funciona pero solo en Lan,estoy haciendo host en mi pc y cuando lo intento probar en la red(via internet) no funciona.Tengo unas preguntas: ¿cual es la diferencia entre ejecutar el server en el play de la interfaz de unity y los clientes como archivos ejecutables que se conectan por Lan al server, y  un sistema real online?¿si funciona haciendo la prueba en Lan,deberia tambien funcionar en un sistema online?¿o hay que añadir mas cosas? por internet veo que todo el mundo lo hace asi.un saludo y gracias de antemano.
 
 

Mira, la diferencia entre una red LAN y WAN es amplia, pero en simples aspectos no tanto.
 
Primero, si intentas tener acceso a tu PC desde WAN osea desde otra PC que esta fuera de tu red LAN deberás contar con una IP pública,
 
¿Que es una IP pública?

Una IP es accesible desde cualquier punto del planeta, es nuestra puerta al mundo del internet, pero no lo veamos asi, tratemos de entender mas a fondo como funciona, primero tenemos que entender el modelo OSI para esto dejo un link a Wikipedia con una explicación perfecta Información.
 
Bien dado por entendido cómo se conectan los dispositivos y se transporta la información veamos los escenarios posibles y sus configuraciones.
 
Primero, un equipo de PC con un ISP que provee una IP publica (Dinamica/Estatica) -

El ISP llega a nuestra casa mediante un cable, el cual puede tener 2 configuraciones diferentes ADSL o Point To Point (PTP), ¿cuales son las diferencias?, si llega un conexión ADSL por lo general la administración de router queda en nuestras manos, de lo contrario, la administración queda en mano del servicio de ISP, la razón es simple, dentro de la antena PTP están las configuraciones de la empresa para establecer la conexión con la antena receptora y validar datos de usuarios, modelos, version, mac, ip. ETC.
 
¿Cual es el problema cuando tenemos un PTP? no poder configurar los puertos -
 
¿Como una PC se puede comunicar con otra a través de la RED? 

Solo voy a comentar sobre la capa de transporte IP, para enviar información de un dispositivo a otro debemos especificar su dirección IP y un puerto, supongamos que tenemos que entregar una carta en un Edificio, necesitamos saber la dirección de dicho edificio y el número de puerta, entendiendo podemos solucionar problemas a mas alto nivel, por ejemplo, si quieres que tus clientes puedan conectarse a tu aplicación primero deberias verificar si existe un conexión física entre ambos dispositivos, esto puede ser red LAN, Internet, etc, luego tienes que saber cual es el puerto en el que tu servidor está esperando conexiones o datagramas, una vez revelada esta información tendrias que verificar que el servidor se está ejecutando sobre la interfaz de red deseada, no es lo mismo home.z3nth10n.net:8080 | ::8080 | 192.168.1.100:8080, la primer opción solo seria valida dentro del mismo equipo el valor home.z3nth10n.net hace referencia al lookup (esto es genérico, pero puede ser alterado), la segunda opción sirve para que el puerto de escucha no esté atado a una interfaz si no que no importa porque interfaz reciba información la aplicación la podrá interpretar, por otro lado la tercer IP es un ejemplo de como comúnmente se vería un servicio corriendo por la interfaz de un equipo normal.
 
IP privada vs IP pública

Cuando nuestro equipo o servidor se encuentra detrás de un servidor DHCP (Parte de los servicios de un router) este brinda un IP diferente a la del router y se establece un ámbito de trabajo nuevo, lo que se denomina un rango nuevo, para nosotros hacer uso del internet el router nos provee una Puerta de acceso, esto sirve para decirle a la interfaz del dispositivo que toda la información saliente esta dirigida a esa dirección.
 
Entonces, un servidor DHCP nor provee una configuración que esta compuesta por la IP que va a utilizar el dispositivo + la IP de router y algunos valores extras que no tienen importancia en este punto.
 
De esta manera nosotros logramos tener salida al internet, pero estamos bloqueando la entrada del internet, nadie puede acceder a mi equipo si yo no le indico al router donde estoy, quien soy. ¿Como se hace esto? Redireccionamiento de puertos.
 
¿Redireccionamiento de puertos?

Si, cada dispositivo tiene un rango de puertos del 0 al 65535, esto quiere decir que detras de cada uno de esos puertos nosotros podriamos tener diferentes servicios corrientes, HTTP, FTP, SQLServer, GameServer, etc...

Pero estos servicios logicamente no pueden estar en el router, requieren de un equipo con los requerimientos necesarios para server utilizados, entonces vayamos a un ejemplo practico.
 
Supongamos que queremos jugar un CS 1.6, Tú vives en Brasil y yo en Argentina, yo entro a www.cualesmiip.com para saber que IP me estra siviendo mi ISP y te pido que realices un PING a dicha dirección, bien, tu entras a la consola de Windows y escribes el clásico comando.
 
ping 66.44.125.12
 
Ves que el resultado del PING es bueno, ¿Pero como se yo si es realmente una IP pública y que estás haciendo PING a mi router?, tengo dos opciones, la opcion animal, desconectar el router, si el PING deja de resolver entonces se trataba de mi router, otra opción es buscar la opcion dentro del router que evita que se le realice PING y volvemos a lo enunciado anteriormente, bueno, ahora sabemos que yo cuento con una IP pública y que de alguna manera extraña existe una relación fisica entre nuestros equipos.
 
Creo el server CS 1.6 y cuando voy a compartir la información del server me aparece 192.168.1.100:23500, claro esa IP es la que el router le brindo a mi equipo, lógicamente vos no tendrias conexión con la misma, pero yo puedo realizar un enlace mediando Redireccionamiento de puertos, decirte que mi IP pública más el puerto 23500 (O el que se configure) hace referencia al server de CS -
 
Para realizar esta configuración se debe entrar a las configuraciones del router, a la sección de Redireccionamiento de puertos, Port Forwarding o Trigger Port y configurar lo siguiente -
 
en el campo destino la IP del equipo que esta corriendo el servidor : 192.168.1.100

en el campo Wan Port el puerto que es capturado desde el internet

en el campo Lan Port el puerto que al que se va a enviar la información en este ejemplo 23500
 
También podemos realizar las misma configuraciones con rango de puertos, por ejemplo, 23500 al 23600 y todos esos puertos podrian referenciar a un solo puerto de la LAN.
 
 
 
Espero sea de ayuda, trate de explicarlo lo mas humanamente posible, si no entiendes algo pregunta no tengo problemas en responder.

Faa @francoe1 te pasaste!
 
Cita de: francoe1 date=1516412090Supongamos que queremos jugar un CS 1.6 ...
   


Ah! menos mal, si nombrabas alguna versión posterior no te daba flechita

Pues me toca leer lo que me has puesto jejeje.muchas gracias por la ayuda.Mi colega y yo sabemos hacer juegos.Pero es la primera vez q nos ponemos con uno multijugador online.Gracias de nuevo.un saludo!

Necesitaria ayuda con una cosa que puede ser simple pero me esta costando algo de trabajo conseguirlo. Trabajando con el NetworkManager de Unet Tengo Creada una partida en la cual hay alojado un Client como server y un Client como player creados por defecto por Unet.¿Como sería el código necesario en C# para saber en la ejecucion del segundo cliente y posteriores clientes, si hay una partida creada con un serverclient en ella? ;Muchas gracias por toda la ayuda :)

Cita de: ebenknot date=1516571334Necesitaria ayuda con una cosa que puede ser simple pero me esta costando algo de trabajo conseguirlo. Trabajando con el NetworkManager de Unet Tengo Creada una partida en la cual hay alojado un Client como server y un Client como player creados por defecto por Unet.¿Como sería el código necesario en C# para saber en la ejecucion del segundo cliente y posteriores clientes, si hay una partida creada con un serverclient en ella? ;Muchas gracias por toda la ayuda :)
   


Estas teniendo problemas de concepto, se me ocurre que estas intentando hacer un matchmaking pero te estas equivocando -
 
Dime que intentas hacer y te ayudo.

Etiquetas: