lib-unity-tutorial-network-m2h-Assets-Example3-GameLobby.js / js
/* * This file is part of the Unity networking tutorial by M2H (http://www.M2H.nl) * The original author of this code is Mike Hergaarden, even though some small parts * are copied from the Unity tutorials/manuals. * Feel free to use this code for your own projects, drop us a line if you made something exciting! */ #pragma strict var serverPort : int = 45671; var gameName : String = "Example3_Lobby"; private var launchingGame : boolean = false; private var showMenu : boolean = false; private var playerList : Array = new Array(); class PlayerInfo { var username : String; var player : NetworkPlayer; } private var serverMaxPlayers : int =4; private var serverTitle : String = "Loading.."; private var serverPasswordProtected : boolean = false; private var playerName : String = ""; private var mainMenuScript : MainMenu; function Awake(){ showMenu=false; } function Start(){ mainMenuScript = MainMenu.SP; } function EnableLobby(){ playerName = PlayerPrefs.GetString("playerName"); lastRegTime=Time.time-3600; launchingGame=false; showMenu=true; var chat : LobbyChat = GetComponent(LobbyChat); chat.ShowChatWindow(); } function OnGUI () { if(!showMenu){ return; } //Back to main menu if(GUI.Button(Rect(40,10,150,20), "Back to main menu")){ leaveLobby(); } if(launchingGame){ launchingGameGUI(); } else if(!Network.isServer && !Network.isClient){ //First set player count, server name and password option hostSettings(); } else { //Show the lobby showLobby(); } } function leaveLobby(){ //Disconnect fdrom host, or shotduwn host if (Network.isServer || Network.isClient){ if(Network.isServer){ MasterServer.UnregisterHost(); } Network.Disconnect(); yield WaitForSeconds(0.3); } var chat : LobbyChat = GetComponent(LobbyChat); chat.CloseChatWindow(); mainMenuScript.OpenMenu("multiplayer"); showMenu=false; } private var hostSetting_title : String = "No server title"; private var hostSetting_players : int = 4; private var hostSetting_password : String = ""; function hostSettings(){ GUI.BeginGroup (Rect (Screen.width/2-175, Screen.height/2-75-50, 350, 150)); GUI.Box (Rect (0,0,350,150), "Server options"); GUI.Label (Rect (10,20,150,20), "Server title"); hostSetting_title = GUI.TextField (Rect (175,20,160,20), hostSetting_title); GUI.Label (Rect (10,40,150,20), "Max. players (2-32)"); hostSetting_players = parseInt(GUI.TextField (Rect (175,40,160,20), hostSetting_players+"")); GUI.Label (Rect (10,60,150,50), "Password\n"); hostSetting_password = (GUI.TextField (Rect (175,60,160,20), hostSetting_password)); if(GUI.Button (Rect (100,115,150,20), "Go to lobby")){ StartHost(hostSetting_password, parseInt(hostSetting_players), hostSetting_title); } GUI.EndGroup(); } function StartHost(password : String, players : int, serverName : String){ if(players<1){ players=1; } if(players>=32){ players=32; } if(password && password!=""){ serverPasswordProtected = true; Network.incomingPassword = password; }else{ serverPasswordProtected = false; Network.incomingPassword = ""; } serverTitle = serverName; Network.InitializeSecurity(); Network.InitializeServer((players-1), serverPort); } function showLobby(){ var players = ""; var currentPlayerCount : int =0; for (var playerInstance : PlayerInfo in playerList) { players=playerInstance.username+"\n"+players; currentPlayerCount++; } GUI.BeginGroup (Rect (Screen.width/2-200, Screen.height/2-200, 400, 180)); GUI.Box (Rect (0,0,400,200), "Game lobby"); var pProtected="no"; if(serverPasswordProtected){ pProtected="yes"; } GUI.Label (Rect (10,20,150,20), "Password protected"); GUI.Label (Rect (150,20,100,100), pProtected); GUI.Label (Rect (10,40,150,20), "Server title"); GUI.Label (Rect (150,40,100,100), serverTitle); GUI.Label (Rect (10,60,150,20), "Players"); GUI.Label (Rect (150,60,100,100), currentPlayerCount+"/"+serverMaxPlayers); GUI.Label (Rect (10,80,150,20), "Current players"); GUI.Label (Rect (150,80,100,100), players); if(Network.isServer){ if(GUI.Button (Rect (25,140,150,20), "Start the game")){ HostLaunchGame(); } }else{ GUI.Label (Rect (25,140,200,40), "Waiting for the server to start the game.."); } GUI.EndGroup(); } function OnConnectedToServer(){ //Called on client //Send everyone this clients data playerList = new Array(); playerName = PlayerPrefs.GetString("playerName"); networkView.RPC("addPlayer",RPCMode.AllBuffered, Network.player, playerName); } function OnServerInitialized(){ //Called on host //Add hosts own data to the playerlist playerList = new Array(); networkView.RPC("addPlayer",RPCMode.AllBuffered, Network.player, playerName); var pProtected : boolean = false; if(Network.incomingPassword && Network.incomingPassword!=""){ pProtected=true; } var maxPlayers : int = Network.maxConnections+1; networkView.RPC("setServerSettings",RPCMode.AllBuffered, pProtected, maxPlayers, hostSetting_title); } var lastRegTime : float = -60; function Update(){ if(Network.isServer && lastRegTime<Time.time-60){ lastRegTime=Time.time; MasterServer.RegisterHost(gameName,hostSetting_title, "No description"); } } @RPC function setServerSettings(password : boolean, maxPlayers : int, newSrverTitle : String){ serverMaxPlayers = maxPlayers; serverTitle = newSrverTitle; serverPasswordProtected = password; } function OnPlayerDisconnected(player: NetworkPlayer) { //Called on host //Remove player information from playerlist networkView.RPC("playerLeft", RPCMode.All, player); var chat : LobbyChat = GetComponent(LobbyChat); chat.addGameChatMessage("A player left the lobby"); } @RPC function addPlayer(player : NetworkPlayer, username : String){ Debug.Log("got addplayer"+username); var playerInstance : PlayerInfo = new PlayerInfo(); playerInstance.player = player; playerInstance.username = username; playerList.Add(playerInstance); } @RPC function playerLeft(player : NetworkPlayer){ var deletePlayer : PlayerInfo; for (var playerInstance : PlayerInfo in playerList) { if (player == playerInstance.player) { deletePlayer = playerInstance; } } playerList.Remove(deletePlayer); Network.RemoveRPCs(player); Network.DestroyPlayerObjects(player); } function HostLaunchGame(){ if(!Network.isServer){ return; } // Don't allow any more players Network.maxConnections = -1; MasterServer.UnregisterHost(); networkView.RPC("launchGame",RPCMode.All); } @RPC function launchGame(){ Network.isMessageQueueRunning=false; launchingGame=true; } function launchingGameGUI(){ //Show loading progress, ADD LOADINGSCREEN? GUI.Box(Rect(Screen.width/4+180,Screen.height/2-30,280,50), ""); if(Application.CanStreamedLevelBeLoaded ((Application.loadedLevel+1))){ GUI.Label(Rect(Screen.width/4+200,Screen.height/2-25,285,150), "Loaded, starting the game!"); Application.LoadLevel( (Application.loadedLevel+1) ); }else{ GUI.Label(Rect(Screen.width/4+200,Screen.height/2-25,285,150), "Starting..Loading the game: "+Mathf.Floor(Application.GetStreamProgressForLevel((Application.loadedLevel+1))*100)+" %"); } }
(C) Æliens 04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.