You are on page 1of 8

Tutorial de Unity 3D Tema 1 Network Tutorial

Tutorial de Unity 3D Network Tutorial Las funcionalidades de red son un concepto extenso y lleno de detalles. En Unity, es muy simple crear funcionalidades de red. Sin embargo, es prioritario entender la amplitud y la profundidad que involucra crear cualquier tipo de videojuego en red. El siguiente tutorial explicar los conceptos fundamentales de redes, y las ejecuciones especficas de Unity que puedes usar. Si nunca has creado antes un videojuego en red, es altamente recomendado que leas la siguiente gua en detalle antes de comenzar. 1. Una visin general de las funcionalidades de red En esta seccin abordaremos todos los conceptos involucrados en las funcionalidades de red. Dichos conceptos deben ser entendidos antes de comenzar a desarrollar con la arquitectura de redes de Unity. Adems, servirn como introduccin a otros conceptos ms complejos. 1.1 Qu son las funcionalidades de red? Una funcionalidad de red es una comunicacin entre dos o ms dispositivos (PC, mviles, consolas...). La idea fundamental es la relacin entre un cliente (El dispositivo que pide informacin) y un servidor (El dispositivo que responde a las peticiones). El servidor puede ser o bien un host dedicado que utilizan todos los clientes, o simplemente el dispositivo de uno de los jugadores que ejecutan el juego. En ese caso se tratara tambin de un cliente, pero actuando a la vez como servidor para otros jugadores. Una vez que un servidor comienza a funcionar y un cliente se conecta, los dos dispositivos intercambian datos tal y como lo requiera el sistema de juego. Crear un videojuego con funcionalidades de red requiere mucha atencin a algunos detalles especficos. Incluso aunque las acciones a travs de la red son fciles de disear y crear en Unity, el funcionamiento en red resulta complejo. Una importante decisin de diseo en Unity es hacer las funciones de red tan robustas y flexibles como sea posible. Eso significa que t, como creador del videojuego, eres responsable de aspectos que pueden ser manejados con un sistema automtico, pero menos robusto, en otras plataformas. de desarrollo.

Tutorial de Unity 3D Tema 1

Pg. 1

Tutorial de Unity 3D Tema 1 Network Tutorial

Las decisiones que tomes durante la implementacin tendrn un efecto potencialmente significativo en el diseo final de tu videojuego, as que es mejor tomarlas lo ms tempranamente posible en el proceso de desarrollo. Entender los conceptos de las funcionalidades de red te ayudar a planificar tu diseo y evitar problemas de implementacin. 1.2 Enfocando las funcionalidades de red Hay dos enfoques distintos para estructurar un videojuego en red. Tenemos el servidor autoritario y el servidor no autoritario. Ambos enfoques subyacen en un servidor conectando clientes y pasando informacin entre ellos. Ambos ofrecen tambin privacidad para el usuario final puesto que los clientes nunca llegan a conectar directamente el uno con el otro ni revelar su IP a los dems.

1.2.1 El servidor autoritario


El enfoque de servidor autoritario requiere que el servidor realice toda la simulacin del mundo, la aplicacin de las reglas de juego y el procesamiento de la entrada de datos de los clientes. Cada cliente enva su entrada (En forma de pulsacin de teclas o peticin de acciones) al servidor y continuamente recibe desde el servidor el estado actual del juego. El cliente nunca realiza ningn cambio en el estado de juego por s mismo. En lugar de ello le comunica al servidor lo que quiere hacer, y el servidor procesa la peticin y responde al cliente con el resultado. Principalmente existe una capa de separacin entre lo que el jugador quiere hacer y lo que realmente sucede. Esto permite al servidor escuchar cada peticin de los clientes antes de decidir cmo actualizar el estado de juego. Una ventaja de este tipo de enfoque es que hace que el cliente lo tenga mucho ms difcil para hacer trampas. Por ejemplo, los clientes no tienen posibilidad de comunicar al servidor (Y por tanto al resto de clientes) que un enemigo ha sido eliminado, ya que la decisin no recae en ellos. Ellos slo pueden comunicar al servidor que un arma ha sido disparada desde un lugar, y el servidor es quien determina si se ha producido o no un impacto. Otro ejemplo de servidor autoritario sera un videojuego multijugador basado en fsicas. Si cada cliente tiene permiso para procesar sus propias simulaciones fsicas, se produciran pequeas variaciones entre clientes que llevaran a gradualmente a perder la sincronizacin entre ellos. En cambio, si la simulacin fsica se Tutorial de Unity 3D Tema 1 Pg. 2

Tutorial de Unity 3D Tema 1 Network Tutorial

realiza de forma centralizada en el servidor, entonces la situacin final actualizada puede ser enviada de vuelta a los clientes, garantizando que sta sea consistente. Con los detalles que hemos dado puede parecerte un sistema ideal para gestionar las funcionalidades de red, pero existe una desventaja potencial importante. La principal contra es el tiempo que tardan los mensajes en viajar a travs de la red. Si el jugador pulsa una tecla para moverse y tarda una dcima de segundo en llegar la respuesta del servidor, entonces el retraso se har perceptible por parte del jugador. Una solucin a ello es utilizar la denominada client-side prediction (Prediccin de lado del cliente). La base de esta tcnica es permitir que el cliente sea capaz de actualizar su versin local del estado de juego, pero siendo capaz de recibir correcciones por parte del servidor autoritario cuando sea necesario. Generalmente sto debera ser utilizado slo para acciones de juego sencillas y cambios poco significativos en el estado de juego. Por ejemplo, no sera deseable indicar a un jugador que un enemigo ha muerto de cara al servidor y tener que cambiar despus esa decisin. La programacin de la prediccin por parte del cliente es un proceso complejo. No ser cubierta en este tutorial pero hay libros y recursos en internet que te ayudarn si deseas investigar ms all. Un servidor autoritario sufre una carga de procesamiento mayor que un servidor no autoritario. Si no se requiere acceder al servidor para manejar todos los cambios en el estado de juego, es posible distribuir gran parte de la carga de ejecucin entre los clientes.

1.2.2 El servidor no autoritario


El servidor no autoritario no controla el resultado de cada entrada de datos (Teclado, ratn, acelermetro...) que se produce por parte del usuario. Los propios clientes procesan la entrada del usuario y la lgica de juego localmente, y entonces envan el resultado de las acciones al servidor. El servidor sincroniza todas las acciones con el estado del mundo. Es ms fcil de implementar desde el punto de vista del diseo, ya que el servidor simplemente intercambia mensajes entre los clientes y no realiza procesamiento adicional ms all del realizado por los clientes. No hay necesidad de mtodos de prediccin de ningn tipo, ya que los clientes manejan todas las fsicas y eventos por s mismos y retransmiten lo que sucede al servidor. Los clientes son propietarios de sus objetos y son los nicos agentes con permisos para enviar modificaciones locales de los mismos a travs de la red.

Tutorial de Unity 3D Tema 1

Pg. 3

Tutorial de Unity 3D Tema 1 Network Tutorial

1.3 Mtodos de comunicacin de funcionalidades de red Ahora que ya hemos tratado las arquitecturas bsicas para videojuegos en red, vamos a explorar a bajo nivel cmo clientes y servidores se comunican entre s. Hay dos modos fundamentales: Remote Procedure Calls (RPCs llamadas a procedimientos remotos) y State Synchronization (Sincronizacin de estado). Es habitual combinar ambos mtodos en diferentes aspectos de un determinado videojuego.

1.3.1 Remote Procedure Calls (RPCs llamadas a procedimientos remotos)


Las RPCs se utilizan para invocar funciones en otros dispositivos dentro de la red, o tambin dentro del canal dentro de un cliente y servidor que se ejecutan en el mismo dispositivo. Los clientes pueden envar RPCs al servidor, y el servidor puede envar RPCs a uno o ms clientes. Lo habitual es que sean usadas para acciones que NO suceden de manera frecuente. Por ejemplo, si un cliente activa un interruptor para abrir una puerta, puede enviarse una RPC al servidor indicando que la puerta ha sido abierta. El servidor puede enviar otra RPC a todos los clientes, invocando sus funciones locales para abrir la misma puerta. Generalmente se utilizan para ejecutar eventos individuales.

