Multijugador en Red
Este proyecto emplea la herramienta de Photon Unity Networking versión 2 (PUN2) para el
manejo del juego con multijugador en red.
PUN2 es una herramienta externa de que se integra con unity para dar soporte de juegos
multijugador en todo el mundo.
Photon Cloud
Es un conjunto de máquinas ejecutando el servidor de Photon distribuidas en diferentes partes
del mundo, estos servidores son mantenidos por la compañía Exit Games.
Photon Cloud ofrece un servicio de emparejamiento entre varios Jugadores a través de PUN,
este precio del servicio depende del número Usuarios Conectadas Simultáneamente (CCU), la
versión gratuita del servicio permite hasta 20 CCU. Por tanto, para este proyecto es suficiente
con la versión gratuita.
[Link]
Integración con Unity
La integración se realiza directamente desde la tienda de Asset Store de Unity. El paquete de
PUN2 se puede descargar e instalar gratuitamente.
Con el paquete PUN2 importado en el proyecto de Unity se procede a registrarlo mediante un
código AppId. Este Appid se obtiene de una cuenta personal de Photon Cloud registrado y
creado previamente una Aplicación del tipo Photon PUN.
PUN contiene el script Photon Server Settings en donde se debe registrar el identificador de la
Aplicación (AppId) obtenida de Photon Cloud.
Algunas Clases de Photon Unity Networking
Todas las clases de PUN son heredadas de la clase propia de Unity MonoBehaviour.
Clase PhotonNetwork
PhotonNetwork es la clase principal de PUN de tipo estática. Contiene funciones para
establecer, mantener y cerrar la conexión con la Nube de Photon. También permite el manejo de
los Jugadores y sus propiedades.
Funciones y Propiedades
ConnectUsingSettings () se conecta a la nube de Photon de acuerdo a la configuración de
PhotonServerSettings.
ConnectToBestCloudServer () se conecta automáticamente a un servidor con el ping más bajo
ConnectToMaster() se conecta a un servidor de Photon (el servidor más cercano)
Disconnect () permite al usuario desconectarse de la nube de Photon
JoinLobby () se unen al Lobby por defecto del Master Server. También se puede personalizar nuestro
propio Lobby mediante sobreescritura para el manejo de propias salas de juego.
CreateRoom() permite crear una sala de juego con número máximo de jugadores, a la vez se
une a dicha sala el usuario que acaba de crearlo. Este usuario pasa a ser el Cliente Maestro de
dicha sala.
JoinOrCreateRoom () se une a una sala de nombre conocido si existe, caso contrario se crea y se une a
una sala con dicho nombre.
JoinRoom() permite unirse a una sala en particular disponibles de una lista de salas creadas por otros
usuarios.
JoinRandomRoom() permite unirse a una sala aleatoria existente, si no existe se crea y se une a una sala
de nombre y número máximo de jugadores creada por defecto.
OnJoinedRoom() – permite verificar cuando el jugador se ha unido a una sala y posteriormente lanzar una
escena de juego.
LeaveRoom() – permite al jugador salir de la sala actual al terminar una partida o pérdida total de la
conexión y posteriormente regresar al menú principal.
Instantiate(string prefabName, …) – permite instanciar un gameObject en red a partir de su nombre, los
gameObjects prefabricados deben estar ubicado dentro de la capeta “Resources”.
Destroy() – permite destruir un Objeto en red a partir de un gameObject o PhotonView.
IsMasterClient [get] - permite identificar al cliente Maestro para asignar o terminar operaciones dentro de
una partida.
LocalPlayer [get] – permite identificar al propio jugador (Local) para atribuirle o negar ciertas operaciones.
Clase Player
Permite la gestión de los jugadores dentro de una sala de juego, se los puede identificar mediante el
número de Actor o un identificador personalizado que está asociada a la Base de Datos de MySql.
ActorNumber – es un número de tipo entero asignado automáticamente por Photon, inicialmente tiene
valor por defecto -1, cada jugador va tomando un valor en orden ascendente como van ingresando a la
sala.
Get(int id) – permite obtener un jugador por el número de Actor.
IsLocal – variable booleana que permite identificar un jugador a sí mismo, los demás jugadores no son
locales
NickName – variable tipo string que permite identificarse visiblemente entre los jugadores de una durante
una partida.
Métodos
GetScore() – permite obtener el puntaje actual de un jugador.
SetScore() – permite asignar el valor del puntaje a un jugador
UpdateScorePlayer() - permite actualizar el puntaje del jugador con la Base de Datos
Clase PhotonView
Este componente es requerido en todos los objetos que requiere sincronizarse en red, contiene
un identificador único (viewID) que permite reconocer a un objeto entre otros objetos en la red.
RPC() – es un método que permite a cada jugador de la misma sala ejecutar el código en que se
encuentra en él.
OnPhotonSerializeView() – método llamado varias veces por segundo con el que permite
sincronizar variables mediante lectura y escritura entre todos los jugadores de la misma sala.
IMPLEMENTACION
1. Instanciación automática
Cada objeto instanciado lo debe realizar un único jugador, si no genera duplicados.
Asigna automáticamente el viewID.
Los objetos deben estar en la carpeta Resources.
[Link]("MyPrefabName", new Vector3(0, 0, 0), [Link], 0);
2. Instanciación manual
La instanciación se hace usando la que trae por defecto Unity.
Todos los jugadores de la partida deben instanciar el objeto.
Se asigna manualmente en viewID.
No necesita que los objetos instanciados estén en la carpeta Resources.
[PunRPC]
public void InstanceObject() {
GameObject instancia = Instantiate(MyPrefab, new Vector3(0, 0, 0), [Link]);
[Link]([Link]());
}
¿Como enviar y recibir información?
1. OnPhotonSerializeView
Características:
- Es un bucle que se ejecuta continuamente
- Solo se envían los datos a otros objetos con el mismo PhotonView
- Un jugador envía la información, el resto la recibe
Usos:
- Personajes de los jugadores o de la UI
- Objetos con física y movimiento dinámico
public class PlayerManager : MonoBehaviourPunCallbacks, IPunObservable
{
#region IPunObservable implementation
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if ([Link])
{
// We own this player: send the others our data
[Link](IsFiring);
}
else
{
// Network player, receive data
[Link] = (bool)[Link]();
}
#endregion
2. RPC
Características:
- Es un método que se ejecuta con una llamada cuando lo requiera
- Al igual que el método “OnPhotonSerializeView”, solo se ejecuta en los objetos
con el mismo PhotonView
Usos:
- Instanciar y destruir objetos que no tienen un comportamiento dinámico (bala, daño
de área, estructuras, etc.)
- Notificar un evento que no sucede continuamente (recibir daño, inicio o fin de
partida, etc.)
[Link]
Ejemplo: Método ejecutado por todos los clientes sin argumento de entrada.
Ejemplo2: Método ejecutado por todos los clientes con argumento de entrada.