Search Unity

Third Party MIRROR: Can't Join Lobby But Can Host Lobby

Discussion in 'Multiplayer' started by Sammyueru1, May 23, 2021.

  1. Sammyueru1

    Sammyueru1

    Joined:
    Jul 20, 2020
    Posts:
    45
    So I've been trying to make a unity mirror oculus quest 2 multiplayer game and basically everything works except for the join lobby even though you can host a lobby...
    There is a join lobby button that calls to the JoinLobby() function but it still doesn't work anyways here is the scripts that you would probably need to see:

    JoinLobbyMenu script:
    Code (CSharp):
    1. using UnityEngine;
    2. using UnityEngine.UI;
    3.  
    4. public class JoinLobbyMenu : MonoBehaviour
    5. {
    6.     private string ipAddress;
    7.  
    8.     [SerializeField] private NetworkManagerLobby networkManager = null;
    9.  
    10.     [SerializeField] private GameObject landingPagePanel = null;
    11.     [SerializeField] private Text ipAddressField = null;
    12.     [SerializeField] private Button joinButton = null;
    13.     private string lastIpAddress;
    14.     private string lastIpAddressPref = "LastIPAddressEnteredPref";
    15.  
    16.     public void EnableThis()
    17.     {
    18.         this.gameObject.SetActive(true);
    19.         lastIpAddress = PlayerPrefs.GetString(lastIpAddressPref);
    20.         ipAddress = lastIpAddress;
    21.         UpdateIPField();
    22.         this.gameObject.SetActive(false);
    23.     }
    24.  
    25.     private void OnEnable()
    26.     {
    27.         NetworkManagerLobby.OnClientConnected += HandleClientConnected;
    28.         NetworkManagerLobby.OnClientDisconnected += HandleClientDisconnected;
    29.     }
    30.  
    31.     private void OnDisable()
    32.     {
    33.         NetworkManagerLobby.OnClientConnected -= HandleClientConnected;
    34.         NetworkManagerLobby.OnClientDisconnected -= HandleClientDisconnected;
    35.     }
    36.  
    37.     public void JoinLobby()
    38.     {
    39.         networkManager.networkAddress = ipAddress;
    40.         networkManager.StartClient();
    41.  
    42.         joinButton.interactable = false;
    43.     }
    44.  
    45.     private void HandleClientConnected()
    46.     {
    47.         joinButton.interactable = true;
    48.  
    49.         gameObject.SetActive(false);
    50.         landingPagePanel.SetActive(false);
    51.     }
    52.  
    53.     private void HandleClientDisconnected()
    54.     {
    55.         joinButton.interactable = true;
    56.     }
    57. }
    NetworkManagerLobby script:
    Code (CSharp):
    1. using Mirror;
    2. using System;
    3. using System.Collections.Generic;
    4. using System.Linq;
    5. using UnityEngine;
    6. using UnityEngine.SceneManagement;
    7.  
    8. public class NetworkManagerLobby : NetworkManager
    9. {
    10.     [SerializeField] private int minPlayers = 1;
    11.     [Scene] [SerializeField] private string menuScene = string.Empty;
    12.  
    13.     [Header("Room")]
    14.     [SerializeField] private NetworkRoomPlayerLobby roomPlayerPrefab = null;
    15.  
    16.     [Header("Game")]
    17.     [SerializeField] private NetworkGamePlayerLobby gamePlayerPrefab = null;
    18.  
    19.     public static event Action OnClientConnected;
    20.     public static event Action OnClientDisconnected;
    21.  
    22.     public List<NetworkRoomPlayerLobby> RoomPlayers { get; } = new List<NetworkRoomPlayerLobby>();
    23.     public List<NetworkGamePlayerLobby> GamePlayers { get; } = new List<NetworkGamePlayerLobby>();
    24.  
    25.     public override void OnStartServer() => spawnPrefabs = Resources.LoadAll<GameObject>("SpawnablePrfabs").ToList();
    26.  
    27.  
    28.     public override void OnStartClient()
    29.     {
    30.         var spawnPrefabs = Resources.LoadAll<GameObject>("SpawnablePrefabs");
    31.  
    32.         foreach(var prefab in spawnPrefabs)
    33.         {
    34.             NetworkClient.RegisterPrefab(prefab);
    35.         }
    36.     }
    37.  
    38.     public override void OnClientConnect(NetworkConnection conn)
    39.     {
    40.         base.OnClientConnect(conn);
    41.  
    42.         OnClientConnected?.Invoke();
    43.     }
    44.  
    45.     public override void OnClientDisconnect(NetworkConnection conn)
    46.     {
    47.         base.OnClientDisconnect(conn);
    48.  
    49.         OnClientDisconnected?.Invoke();
    50.     }
    51.  
    52.     public override void OnServerConnect(NetworkConnection conn)
    53.     {
    54.         if (numPlayers >= maxConnections)
    55.         {
    56.             conn.Disconnect();
    57.             return;
    58.         }
    59.  
    60.         if (SceneManager.GetActiveScene().path != menuScene)
    61.         {
    62.             conn.Disconnect();
    63.             return;
    64.         }
    65.     }
    66.  
    67.     public override void OnServerAddPlayer(NetworkConnection conn)
    68.     {
    69.         if (SceneManager.GetActiveScene().path == menuScene)
    70.         {
    71.             bool isLeader = RoomPlayers.Count == 0;
    72.  
    73.             NetworkRoomPlayerLobby roomPlayerInstance = Instantiate(roomPlayerPrefab);
    74.  
    75.             roomPlayerInstance.IsLeader = isLeader;
    76.  
    77.             NetworkServer.AddPlayerForConnection(conn, roomPlayerInstance.gameObject);
    78.         }
    79.     }
    80.  
    81.     public override void OnServerDisconnect(NetworkConnection conn)
    82.     {
    83.         if (conn.identity != null)
    84.         {
    85.             var player = conn.identity.GetComponent<NetworkRoomPlayerLobby>();
    86.  
    87.             RoomPlayers.Remove(player);
    88.  
    89.             NotifyPlayersOfReadyState();
    90.         }
    91.         base.OnServerDisconnect(conn);
    92.     }
    93.  
    94.     public override void OnStopServer()
    95.     {
    96.         RoomPlayers.Clear();
    97.     }
    98.  
    99.     public void NotifyPlayersOfReadyState()
    100.     {
    101.         foreach (var player in RoomPlayers)
    102.         {
    103.             player.HandleReadyToStart(IsReadyToStart());
    104.         }
    105.     }
    106.  
    107.     public bool IsReadyToStart()
    108.     {
    109.         if (numPlayers < minPlayers)
    110.         {
    111.             return false;
    112.         }
    113.        
    114.  
    115.         return true;
    116.     }
    117.  
    118.     public void StartGame()
    119.     {
    120.         if (SceneManager.GetActiveScene().path == menuScene)
    121.         {
    122.             //if(IsReadyToStart()) { return; }
    123.  
    124.             if (IsReadyToStart())
    125.             {
    126.                 ServerChangeScene("SceneMapTest");
    127.             }
    128.         }
    129.     }
    130.  
    131.  
    132.     public override void ServerChangeScene(string newSceneName)
    133.     {
    134.         if (SceneManager.GetActiveScene().path == menuScene && newSceneName.StartsWith("SceneMap"))
    135.         {
    136.             for (int i = RoomPlayers.Count - 1; i >= 0; i--)
    137.             {
    138.                 var conn = RoomPlayers[i].connectionToClient;
    139.                 var gameplayerInstance = Instantiate(gamePlayerPrefab);
    140.                 gameplayerInstance.SetDisplayName(RoomPlayers[i].DisplayName);
    141.  
    142.                 NetworkServer.Destroy(conn.identity.gameObject);
    143.  
    144.                 NetworkServer.ReplacePlayerForConnection(conn, gameplayerInstance.gameObject);
    145.  
    146.             }
    147.         }
    148.         base.ServerChangeScene(newSceneName);
    149.     }
    150. }
    NetworkRoomPlayerLobby script:
    Code (CSharp):
    1. using Mirror;
    2. using UnityEngine;
    3. using UnityEngine.UI;
    4.  
    5. public class NetworkRoomPlayerLobby : NetworkBehaviour
    6. {
    7.     [Header("UI")]
    8.     [SerializeField] private GameObject lobbyUI = null;
    9.     public Text ipCode;
    10.     [SerializeField] private Text[] playerNameTexts = new Text[3];
    11.     [SerializeField] private Button startGameButton = null;
    12.     private NetworkManagerLobby networkManagerLobby;
    13.  
    14.     [SyncVar]
    15.     public string DisplayName = "Loading...";
    16.  
    17.     private bool isLeader;
    18.  
    19.  
    20.     void Start()
    21.     {
    22.         networkManagerLobby = GameObject.FindGameObjectWithTag("NetworkManagerLobby").GetComponent<NetworkManagerLobby>();
    23.     }
    24.  
    25.     void OnEnable()
    26.     {
    27.         string iPAddress = IPAddress();
    28.         ipCode.text = iPAddress;
    29.  
    30.         cmdSetDisplayName(PlayerNameInput.DisplayName);
    31.  
    32.         networkManagerLobby = GameObject.FindGameObjectWithTag("NetworkManagerLobby").GetComponent<NetworkManagerLobby>();
    33.     }
    34.  
    35.     public static string IPAddress()
    36.     {
    37.         var host = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
    38.         foreach (var ip in host.AddressList)
    39.         {
    40.             if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
    41.             {
    42.                 return ip.ToString();
    43.             }
    44.         }
    45.  
    46.         throw new System.Exception("No network adapters with an IPv4 address in the system!");
    47.     }
    48.  
    49.     public bool IsLeader
    50.     {
    51.         set
    52.         {
    53.             isLeader = value;
    54.             startGameButton.gameObject.SetActive(value);
    55.         }
    56.     }
    57.  
    58.     private NetworkManagerLobby room;
    59.     private NetworkManagerLobby Room
    60.     {
    61.         get
    62.         {
    63.             if (room != null) { return room; }
    64.             return room = NetworkManagerLobby.singleton as NetworkManagerLobby;
    65.         }
    66.     }
    67.  
    68.    
    69.     public override void OnStartAuthority()
    70.     {
    71.         cmdSetDisplayName(PlayerNameInput.DisplayName);
    72.  
    73.         lobbyUI.SetActive(true);
    74.     }
    75.    
    76.     public override void OnStartClient()
    77.     {
    78.         Room.RoomPlayers.Add(this);
    79.  
    80.         UpdateDisplay();
    81.     }
    82.  
    83.     public override void OnStopClient()
    84.     {
    85.         Room.RoomPlayers.Remove(this);
    86.  
    87.         UpdateDisplay();
    88.     }
    89.  
    90.     public void HandleDisplayNameChanged(string oldValue, string newValue) => UpdateDisplay();
    91.  
    92.     private void UpdateDisplay()
    93.     {
    94.         if (!hasAuthority)
    95.         {
    96.             foreach (var player in Room.RoomPlayers)
    97.             {
    98.                 if (player.hasAuthority)
    99.                 {
    100.                     player.UpdateDisplay();
    101.                     break;
    102.                 }
    103.             }
    104.             return;
    105.         }
    106.  
    107.         for (int i = 0; i < playerNameTexts.Length; i++ )
    108.         {
    109.             playerNameTexts[i].text = "Waiting For Player...";
    110.         }
    111.  
    112.         for (int i = 0; i < Room.RoomPlayers.Count; i++)
    113.         {
    114.             playerNameTexts[i].text = Room.RoomPlayers[i].DisplayName;
    115.         }
    116.     }
    117.  
    118.     public void HandleReadyToStart(bool readyToStart)
    119.     {
    120.         if (!isLeader)
    121.         {
    122.             return;
    123.         }
    124.  
    125.         startGameButton.interactable = readyToStart;
    126.     }
    127.  
    128.     [Command]
    129.     private void cmdSetDisplayName(string displayName)
    130.     {
    131.         DisplayName = displayName;
    132.         UpdateDisplay();
    133.     }
    134.  
    135.     [Command]
    136.     public void CmdStartGame()
    137.     {
    138.         if (Room.RoomPlayers[0].connectionToClient != connectionToClient) { return; }
    139.         networkManagerLobby.StartGame();
    140.     }
    141. }

    Anyways thanks in advance.