1.3.2 State Synchronization (Sincronizacin de estado)


Se utiliza para compartir datos que cambian continuamente. El mejor ejemplo sera la posicin del jugador en un videojuego de accin. El jugador est siempre movindose, corriendo, saltando... El resto de jugadores en la red, incluso los que no visualizan localmente a ese jugador, necesitan conocer dnde se encuentra y qu est haciendo. Retransmitiendo constantemente la posicin de ese jugador, el videojuego puede representarla de forma precisa al resto de jugadores en red. Este tipo de datos se envan frecuentemente y de manera regular a travs de la red. Dado que son dependientes del tiempo, y que requieren ancho de banda para viajar a travs de la red de una mquina a otra, es importante reducir en la medida de lo posible los datos que son enviados. En pocas palabras, la sincronizacin de estado por su naturaleza requiere mucho ancho de banda, as que uno de tus principales objetivos debera ser usar el mnimo posible.

Tutorial de Unity 3D Tema 1

Pg. 4

Tutorial de Unity 3D Tema 1 Network Tutorial

1.4 Conectando clientes y servidores Puede ser un proceso complicado. Las mquinas pueden tener una direccin IP privada o pblica con un firewall local o externo que bloquee el acceso. Las funcionalidades de red de Unity tienen como objetivo controlar todas las situaciones posibles, pero no existe una solucin universal. Las direcciones privadas son direcciones IP no accesibles directamente desde internet (Tambin se denominan Network Address Translation o NAT, direcciones situadas detrs del sistema utilizado para implementarlas). Si lo explicamos de una forma sencilla, las direcciones privadas trabajan un un router local que termina traduciendo esa direccin en una direccin pblica. Haciendo sto, varios dispositivos con una IP privada pueden usar una nica IP pblica para comunicarse a travs de internet. Esto nos resulta bueno cuando alguien a travs de internet quiere iniciar contacto con una IP privada. La comunicacin debe realizarse a travs de la IP pblica del router, que debe pasar el mensaje a la direccin privada. Una tcnica denominada intromisin NAT utiliza un servidor compartido comnmente conocido como facilitador para gestionar la comunicacin de forma que la IP privada pueda ser accedida a travs de la IP pblica. Todo sto funciona teniendo la IP privada contactando en primer lugar con el facilitador, que abre un agujero a travs del router. As el facilitador puede ver la IP pblica y el puerto que la IP privada est utilizando. Utilizando esta informacin, cualquier dispositivo de internet puede conectar con la IP privada que de otra forma resultara inalcanzable. Ntese en este punto que que la intromisin NAT es mucho ms complicada que todo sto en la prctica.

file:///C:/Program%20Files %20(x86)/Unity/Editor/Data/Documentation/Documentation/Components/Network%20Reference %20Guide.html file:///C:/Program%20Files %20(x86)/Unity/Editor/Data/Documentation/Documentation/Components/netHighLevelOverview.html file:///C:/Program%20Files %20(x86)/Unity/Editor/Data/Documentation/Documentation/Components/class-NetworkView.html

Tutorial de Unity 3D Tema 1

Pg. 5

Tutorial de Unity 3D Tema 1 Network Tutorial

The facilitator can now see the public IP address and port which the private address is using. Using this information, any machine on the internet can now connect directly with the otherwise unreachable private address. (Note that the details of NAT punchthrough are somewhat more complicated than this in practice.) Public addresses are more straightforward. Here, the main issue is that connectivity can be blocked by an internal or external firewall (an internal firewall is one that runs locally on the computer it is protecting). For an internal firewall, the user can be asked to remove restrictions from a particular port so as to make the game server accessible. An external firewall, by contrast, is not under the control of the users. Unity can attempt to use NAT punchthrough to get access through an external firewall but this technique is not guaranteed to succeed. Our testing suggests that it generally works in practice but there doesn't appear to be any formal research that confirms this finding. The connectivity issues just mentioned affect servers and clients differently. Client requests involve only outgoing network traffic which is relatively straightforward. If the client has a public address then this almost always works since outgoing traffic is typically only blocked on corporate networks that impose severe access restrictions. If the client has a private address it can connect to all servers except servers with private addresses which cannot do NAT punchthrough (more will be said about this later). The server end is more complicated because the server needs to be able to accept incoming connections from unknown sources. With a public address, the server needs to have the game port open to the internet (ie, not blocked by a firewall). or else it cannot accept any connections from clients and is thus unusable. If the server has a private address it must be able to do NAT punchthrough to allow connections and clients must also permit NAT punchthrough in order to connect to it. Unity provides tools to test all these different connectivity situations. When it is established that a connection can be made, there are two methods by which it can happen: direct connections (where a client needs to know the DNS name or IP address of the server) and connections via the Master Server. The Master Server allows servers to advertise their presence to clients which need not know anything about particular game servers beforehand. Minimizing Network Bandwidth When working with State Synchronization across multiple clients, you don't necessarily need to synchronize every single detail in order to make objects appear synchronized. For example, when synchronizing a character avatar you only need to send its position and rotation between clients. Even though the character itself is much more complex and might contain a deep Transform hierarchy, data about the entire hierarchy does not need to be shared.

Tutorial de Unity 3D Tema 1

Pg. 6

Tutorial de Unity 3D Tema 1 Network Tutorial

A lot of data in your game is effectively static, and clients need neither transfer it initially nor synchronize it. Using infrequent or one-time RPC calls should be sufficient to make a lot of your functionality work. Take advantage of the data you know will exist in every installation of your game and keep the client working by itself as much as possible. For example, you know that assets like textures and meshes exist on all installations and they usually don't change, so they will never have to be synchronized. This is a simple example but it should get you thinking about what data is absolutely critical to share from one client to another. This is the only data that you should ever share. It can be difficult to work out exactly what needs to be shared and what doesn't, especially if you have never made a network game before. Bear in mind that you can use a single RPC call with a level name to make all clients load the entire specified level and add their own networked elements automatically. Structuring your game to make each client as self-sufficient as possible will result in reduced bandwidth. Multiplayer Game Performance The physical location and performance of the server itself can greatly affect the playability of a game running on it. Clients which are located a continent away from the server may experience a great deal of lag. This is a physical limitation of the internet and the only real solution is to arrange for the server to be as close as possible to the clients who will use it, or at least on the same continent. Extra Resources We've collected the following links to additional resources about networking:http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking http://developer.valvesoftware.com/wiki/Lag_Compensation http://developer.valvesoftware.com/wiki/Working_With_Prediction http://www.gamasutra.com/resource_guide/20020916/lambright_01.htm

High Level Overview This section will outline all the concepts involved in networking. It will serve as an introduction to deeper topics. Networking Elements in Unity This section of the guide will cover Unity's execution of the ideas discussed above. Network View Network Views are Components you use to share data across the network. They are extremely important to understand. This page will explain them in detail. Tutorial de Unity 3D Tema 1 Pg. 7

Tutorial de Unity 3D Tema 1 Network Tutorial

RPC Details RPC stands for Remote Procedure Call. It is a way of calling a function on a remote machine. This may be a client calling a function on the server, or the server calling a function on all or specific clients, etc. This page explains RPC concepts in detail. State Synchronization State Synchronization is a method of regularly updating a specific set of data across two or more game instances running on the network. Network Instantiate One difficult subject in networking is ownership of an object. Who controls what? Network Instantiation will determine this logic for you. This page will explain how to do this. It will also explain the complex alternatives, for situations when you just need more control. Master Server The Master Server is like a game lobby where servers can advertise their presence to clients. It is also a solution to enabling communication from behind a firewall or home network. When needed it makes it possible to use a technique called NAT punchthrough (with help from a facilitator) to make sure your players can always connect with each other. This page will explain how to use the Master Server. Minimizing Bandwidth Every choice you make about where and how to share data will affect the bandwidth your game uses. This page will share some details about bandwidth usage and how to keep it to a minimum. Android

Tutorial de Unity 3D Tema 1

Pg. 8

You might also like