mirror of
				https://github.com/DerTyp7/defrain-shooter-unity.git
				synced 2025-10-30 21:17:09 +01:00 
			
		
		
		
	Merging
This commit is contained in:
		
							
								
								
									
										158
									
								
								Assets/Scripts/Lobby/Lobby.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								Assets/Scripts/Lobby/Lobby.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,158 @@ | ||||
| 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 | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 DerTyp187
					DerTyp187