Jump to content
UnitySpain

Search the Community

Showing results for tags 'networking'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Inicio
    • Proyectos
    • Offtopic
    • Unity Feeds
    • Website
  • Mesa de ayuda
    • Unity
    • Arte
    • Otras Especialidades
    • Builds & Dispositivos
  • Aportes de la Comunidad
    • Recursos
    • Eventos
    • Buenas Prácticas
  • Bolsa de trabajo & Colaboraciones
    • Ofertas y Demandas
  • Post Antiguos
    • General (Antiguo)

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Especialidad

Found 13 results

  1. Buenos dias Me encuentro desarrollando un juego multiplayer en red, done interctuan carros pesados como trucks, camionetas grantes etc. Realizando tareas, Mi duda es la siguiente 1.- ¿Como hago para que cuando el jugador 1 termine una tarea por ejemplo Mover un objeto a la tolva del jugador 2, este reciba el mensaje de "Tarea realizada" y recien a este pueda empezar su tarea, asimismo si el jugador 2 termina su tarea el jugador 1 se habilita una nueva tarea? Asumo que tengo que establecer una variable, una comunicacion entre ambos jugador en red, Ayuda porfavor
  2. Hola a todos, acabo de subir el primer video de una serie de tutoriales que tengo pensado hacer en relación a como crear tu propio sistema de red multijugador enfocado a los MMORPG, espero que les interese y les agradecería que me dijeran si les gusta algo o le falta algo, cosas por el estilo con el fin de mejorar los próximos vídeos, Saludos. https://youtu.be/bldXaEUov_w
  3. Saludos a todos. Me gustaría hacer oficial la propuesta de tener a nuestra disposición una serie de locales y recursos, para que los usuarios de la Comunidad puedan reunirse en grupo y trabajar bien, ya sea colaborando en algún proyecto común, o por el puro placer de hacer cada uno su juego, pero con la ventaja de tener al lado a compañeros. La idea, en cualquier caso, es acostumbrarse a no trabajar desde casa y favorecer un ritmo de trabajo adecuado. No podemos permitirnos mantener estos locales por cuenta propia, pero sí que podemos hacer un listado de sitios públicos que ya existan actualmente, como bibliotecas, etc., y establecer una especie de horarios y fechas comunes durante las cuales estamos disponibles. Comienzo el hilo aportando el Cybernarium: Sitio: Mesas públicas Cybernarium Dirección: Carrer de Roc Boronat, 117, 08018 Barcelona Capacidad: 8-10 personas. Notas: Hay mesas disponibles en la entrada y en el pasillo de la planta 1 (algunas sin enchufes). También hay mesas disponibles en la Planta 2, mientras no hayan presentaciones. Horario propuesto para UnitySpain: Viernes 10h-18h
  4. Buenas a todos, os comento: Soy programador nivel intermedio avanzado y con escaso conocimiento de redes, me he leído la documentación de unity y hay cosas que creo que no he llegado a comprender del todo bien. Estoy utilizando el código de unity para montarme un juego multijugador en el que un jugador hace de host y he seguido un par de tutos y como ya he comentado con la información de la pagina. Problema: A la hora de disparar y moverse el cliente no spawnea la bala en la posición correcta sino unos centímetros a la derecha o izquierda depende en que sentido se mueva. Esto en el que hace de host no pasa como es de esperar. Estoy utilizando una funcion con command y le paso como parámetros posición velocidad y rotación de la bala la spawneo y la envió con networkServer.spawn a todos. Como ya he comentado esto hace que el cliente reciba la bala tarde si se esta moviendo, puedo llegar a entender que al serializar los datos y enviarlos por red haya cierto delay, pero si lo estoy probando en mi ordenador debería de ser cero y no lo es ademas de que unos centímetros tienen demasiada repercusión en la jugabilidad. He cambiado de canal el script del disparo (disparo y andar no están en el mismo script aunque no creo que importe) y sigue estando el problema, tambien he hecho un monton de pruebas sin exito. Alguno sabe si hay alguna forma de reducir eso? como se hace en la realidad? Estaría muy agradecido con cualquier ayuda. Adjunto el código, es código de testeo, nada depurado: using UnityEngine; using UnityEngine.Networking; //[NetworkSettings(channel = 1)] public class Disparo : NetworkBehaviour { //Animaciones public bool SacarGuardar; //Disparo public Rigidbody Bala; public Transform SpawnBala; public int VelocidadBala; //Velocidad movimiento jugador public Rigidbody m_Rigidbody; // Use this for initialization void Start () { m_Rigidbody = GetComponent<Rigidbody>(); } // Update is called once per frame [ClientCallback] void Update () { if (!isLocalPlayer) { return; } SacarGuardar = Input.GetButton("Fire2") ? true : SacarGuardar; if (SacarGuardar == true) if (Input.GetButtonDown("Fire1")) { CmdSpawnBalaNew(m_Rigidbody.velocity, VelocidadBala, SpawnBala.forward, SpawnBala.position, SpawnBala.rotation); } } [Command] void CmdSpawnBalaNew(Vector3 rigidbodyVelocity,float velocidadb, Vector3 forward, Vector3 position, Quaternion rotation) { Rigidbody bullet = Instantiate(Bala, position, rotation) as Rigidbody; Vector3 velocity = rigidbodyVelocity + velocidadb * forward; bullet.velocity = velocity; NetworkServer.Spawn(bullet.gameObject); //(bullet.gameObject, 4.0f); } }
  5. Bienvenidos a la segunda parte del "Tutorial de UNET en español" Hoy vamos a tratar de entender cómo funcionan los comandos y sync var de una manera más detallada y luego vamos a programar un sistema de puntuación que nos permita gestionar KILLS - DEATHS - SCORE - NAME ¿Cómo funcionan los Command? Los comandos son funciones que se encuentran del lado cliente pero se ejecutan del lado servidor, es decir, cuando nosotros llamamos un comando desde cualquier cliente no se ejecuta en dicho cliente, si no en el Servidor. ¿Y esto para que sirve?, Bien, esto nos sirve para dejar que el servidor se encargue de todos los datos del juego aplique las reglas y sincronice estos datos con los demás Jugadores, Ver el Ejemplo de Sincronización de Movimiento. ¿Qué son las SyncVar? Con las SyncVar podemos sincronizar variables de datos Simples, Como INT - STRING - FLOAT y otros característicos de unity como VECTOR3, aunque estas siempre deben ser actualizadas por el servidor, ya que el cliente no tiene el privilegio de hacerlo. Entonces ¿Cómo se fusionan las dos? Primero, deberíamos pensar la lógica de forma local, es decir, sin ponernos a pensar en Sincronización u otros aspectos Multijugador, supongamos que estamos pensando hacer un FPS SIMPLE, entonces empezamos creando el Movimiento del Jugador, Move, Jump, Rotate, RotateCamera estas serían nuestras funciones para controlar todo el movimiento del personaje. Una vez ya programado esta parte, debemos Sincronizar la Posicion y Rotacion del Jugador, más la Cámara (VER PARTE 1). Esto fue una breve y simple explicacion de como funciona, pero voy a resumirlo en simples pasos explicativos para que sea más fácil entender. 1- Realizamos la Acción Localmente 2- Enviamos los Resultados por Cmd al Servidor 3- El Servidor asigna los datos recibidos en su correspondiente variable. 4- Los Cliente no locales sincroniza cada instancia con los valores sincronizados. Bueno, ya teniendo en cuenta todo lo anterior pasemos a construir nuestro sistema de Puntuación. 1- Vamos a necesitar 4 Variables 4 Funciones y 4 Comandos. [SyncVar] public string Name; [SyncVar] public int Kills; [SyncVar] public int Deaths; [SyncVar] public int Score; public void SetName(string value) { Name = value; Cmd_SetName(value); } public void AddKill() { Kills++; Cmd_AddKill(Kills); } public void AddDeath() { Deaths++; Cmd_AddDeath(Deaths); } public void AddScore(int value) { Score += value; Cmd_AddKill(Score); } [Command] private void Cmd_SetName(string value) { if(!isServer)return; Name = value; } [Command] private void Cmd_AddKill(int value) { if(!isServer)return; Kills = value; } [Command] private void Cmd_AddDeath(int value) { if(!isServer)return; Deaths = value; } [Command] private void Cmd_AddScore(int value) { if(!isServer)return; Score = value; }Con esto ya tenemos nuestro sistema de puntuación funcionando, ahora debemos gestionarlo, vamos a crear una función OnGUI para visualizar los datos de todos lo Clientes conectados. void OnGUI() { foreach(PlayerInfo current in GameObject.FindObjectsOfType<PlayerInfo>()) { if(current == this)GUI.color = Color.red; GUILayout.Box(current.Name + " D [" + current.Deaths + "] K [" + current.Kills + "] S [ " + current.Score + "]" ); } }Bien, ahora podemos hacer nuestro test utilizando Inputs y la función Update void Update() { if(!isLocalPlayer)return; // Si no es el jugador Local Sale de la funcion UPDATE if(Input.GetMouseButtonDown(0))AddScore(100); if(Input.GetMouseButtonDown(1))AddKill(); if(Input.GetMouseButtonDown(2))AddDeath(); }FIN DE LA SEGUNDA PARTE Siguientes Sistema de Puntuaje + UNET + Simple UI Sistema de Salud + UNET + Simple UI Explicación más detalladas de Command Sistema de Disparos + UNET + Simple UI VIDEO TUTORIAL de todo lo explicado ¡SALUDOS A TODOS y SUERTE!
  6. He estado mirando las opciones para juegos en red y he elegido Forge Networking como herramienta para desarrollar mis juegos. Estoy interesado en ponerme en contacto con alguien que lo conozca para compartir dudas. Os dejo un link donde explican las diferentes soluciones para programar en multiplayer, me parece muy interesante. http://forum.unity3d.com/threads/multiplayer-networking-solutions-review-photon-ulink-darkrift-forge-and-playfab.294852/ Dejo la explicación abajo por si deja de funcionar el link: Hello community! I'm a hobbiest game developer who has a passion for competitive multiplayer games. For a high school project, I'm making a multiplayer lockstep BRTS game that loosely follows the networking framework of Age of Empires and Starcraft 2. In order to reduce bandwidth demand on players, all commands and confirmations will be facilitated by a server which is why I've looked into a host of networking solutions. This is somewhat of a chronicle of my journey through developing the multiplayer part of my game and the things I've learned on the way about the various tools I've used. I hope this helps other people in their quest to make their games. Without further ado...Photon Cloud: Photon is the most popular networking solution on the asset store for good reason. It's super accessible and provides an out-of-the-box multiplayer game that's incredibly easy to set up. Further into development, however, I found many pitfalls in Photon Cloud. During the holiday sale for Photon+, I became overeager and bought it to find out that it unfortunately wouldn't work for my game.Firstly, it's the large overhead. Photon's binary protocol is very inefficient compared to that of networking solutions like DarkRift. Of course, this provides developers easy reliable RPC's but at the cost of lag and high bandwidth.In addition, Photon Cloud servers don't allow custom server logic. This makes it impractical for many games. For my game, this means I can't have a server that processes commands and confirmations. The server would be 'dumb' and relay every single command and confirmation very inefficiently. This is made worse by the high overhead so much so that my game ((12 players, 2 commands + 2 confirmations)/second) would be impossible for anything but the fastest of connections. There are other problems with Photon Cloud explained here.The only way to run custom logic is to modify the server sdk and host the servers yourself so I proceeded to do that. Implementing what I needed turned out to be a very difficult task as the documentation wasn't very clear. For a while, I wasn't sure which script to edit or how to call my custom operations but eventually found out through the great support of its community. There's also the pricing issue. Developers have to pay $3500 to have over 500CCU which many successful games need.Photon does have merits though. Creating and joining rooms is as using a single built-in function. There's in-built load balancing on the Cloud for efficiency of room instances. Photon is extremely easy to set up and the team is very helpful to you for your first stages of development. Photon turned me from a person clueless about networking into someone who knows how to set up a decent multiplayer game. It's what I can call my gateway to networking, and I recommend it for anyone wanting to prototype or learn how to make a multiplayer game.uLink: I've only worked with the trial version of uLink that doesn't include the game managers uLobby and uZone. I can say first off that uLink isn't hobbiest friendly at all, costing upwards $600 for all the essential features. I wasn't able to test the server distribution system at all so all I got to do was play with the example locally.The main thing going for uLink is that it runs in Unity instances. This means you can have servers that simulate physics, player interactions, and everything about a game. Cheating can be 100% done away with. This is especially necessary for large scale games that have to provide players with fair play.uLink has been tried and proven by games such as Transformers Universe and Shadowgun: Deadzone but I'm hesitant to extrapolate the same potential success and appropriateness to my projects because these were created by large companies with specialists. There's no telling how much of the out-of-the-box functions of uLink apply to them.For my game, uLink won't work or rather would be inefficient because my game only requires the server to process commands and confirmations in pure .net logic - no simulation required.Update: uLink now has a trial version! I haven't gotten to using it since I've stuck to DarkRift but don't let my review stop you from testing it out for yourself.Forge: uLink definitely fills a niche in Unity networking by allowing for authoritative servers but there's a rising star that might be competing for the same niche.Forge is a very new networking solution currently in its Beta stages. There's a lot of community support for this because of the potential in it. Like uLink, it runs in Unity instances and so can simulate physics, players, etc. and prevent cheating. I've tested it and it works like a charm. It's multithreaded so is very performance friendly - expect to be able to host many instances on a single computer, all managed by an aptly named extension called The Arbiter.The primary developer has hinted at database integration which means accounts, player stats, and more for all! In addition, future plans also seek to take authoritative servers a step further by providing a cloud to run Forge on.Recent developments have created a bare metal server that can be run just as efficiently as Photon or any other .net based server solution.Update: Upon further exploration, I found that Forge is, like DarkRift, is event driven. In addition, there are many built-in pieces of functionality that come out of the box. Easy to use, efficient, and limitless! A bare metal version is also going to be released soon that gets rid of the overhead of Unity instances for those games that don't need physics or simulation. Forge is one of the most ambitious and complete networking solution. I can't even imagine how complete it will by its final release. It turns out Forge is the right one for me.DarkRift: To me, DarkRift is like Victoria in How I Met Your Mother. She is almost 'The One', so close that it's tragic she isn't. DarkRift is incredibly fast, creating only 13 bytes of overhead in an operation and writing custom server logic for it is as easy as coding my game client side. It's built in C# and has a very intuitive API for both server and client. I could see from the start that this networking solution was built for making plugins. Unfortunately, because of the extreme flexibility, this solution doesn't come out-of-the-box with many features other networking solutions have like RPC's or rooms. This is why it was nearly perfect for me, because the RPC's and room system could be built from the ground up to accommodate my game.Writing server plugins might seem like a daunting task compared to plugging in an IP address or a Cloud validation number and clicking run but it's incredibly easy. I was able to get a room and matchmaking system that was completely built on top of my lockstep system up in an hour. Plus, the plugins are made to be shared (I can send anyone my lockstep plugin for DarkRift if they need it).Not only is DarkRift exceptionally fast in bandwidth, it's also fast in performance. It's super efficient and uses only between 0.0% and 0.1% of my CPU when idle and scales very well so if you need a fast, flexible, and lightweight server solution, DarkRift is the way to goThe only problem is that DarkRift isn't very big. It's made by a one man team and so doesn't have access to some extraneous features like an integrated Cloud or a prosperous community. Regardless, the documentation is very clear and got me coding my own plugins within 20 minutes of opening the 'Getting Started' PDF. The author has been extremely responsive to my requests for features and information. This is an asset that deserves to have just as much community support as the top in the store and it's a shame that it doesn't.This is an asset that will give your game the fastest possible multiplayer and lightest weight servers. Hopefully in the future, a dedicated community will flock around DarkRift and a variety of open source plugins will crop up. It's gotten this far with 1 person - how far can it get with a community?Conclusion: There are many other networking solutions out there that aren't listed but are still valid. There are also many types of games that need different back-ends. Small-scale MMORPG's could make use of Photon's dedicated servers and sufficient operations. FPS's could use Forge or uLink for authoritative servers simulating events and actions for a cheat-free environment. Games like mine, ones that require specialized data processing, should definitely go for the more flexible and lightweight ones like DarkRift and Forge.DarkRift and Forge are neck to neck in flexibility, performance, and ease of use but DarkRift is the winner in bandwidth efficiency. Forge will provide you with more out-of-le-box features so if you're new to networking, I would recommend trying out the Beta. If you've got an arsenel of c# skills, give DarkRift a shot and you might fall in love with it as I did!
  7. Hola a todos! Hacía 3 años que no pasaba por aquí, dejé Unity de lado y, cuando volví a ponerme, no recordaba esta comunidad Las dudas que tenía las estuve preguntando en los foros de Unity oficiales, pero parece que mi consulta es muy n00b para que sea respondida. La verdad es que no me manejo mal con el inglés, tengo experiencia en programación alta (trabajé de desarrollador web 4 años) y llevo 3 meses en paro, tiempo dedicado a Unity. Aquí va la consulta: He leído que hay muchas maneras de realizar un multiplayer y, según lo que vaya a necesitar tu juego/aplicación, una de las tecnologías será mejor que otra, o más enfocada a tu proyecto. Os traduzco la consulta y os la dejo por aquí, a ver si me pudieseis recomendar. Mil gracias! "He estado buscando documentación sobre el desarrollo de un juego multiplayer en Unity, pero me he dado cuanta de que hay varias tecnologías además del Networking nativo de Unity.:He leído sobre: Photon using Photon's serversPhoton using your own server.Unity networkingUnity Cache ServerTu propio servidor de DBMi juego tendrá: Player DataBase (De esto, controlo los lenguajes SQL, MYSQL y PHP)Una Escena con todos los jugadores conectados (como un mmorpg open world)Pequeñas habitaciones (otras escenas) donde los jugadores podrán entrarMis lenguages de programación son los nativos de Unity (C# y Javascript) y otros como C++, PHP; SQL, MYSQL, y varias librerías derivadas de estos lenguages. Mi ingés no es muy bueno y toda la documentación está en este idioma, pero no está explicado en un inglés para tontos.Podríais recomendarme qué tecnología de networking sería la óptima para realizar este tipo de juego?Gracias! "
  8. Hola, Estoy seguro que es una chorrada pero no consigo que funcione: Tengo dos pantallas, una está en servidor y una en cliente, el objeto que crea el Network Manager es la cámara. Tengo un objeto (por ejemplo, un cubo) que quiero mover entre las pantallas. Si ejecuto la acción de mover desde el Host se mueve en las dos pantallas, va y vuelve sin problemas, pero si intento ejecutar la acción desde la pantalla del cliente, el objeto se mueve pero no se pueden ver sus movimientos en la pantalla de Host. Llevo probando infinidad de cosas cada una más rocambolesca y estoy seguro que alguna cosilla muuuuuuy simple me estoy olvidando. No consigo que el objeto se pueda mover entre todos las pantallas sin importar el que lo controle. El objeto tiene un network transform. Si alguien sabe cómo ayudarme se lo agradeceré muchísimo. Saludos!
  9. Bienvenidos a otro tutorial de UNET. Como vimos en anteriores tutoriales, para poder sincronizar una variable en nuestro jugador locas debemos primero asignarla y luego enviar ese valor al servidor. EJ : (P-Local) Cambió su posicion --(Envia a traves de comando su nueva posicion al servidor)--> (SERVER) El servidor recibe estos datos y los envía a todos los Clientes. Teniendo esto en cuenta, para lograr un Sistema de Salud funcional debemos primero tener el valor de la salud actual, un evento que se llame cuando muere, 2 funciones una de daño y la otra de recuperación, y por ultimo el comando para enviar el estado de nuestra salud. Vemos... Primero creamos lo básico. public const int MaxHealt = 100; [SyncVar] public int Healt; public delegate void d_Death(); [SyncEvent] public event d_Death EventDeath; [Client] public void TakeDamage(int value) { Healt -= value; Healt = Mathf.Clamp(Healt,0,MaxHealt); } [Client] public void TakeCure(int value) { Healt += value; Healt = Mathf.Clamp(Healt,0,MaxHealt); }bien con esto ya tendríamos nuestro Sistema de salud casi terminado, pero debemos tener algunas cosas en cuenta. Jamás un jugador va a poder infringir directamente daño a otro, de esto se encarga el servidor, pero existe una problemática, cuando nosotros ejecutamos un disparo, este evento es gestionado por el servidor, entonces es el Servidor en nombre de X Cliente dueño del disparo, supongamos que este impacta con otro jugador, ¿Quien resta la salud?, La respuesta es el Servidor. Es decir, si nosotros llamamos una funciona cualquiera desde un comando estamos haciéndolo en nombre del servidor. (CLIENTE) ---> Ejecuta ---> COMMAND ---> (SERVIDOR) ---> Ejecuta Funcion ---> TakeDamage(); Dicho lo anterior, podremos darnos cuanta de que no existe interacción Cliente/Cliente por lo que esto se denomina Cliente/Servidor. ¿Cual es realmente la problemática?, Aunque existan varios problemas relacionados solo con un sistema de salud, deberíamos destacar el mas importante. El Jugador local solo debe enviar su estado, no hay que confundir, es decir, el servidor no se debe de encargar de procesar si está muerto o no, para eso creamos nuestro sistema. Vi muchos errores a la hora de implementar funciones incoherentes, por ejemplo, que todos los jugadores comprueben si la salud es menor o igual a cero entonces esta muerto. void Update() { if(Healt <= 0) { IsDeath = true; } }Esto es un grave error, porque los tiempos de sincronización pueden variar según el Ping (Tiempo de Envío y Recibo de Datos) que el Cliente y servidor tengan. vamos a dar un Ejemplo: Tenemos 4 Clientes en un servidor, Cliente 1 dispara y le quita 100 de salud al Cliente 2 Esta acción tomó un tiempo de. 1- Cliente 1 (Enviar Datos del disparo al Servidor y Retornar Resultados) : 2s 2- Cliente 2 (Recibe la noticia de que se le a impactado, el servidor llama a su función TakeDamage(), luego, el Cliente 2 envía los dato de su estado al Servidor) : 4s 3- Clientes (Servidor Actualiza el Estado del Cliente 1 en todas las instancias del juego, diciendo que el valor de Healt es cero) 1s Vemos que en el Punto 1 el Cliente 1 ya sabe que le infligió daño al Cliente 2, pero aun el Cliente 2 no se enteró, suponiendo que el primer paso Duro solo 1s, ya que el segundo añadido es el tiempo que el Servidor tardó en enviar esa información al Cliente 1, el Cliente 2, por lo tanto recibe daño, y envía el valor de Healt al servidor, 4s + 1s que el servidor toma para enviar los datos de este evento al Cliente 3, 4 es el retardo que existiría, suponiendo así, que cada instancia debería comprobar aún si el Cliente 2 está vivo, pero qué pasa si en ese lapso de 4 segundo el Cliente 2 sobrevive, es decir, un ejemplo, lo reviven estilo BF, el Cliente 1,3,4 tendrían una mala información. en destiempo. Aunque el ejemplo en cierta forma parece no tener coherencia el problema se presenta cuando múltiples clientes con distintos tiempos de respuestas se conectan al servidor, este error puede llegar a hacernos ver el jugador muerto disparando. ¿Cómo lo solucionamos? La solución en cierta parte, sería utilizar Eventos, va a seguir existiendo un tiempo de retardo, es normal, pero la información de las instancias de cada cliente va a ser más clara. [SyncVar] internal bool IsDeath; [SyncEvent] public event d_Death EventDeath; void Update() { if(!isLocalPlayer)return; if(Healt <= 0 && !IsDeath) { IsDeath = true; if(EventDeath != null)EventDeath(); Cmd_SendInfo(Healt,IsDeath); } } [Command] private void Cmd_SendInfo(int healt, bool isDeath) { Healt = healt; IsDeath = isDeath; if(IsDeath)if(EventDeath != null)EventDeath(); }De esta manera estamos enviando de una manera, quizas un poco desprolija nuestra información al servidor, pero si prestaron atención en la función Update, se agregó un condicional para saber si es el jugador local, ya que solo él, podrá gestionar su salud y avisar al servidor su estado. Hay que entender, que aunque Unet Serialize nuestros datos y los optimice podemos ayudar también nosotros, a que esta tarea sea aun mas optima, por ejemplo enviando un string formateado de una manera para guardar el valor de nuestras variables. string Data = "100/0"; [Command] private void Cmd_SendInfo(string data) { string[] values = data.Split('/'); Healt = int.Parse(values[0]); IsDeath = int.Parse(values[1])? false : true; Data = data; } de esta manera optimizamos el paquete, ya que solo enviamos un dato. Bueno eso es todo por ahora, espero les sirva. Para tener un poco más organizados mis tutoriales abrí un Blogger donde encontraran todo mi material y podrán seguir mis tutoriales de UNET. http://unitydoc.blogspot.com.ar/ Saludos
  10. ¡Buenas a Todos! Para Empezar necesitamos una version 5 de Unity3D (Mejor si es la Última), conocimiento en programacion C#, breve idea de cómo funcionan Servidores Autoritativos. Primero Pasos 1- Empecemos por crear un objeto vacío en la escena y agregamos el componente de NetworkManager y NetworkManagerHud. 2- Crear un Script en C# asignar el nombre de PlayerSetup (Opcional) agregar la librería UnityEngine.Networking y la clase PlayerSetup que herede de NetworkBehaviour. 3- Empezar con la Programacion del Movimiento: A- Programar un movimiento, simple sin fisicas. private void Movement() { Vector3 Direction = new Vector3(Input.GetAxisRaw("Horizontal"),0,Input.GetAxisRaw("Vertical")); Direction = transform.TransformDirection(Direction); Vector3 NextPosition = transform.position + (Direction * Time.deltaTime * 5); transform.position = NextPosition; } B- Para llamar a esta función debemos primero comprobar si somos el Jugador Local (isLocalPlayer). C- Volvemos a la escena donde teníamos nuestro NetworkManager creamos un cubo y le asignamos nuestro componente PlayerSetup, automáticamente se añadirá junto a este otro componente llamada NetworkIdentity, en el debemos seleccionar la opción LocalPlayerAuthority creamos un prefabs del cubo y lo borramos de la escena. D- Nos dirigimos al componente NetworkManager, vamos a donde dice SpawnInfo y en el lugar de PlayerPrefab asignamos el que creamos anteriormente. E- Volvemos al Script PlayerSetup y desde la función Update ahora podemos llamar a nuestra función Movement, antes comprobando si es el Player Autorizado. public void Update() { if(!isLocalPlayer) { //CLIENTE NO LOCAL return; //Si no es el jugador termina la ejecución de Update } else { //CLIENTE LOCAL Movement(); } }4- ¡Excelente!, Ahora si compilamos para Windows podremos ver que el cubo se mueve en ambas ejecuciones, pero nos daremos cuenta de que el Jugador 1 no podrá ver el movimiento del Jugador 2 Sincronizando el movimiento 1- Para sincronizar el movimiento en red se utiliza una técnica llamada predicción de la posicion, esto quiere decir que mientras nos movemos de manera local el servidor intercepta multiples actualizaciones de nuestra posicion pero como el movimiento no va a ir por un canal seguro, podría perderse un paquete o simplemente el Ping sea muy alto y los clientes no locales experimentarian un movimiento extraño en los demás clientes. ¿Cómo creamos una sincronización? A- Para sincronizar debemos enviar los datos al servidor, gracias a UNET podemos utilizar SyncVar y Command para hacer este trabajo mucho más simple que el conocido "Serialize and Deserialize" de paquetes. Para empezar necesitamos crear una variable privada tipo Vector3 donde almacenamos nuestra posicion, y una función de tipo void con los atributos de Command ¿Qué son los Command? Son funciones que se encuentran del lado del Cliente pero siempre se ejecutan en el servidor. ¿Que el SyncVar? SyncVar nos sirve para que una variable esté sincronizada para todos los Cliente. ¡A tener en cuenta! Si nosotros cambiamos una variable de forma local, sin avisarle al servidor, los demás clientes no estarán enterados de este cambio, para que un SyncVar funciones esta debe ser modificada por el servidor, y este mismo se encarga de actualizar el valor en todas las instancias de cliente. Veamos el Código [SyncVar] private Vector3 SyncPosition; [Command] private void Cmd_SendPosition(Vector3 Pos) { SyncPosition = Pos; }2- Ya tenemos nuestro sistema para Sincronizar la posicion de nuestro jugador, ahora vamos a ponerlo en marcha, aun nos faltan 2 pasos muy importantes, al cliente local no le interesa el valor de SyncPosition, ya que este no depende de tal variable para su movimiento, pero no obstante los otros clientes no locales van a tomar ese dato para ubicarte en su espacio local. ¿Cómo hacemos esto?, vimos que nuestra función Update está separada en dos partes, la primera para los clientes NO LOCALES y la segunda es solo para clientes LOCALES, quiere decir que vamos a utilizar la parte no local para sincronizar nuestro movimiento en los demás clientes. A-Vamos a enviar la informacion de nuestra posicion al servidor utilizando el comando Cmd_SendPosition(), esto lo realizamos desde nuestra función Movement(); Cmd_SendPosition(NextPosition); B- Seguido a esto, nos dirigimos a nuestra función Update en la parte no local y creamos un movimiento Suave entra la posicion actual del Player no local y la de la variable Sincronizada transform.position = Vector3.MoveTowars(transform.position,SyncPosition, Time.deltaTime * 15); C- Por Último Compilamos nuestro proyecto y veremos como el movimiento se encuentra sincronizado en ambos clientes. El Código debe quedar de la siguiente manera public void Update() { if(!isLocalPlayer) { //CLIENTE NO LOCAL transform.position = Vector3.MoveTowars(transform.position,SyncPosition, Time.deltaTime * 15); // Movimiento del Jugador en ambiente no local return; //Si no es el jugador termina la ejecución de Update } else { //CLIENTE LOCAL Movement(); } } [SyncVar] private Vector3 SyncPosition; [Command] private void Cmd_SendPosition(Vector3 Pos) { SyncPosition = Pos; } private void Movement() { Vector3 Direction = new Vector3(Input.GetAxisRaw("Horizontal"),0,Input.GetAxisRaw("Vertical")); Direction = transform.TransformDirection(Direction); Vector3 NextPosition = transform.position + (Direction * Time.deltaTime * 5); Cmd_SendPosition(NextPosition);//Enviar información al Servidor. transform.position = NextPosition; }Bueno, eso es todo por hoy, el material es escrito para tratar de explicar mejor las cosas. Siguientes Sistema de Puntuaje + UNET + Simple UI Sistema de Salud + UNET + Simple UI Explicación más detalladas de Command Sistema de Disparos + UNET + Simple UI VIDEO TUTORIAL de todo lo explicado ¡SALUDOS A TODOS y SUERTE!
  11. Hola REbuenas, hace un par de años o mas que deje el tema de la programacion por temas laborales y hace un par de semanas mas o menos e vuelto a la intringulis de unity, ya realice algun proyecto ("SpacePoly"- "Pingu-Pedos"), ahora que vuelvo veo el unity 5.1 etc y el UNET, pero veo el foro como "parado" no se si hay otros sitio nuevo o que, pero mi sugerencia es relativa al UNET, igual que hay un apartado scripting, unity android iphone, pues crear otro con referencia al UNET por que tiene muy buena pinta la verdad y tiene mucho potencial
  12. Buenas a todos, Tras un año de experiencia con Unity me ha dado por intentar añadir multiplayer a un juego que tengo. Lo que estoy intentando ahora es en un tablero, spawnear dos jugadores, uno hostea y el otro se conecta a el, los jugadores lo unico que pueden hacer es se arrastrados con teclado, no tienen mas funcionalidad ahora mismo ya que pretendo ir añadiendo las opciones de multijugador poco a poco. Mi problema surge cuando inicio el servidor, el personaje que hostea se ve perfect y al conectarse el cliente también se ve bien dentro del host pero en el cliente me tira un error: Spawn scene object not found for 1 Spawn scene object not found for 2 Estos dos fallos se producen porque el server carga antes que la escena del cliente( o eso creo por lo que he ido investigando por internet). También dicen que la solución reside en aplicar el spawn en el OnServerReady pero igualmente da el mismo fallo. El codigo de mi custom networkmanager public class NetManager : NetworkManager { public GameObject spawnZone; public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId){ //GameObject player = Instantiate (base.playerPrefab); //player.transform.SetParent (spawnZone.transform, false); //NetworkServer.AddPlayerForConnection(conn,player, playerControllerId); Debug.Log("Datos del jugador añadido: " + conn); } public override void OnServerReady (NetworkConnection conn){ base.OnServerReady(conn); GameObject player = Instantiate (base.playerPrefab); player.transform.SetParent (spawnZone.transform, false); } }Lo comentado es para spawnear en el onServerReady, pero vamos, que da el mismo error, ¿Alguien sabe del tema? Un saludo y gracias.
  13. Buenas, tengo un ipad que hace de servidor al cual los demás se conectan a él. Estoy usando UNET la nueva forma de netowrking de unity 5. Me gustaría mandar desde el ipad servidor un mensaje Broadcast a todas las direcciones para anunciar la ip que tiene y los clientes puedan conectarse automáticamente. Alguien sabe si trae algo así ya el networking de Unity 5?? Gracias
×
×
  • Create New...