mirror of
				https://github.com/DerTyp7/defrain-shooter-unity.git
				synced 2025-10-31 13:37:08 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			159 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| using UnityEngine.SceneManagement;
 | |
| using Mirror;
 | |
| using TMPro;
 | |
| 
 | |
| 
 | |
| /* TODO:
 | |
|  * - Changing Lobby Title Objects causes bugs on client
 | |
|  */
 | |
| 
 | |
| 
 | |
| /*
 | |
|  * The Lobby will always be the "Room", where all Players are connected to.
 | |
|  * In-Game AND in LobbyScene!
 | |
|  * It manages the Players
 | |
|  */
 | |
| 
 | |
| public class Lobby : NetworkBehaviour
 | |
| {
 | |
|     NetManagerScript networkManager;
 | |
|     public bool isLobbyScene;
 | |
| 
 | |
|     //Player Lists
 | |
|     [SyncVar]
 | |
|     public List<Player> Players = new List<Player>();
 | |
|     [SyncVar]
 | |
|     public List<LobbyPlayer> LobbyPlayers = new List<LobbyPlayer>(); // All player a register themselves when they join (LobbyPlayer.cs)
 | |
| 
 | |
|     //Scene switch to in-game
 | |
|     [SerializeField] GameObject GamePlayerPrefab;
 | |
|     [SerializeField] [Scene] string gameScene;
 | |
| 
 | |
|     //Lobby Scene
 | |
|     [SyncVar(hook = "ChangeTitle")]
 | |
|     [SerializeField] string lobbyTitle;  // Title/Name of the Lobby; Can only be changed by the host, because of "AuthHost"
 | |
| 
 | |
|     [SyncVar]
 | |
|     public bool allReady = false; // All players are ready?
 | |
| 
 | |
|     void Start()
 | |
|     {
 | |
|         DontDestroyOnLoad(this);
 | |
|         networkManager = GameObject.Find("NetManager").GetComponent<NetManagerScript>();
 | |
|     }
 | |
| 
 | |
|     void Update()
 | |
|     {
 | |
|         if(SceneManager.GetActiveScene().name == "Lobby") // Check if we are in-game
 | |
|             isLobbyScene = true;
 | |
|         else
 | |
|             isLobbyScene = false;
 | |
| 
 | |
|         if (isLobbyScene)
 | |
|         {
 | |
|             CheckLobbyPlayers(); // Checking the LobbyPlayer List
 | |
|             allReady = CheckAllReady(); // Continous checking if all player are ready
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             CheckPlayers();// Checking the Player List
 | |
|         }
 | |
|     }
 | |
| 
 | |
|  
 | |
|     public void ChangeToPlayer(LobbyPlayer lobbyPlayer) //Convert/Change the LobbyPlayer to a Player
 | |
|     {
 | |
|         Debug.Log("Change");
 | |
|         var conn = lobbyPlayer.connectionToClient;
 | |
|         var newPlayerInstance = Instantiate(GamePlayerPrefab);
 | |
| 
 | |
|         //newPlayerInstance.GetComponent<Player>().username = player.username;
 | |
| 
 | |
|         NetworkServer.Destroy(conn.identity.gameObject);
 | |
| 
 | |
|         NetworkServer.ReplacePlayerForConnection(conn, newPlayerInstance.gameObject);
 | |
|         LobbyPlayers.Remove(lobbyPlayer);
 | |
|         Players.Add(newPlayerInstance.gameObject.GetComponent<Player>());
 | |
|     }
 | |
| 
 | |
|     
 | |
| 
 | |
|     void CheckPlayers()
 | |
|     {
 | |
|         foreach (Player player in Players)
 | |
|         {
 | |
|             if (player == null)
 | |
|             {
 | |
|                 Players.Remove(player);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     #region InLobbyScene
 | |
|     public void StartGame() // initializes the In-Game Scene
 | |
|     {
 | |
|         networkManager.ServerChangeScene(gameScene);
 | |
|     }
 | |
| 
 | |
|     public bool AuthHost(LobbyPlayer player) // Checks if player is the host
 | |
|     {
 | |
|         // In theory the host should always be the first connected player, which means he is index 0 in the LobbyPlayers-List
 | |
|         if (LobbyPlayers.IndexOf(player) == 0)
 | |
|         {
 | |
|             return true;
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     public void SetTitle(LobbyPlayer player, string text) // the host can set the LobbyTitle
 | |
|     {
 | |
|         if (AuthHost(player))
 | |
|         {
 | |
|             lobbyTitle = text;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void RegisterLobbyPlayer(LobbyPlayer player) // Where a LobbyPlayer can register himself
 | |
|     {
 | |
|         LobbyPlayers.Add(player);
 | |
|     }
 | |
|     public void UnregisterLobbyPlayer(LobbyPlayer player) // Where a LobbyPlayer can unregister himself
 | |
|     {
 | |
|         LobbyPlayers.Remove(player);
 | |
|     }
 | |
| 
 | |
|     /* Checks */
 | |
|     bool CheckAllReady() // Checks if all players are ready
 | |
|     {
 | |
|         // Check if all players are ready (if a player is not ready)
 | |
|         foreach (LobbyPlayer player in LobbyPlayers)
 | |
|         {
 | |
|             if (!player.ready)
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
|         }
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     void CheckLobbyPlayers() // Checks if all LobbyPlayers in the list are still connected (having a GameObject) -> Clears missing players
 | |
|     {
 | |
|         foreach(LobbyPlayer player in LobbyPlayers)
 | |
|         {
 | |
|             if (player == null)
 | |
|             {
 | |
|                 LobbyPlayers.Remove(player);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /* HOOKS */
 | |
|     void ChangeTitle(string oldTitle, string newTitle) // Changes the Title Object
 | |
|     {
 | |
|         GameObject.Find("title").GetComponent<TextMeshProUGUI>().text = newTitle;
 | |
|     }
 | |
|     #endregion
 | |
| }
 | 
