Advertisement
KTVX94

MultiplayerManager

Dec 8th, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.13 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.Networking;
  5. using System;
  6.  
  7. public class MultiplayerManager : MonoBehaviour {
  8.  
  9.     public static int connectionID;//El identificador de mi instancia dentro de la red.
  10.     public ConnectionType connectionType;//Tipo de conección.
  11.     public static NetworkClient myClient;//Información de conección a un Servidor.
  12.     public static MultiplayerManager instance;//Singleton
  13.  
  14.  
  15.     public enum ConnectionType
  16.     {
  17.         None,
  18.         Server,
  19.         Client,
  20.         Both
  21.     }
  22.  
  23.     public enum PacketIDs : short
  24.     {
  25.         ShootCommand,
  26.         CreateBullet,
  27.         Count,
  28.         Move,
  29.         ConnectToServer,
  30.         SpawnPlayer,
  31.  
  32.     }
  33.  
  34.     //interno
  35.     Dictionary<PacketIDs, Action<PacketBase>> PacketActions = new Dictionary<PacketIDs, Action<PacketBase>>();
  36.  
  37.     //de acceso publico
  38.     public Dictionary<string, Action<string>> OldSchoolCommand = new Dictionary<string, Action<string>>();
  39.  
  40.     private void Awake()
  41.     {
  42.         instance = this;
  43.     }
  44.  
  45.     private void OnGUI()
  46.     {
  47.        
  48.         if (!NetworkServer.active && !NetworkClient.active)
  49.         {
  50.             if (GUILayout.Button("Start Server"))//Inicializamos una red como Servidor.
  51.                 SetupServer();
  52.  
  53.             if (GUILayout.Button("Start Client"))//Inicializamos la conección a una red como Cliente.
  54.                 SetupClient();
  55.  
  56.             if (GUILayout.Button("Start Host Client"))//Inicializamos una red como Servidor y lanzamos el juego.
  57.                 SetupServer(true);
  58.         }
  59.  
  60.         if (NetworkClient.active)//Si mi cliente está activo...
  61.             if (GUILayout.Button("Disconnect"))//Añadimos un botón en pantalla, para desconectarnos.
  62.                 myClient.Disconnect();//Nos desconectamos.
  63.     }
  64.  
  65.     public void SetupServer(bool launchClient = false)
  66.     {
  67.         connectionType = launchClient ? ConnectionType.Both : ConnectionType.Server;
  68.         AddPacketActions();//Inicializo mis diccionarios.
  69.         NetworkServer.Listen(8080);//Se prepara para recibir paquetes en el puerto específicado.
  70.         myClient = ClientScene.ConnectLocalServer();//Crea y connecta a una instancia local de cliente al servidor local. Esto combierte al cliente en un "Host" - Un cliente y un servidor en el mismo proceso.
  71.                                                     // --> ClientScene: https://docs.unity3d.com/ScriptReference/Networking.ClientScene.html
  72.     }
  73.  
  74.     public void SetupClient()
  75.     {
  76.         connectionType = ConnectionType.Client;
  77.         myClient = new NetworkClient();//Creo una nueva instancia de la clase NetWorkClient.
  78.         AddPacketActions();//Inicializo mis diccionarios.
  79.         connectionID = UnityEngine.Random.Range(0, 1000);
  80.         myClient.Connect("127.0.0.1", 8080);//Me conecto a la ip del servidor "root" de la red, en el puerto específicado.
  81.     }
  82.  
  83.     void AddPacketActions()
  84.     {
  85.         /*
  86.          * En Esta sección, lo que vamos a hacer es crear en nuestro sistema las acciones que se van a realizar en el
  87.          * momento en el que un paquete llegue al puerto de nuestra conección.
  88.          * Debemos registrar por separado la acción a realizar para cada tipo de paquete.
  89.         */
  90.  
  91.         //Registramos en la red las acciones para cada paquete.
  92.         if (connectionType == ConnectionType.Server)//Si somos el servidor.
  93.             for (short i = 1000; i < 1000 + (short)PacketIDs.Count; i++)
  94.                 NetworkServer.RegisterHandler(i, OnPacketReceived);
  95.  
  96.         else if (connectionType == ConnectionType.Client)//Si somos el cliente.
  97.             for (short i = 1000; i < 1000 + (short)PacketIDs.Count; i++)
  98.                 myClient.RegisterHandler(i, OnPacketReceived);
  99.  
  100.         else if (connectionType == ConnectionType.Both)//Si somos las 2 cosas.
  101.             for (short i = 1000; i < 1000 + (short)PacketIDs.Count; i++)
  102.             {
  103.                 if (myClient != null) Debug.Log("hay client");
  104.                 myClient.RegisterHandler(i, OnPacketReceived);
  105.                 NetworkServer.RegisterHandler(i, OnPacketReceived);
  106.             }
  107.         // --> RegisterHander: https://docs.unity3d.com/ScriptReference/Networking.NetworkServer.RegisterHandler.html
  108.  
  109.         //Registramos los paquetes en nuestro sistema. Poner Las acciones propias
  110.  
  111.         /*PacketActions.Add(PacketIDs.Move_Command, PacketExecution.Move_Command);
  112.         PacketActions.Add(PacketIDs.Attack_Command, PacketExecution.Attack_Command);
  113.         PacketActions.Add(PacketIDs.Select_Command, PacketExecution.Select_Command);
  114.         PacketActions.Add(PacketIDs.Old_School_Command, PacketExecution.Old_School_Command);
  115.         old_school_command.Add("Old_School_Move", x => Move(x));
  116.  
  117.         packetActions.Add(PacketIDs.ConnectToServer, PacketExecution.ConnectServer);
  118.         */
  119.         PacketActions.Add(PacketIDs.Move, PacketExecution.Move);
  120.         PacketActions.Add(PacketIDs.SpawnPlayer, PacketExecution.SpawnPlayer);
  121.    
  122.     }
  123.  
  124.     void OnPacketReceived(NetworkMessage netMsg)
  125.     {
  126.         // NetworkMessage es usado para extraer un Mensaje Tipado del NetworkReader de un NetworkMessage object.
  127.         var msg = netMsg.ReadMessage<PacketBase>();//Convierto el mensaje a un tipo PacketBase.
  128.         msg.connectionID = netMsg.conn.connectionId;//Almaceno dentro del PacketBase la ID de la conección guardada en el Mensaje.
  129.  
  130.         if (PacketActions.ContainsKey((PacketIDs)msg.messageID))//Tomo el identificador del paquete y me fijo si existe en el diccionario correspondiente.
  131.             PacketActions[(PacketIDs)msg.messageID](msg);//Si existe, lo ejecuto.
  132.     }
  133.  
  134.     void ConnectToClient()
  135.     {
  136.         new PacketBase(PacketIDs.ConnectToServer).Add((float)connectionID).Send();
  137.     }
  138.  
  139.     public void Move(int playerID, Vector3 pos)
  140.     {
  141.      
  142.       //  charObj.transform.position = pos;
  143.     }
  144.  
  145.     public void Shoot(Vector3 pos, Vector3 fwd, string parent)
  146.     {
  147.  
  148.     }
  149.  
  150.     public void SpawnPlayer(int connID)
  151.     {
  152.         //GameManager.instancia.TheAutority.InstanciateBullet(pos, rot);
  153.         SuperGameManager.mainPlayer.CreateTank(connID);
  154.     }
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement