mirror of
				https://github.com/DerTyp7/defrain-shooter-unity.git
				synced 2025-10-29 20:52:10 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			176 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using UnityEngine;
 | |
| using UnityEngine.UI; // For <Button>
 | |
| using Mirror;
 | |
| using TMPro;
 | |
| using UnityEngine.SceneManagement;
 | |
| 
 | |
| /* 
 | |
|  * This class manages the LobbyPlayer, which is the player object while the player is connected only to the lobby
 | |
|  * AND is not IN-GAME (just a text-based player)!   
 | |
|  * this LobbyPlayer will get converted into a Player/GamePlayer for in-game use.
 | |
|  */
 | |
| 
 | |
| public class LobbyPlayer : NetworkBehaviour
 | |
| {
 | |
|     // UI Objects
 | |
|     [SerializeField] Button rdyBtn; // Button Object for listeners
 | |
|     [SerializeField] TextMeshProUGUI rdyButtonText; // Seperatly getting the text, because it's safer instead of "rdy.Btn.getChild..."
 | |
| 
 | |
|     [SerializeField] TextMeshProUGUI usernameText; // Username Text Object -> Where the Username of every LobbyPlayer will get displayed
 | |
|     [SerializeField] TextMeshProUGUI rdyText; // Ready Text Object -> Where the Ready-State of every LobbyPlayer will get displayed
 | |
| 
 | |
|     [SerializeField] Button team1Btn; // Join Team 1 Button
 | |
|     [SerializeField] Button team2Btn; // Join Team 2 Button
 | |
| 
 | |
|     // Sync vars
 | |
|     [SyncVar(hook = "DisplayPlayerName")]
 | |
|     [SerializeField] public string username;
 | |
| 
 | |
|     [SyncVar(hook = "ChangeReadyState")]
 | |
|     public bool ready = false; // is the LobbyPlayer ready?
 | |
| 
 | |
|     [SyncVar(hook = "ChangeDisplayTeam")]
 | |
|     [SerializeField] int teamId = 0; // which team did the player choose?
 | |
| 
 | |
|     // Vars
 | |
|     Lobby lobby;
 | |
| 
 | |
|     public override void OnStartClient()
 | |
|     {
 | |
|         lobby = GameObject.Find("LobbyManager").GetComponent<Lobby>(); // Get the Lobby Object in Scene
 | |
|         if (SceneManager.GetActiveScene().name == "Lobby")
 | |
|         {
 | |
|             lobby.RegisterLobbyPlayer(this); // Register the LobbyPlayer, so the lobby can store him in a list for future use
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             lobby.ChangeToPlayer(this);            
 | |
|         }
 | |
|         
 | |
|     }
 | |
| 
 | |
|     void Start()
 | |
|     {
 | |
|         if (isLocalPlayer && SceneManager.GetActiveScene().name == "Lobby") // Needs to check Scene for itself -> it starts faster than the lobby
 | |
|         {
 | |
|             /*
 | |
|              * The Varaible Saver is used to store vars across different scenes and Player-Objects(LobbyPlayer/GamePlayer).
 | |
|              * In this case it's used to get the values of the players BEFORE they joined the server.
 | |
|              * -> username input field
 | |
|              */
 | |
|             VariableSaver vs = GameObject.FindGameObjectWithTag("VariableSaver").GetComponent<VariableSaver>(); 
 | |
| 
 | |
|             // Find GameObjects in Scene BY NAME
 | |
|             rdyBtn = GameObject.Find("ReadyButton").GetComponent<Button>();
 | |
|             rdyButtonText = GameObject.Find("RdyBtnText").GetComponent<TextMeshProUGUI>();
 | |
|             team1Btn = GameObject.Find("Team1Btn").GetComponent<Button>();
 | |
|             team2Btn = GameObject.Find("Team2Btn").GetComponent<Button>();
 | |
|             
 | |
|             // Set Button Listeners
 | |
|             rdyBtn.onClick.AddListener(CmdChangeReady);
 | |
|             team1Btn.onClick.AddListener(delegate { SelectTeam(1); });
 | |
|             team2Btn.onClick.AddListener(delegate { SelectTeam(2); });
 | |
| 
 | |
|             // Send the username from the local variable saver to the synced var
 | |
|             CmdSendName(vs.username);
 | |
| 
 | |
|             // Set the lobby title -> only works if you're the host
 | |
|             lobby.SetTitle(this, "Game Of\n" + username);
 | |
|         }
 | |
|     }
 | |
|     void Update()
 | |
|     {
 | |
|         if (isLocalPlayer && lobby.isLobbyScene)
 | |
|         {
 | |
|             /*
 | |
|              * Update the "Ready-Button":
 | |
|              * Change the text based on host or client / ready or not ready.
 | |
|              * Adds and removes Start Listener to the hosts button
 | |
|              */
 | |
| 
 | |
|             rdyBtn.onClick.RemoveListener(CmdStartGame); // Clear listener
 | |
|             if (lobby.AuthHost(this) && lobby.allReady) // If all players are ready and your the host
 | |
|             {
 | |
|                 rdyBtn.onClick.AddListener(CmdStartGame);
 | |
|                 rdyButtonText.SetText("Start");
 | |
|             }
 | |
|             else // You are not the host OR not all Players are ready
 | |
|             {
 | |
|                 if (ready) // You are already ready
 | |
|                 {
 | |
|                     rdyButtonText.SetText("Un-Ready");
 | |
|                 }
 | |
|                 else // You  are not ready
 | |
|                 {
 | |
|                     rdyButtonText.SetText("Ready");
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     #region hooks
 | |
|     /* HOOKS */
 | |
|     public void DisplayPlayerName(string oldName, string newName) // Changes the text value of the Player-Username-GameObject
 | |
|     {
 | |
|         Debug.Log("Player changed name from " + oldName + " to " + newName); // Just for debug -> No future use
 | |
|         usernameText.text = newName; // sets the new text in the gameobject
 | |
|     }
 | |
| 
 | |
|     public void ChangeReadyState(bool oldState, bool newState) // Changes the Ready-Text-Object of the player
 | |
|     {
 | |
|         // sets the new text based on the ready state of the player
 | |
|         if (newState)
 | |
|         {
 | |
|             rdyText.text = "Ready";
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             rdyText.text = "Not Ready";
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void ChangeDisplayTeam(int oldTeamId, int newTeamId) // moves the player into the correct team-list
 | |
|     {
 | |
|         // moves the player based on which team he has choosen
 | |
|         if (newTeamId == 1)
 | |
|         {
 | |
|             gameObject.transform.parent = GameObject.FindGameObjectWithTag("Team1List").transform;
 | |
|         }
 | |
|         else if (newTeamId == 2)
 | |
|         {
 | |
|             gameObject.transform.parent = GameObject.FindGameObjectWithTag("Team2List").transform;
 | |
|         }
 | |
|     }
 | |
|     #endregion
 | |
| 
 | |
|     #region commands
 | |
|     /* COMMANDS */
 | |
|     [Command]
 | |
|     void CmdStartGame()
 | |
|     {
 | |
|         if (lobby.AuthHost(this))
 | |
|         {
 | |
|             lobby.StartGame();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     [Command]
 | |
|     void CmdSendName(string playerName) //Send/Set the username from local to the synced var
 | |
|     {
 | |
|         username = playerName;
 | |
|     }
 | |
| 
 | |
|     [Command]
 | |
|     void CmdChangeReady() // Updates the Ready-State of the Player (Synced Var)
 | |
|     {
 | |
|         ready = !ready;
 | |
|     }
 | |
| 
 | |
|     [Command]
 | |
|     void SelectTeam(int _teamId) // Updates the team of the Player (Synced Var)
 | |
|     {
 | |
|         teamId = _teamId;
 | |
|     }
 | |
|     #endregion
 | |
| }
 | 
