diff --git a/Project Undercover/Assets/Resources/RoomPanel.prefab b/Project Undercover/Assets/Resources/RoomPanel.prefab index 7e5b7a3..74b9b71 100644 --- a/Project Undercover/Assets/Resources/RoomPanel.prefab +++ b/Project Undercover/Assets/Resources/RoomPanel.prefab @@ -129,7 +129,18 @@ MonoBehaviour: m_TargetGraphic: {fileID: 114067761447900238} m_OnClick: m_PersistentCalls: - m_Calls: [] + m_Calls: + - m_Target: {fileID: 114427775473896594} + m_MethodName: RoomSelected + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null --- !u!114 &114418020196636122 @@ -178,6 +189,7 @@ MonoBehaviour: m_EditorClassIdentifier: roomNameText: {fileID: 114647180428938562} numPlayersText: {fileID: 114418020196636122} + launcher: {fileID: 0} --- !u!114 &114647180428938562 MonoBehaviour: m_ObjectHideFlags: 1 diff --git a/Project Undercover/Assets/Scenes/Launcher.unity b/Project Undercover/Assets/Scenes/Launcher.unity index efd86c9..48001e6 100644 --- a/Project Undercover/Assets/Scenes/Launcher.unity +++ b/Project Undercover/Assets/Scenes/Launcher.unity @@ -276,7 +276,6 @@ RectTransform: m_Children: - {fileID: 1035400198} - {fileID: 580129344} - - {fileID: 1051807739} - {fileID: 1174787944} - {fileID: 1009736659} m_Father: {fileID: 1435142555} @@ -784,80 +783,6 @@ CanvasRenderer: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 606582670} ---- !u!1 &798783880 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 798783881} - - component: {fileID: 798783883} - - component: {fileID: 798783882} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &798783881 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 798783880} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 1051807739} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &798783882 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 798783880} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_FontData: - m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 - m_FontStyle: 0 - m_BestFit: 0 - m_MinSize: 10 - m_MaxSize: 40 - m_Alignment: 4 - m_AlignByGeometry: 0 - m_RichText: 1 - m_HorizontalOverflow: 0 - m_VerticalOverflow: 0 - m_LineSpacing: 1 - m_Text: Join Room ---- !u!222 &798783883 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 798783880} --- !u!1 &871952079 GameObject: m_ObjectHideFlags: 0 @@ -983,12 +908,12 @@ RectTransform: m_Children: - {fileID: 1139586349} m_Father: {fileID: 41482507} - m_RootOrder: 4 + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} m_AnchoredPosition: {x: 0, y: 10} - m_SizeDelta: {x: 160, y: 30} + m_SizeDelta: {x: 200, y: 30} m_Pivot: {x: 0.5, y: 0} --- !u!114 &1009736660 MonoBehaviour: @@ -1207,124 +1132,13 @@ MonoBehaviour: m_HorizontalOverflow: 1 m_VerticalOverflow: 1 m_LineSpacing: 1 - m_Text: Available Rooms + m_Text: Rooms --- !u!222 &1035400200 CanvasRenderer: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1035400197} ---- !u!1 &1051807738 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - serializedVersion: 5 - m_Component: - - component: {fileID: 1051807739} - - component: {fileID: 1051807742} - - component: {fileID: 1051807741} - - component: {fileID: 1051807740} - m_Layer: 5 - m_Name: JoinRoomButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1051807739 -RectTransform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1051807738} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: - - {fileID: 798783881} - m_Father: {fileID: 41482507} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0} - m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: 70, y: 70} - m_SizeDelta: {x: 120, y: 30} - m_Pivot: {x: 0.5, y: 0} ---- !u!114 &1051807740 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1051807738} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1051807741} - m_OnClick: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, - Culture=neutral, PublicKeyToken=null ---- !u!114 &1051807741 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1051807738} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, - Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 ---- !u!222 &1051807742 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} - m_GameObject: {fileID: 1051807738} --- !u!1 &1139586348 GameObject: m_ObjectHideFlags: 0 @@ -1392,7 +1206,7 @@ MonoBehaviour: m_HorizontalOverflow: 0 m_VerticalOverflow: 0 m_LineSpacing: 1 - m_Text: Create Room + m_Text: Create New Room --- !u!222 &1139586351 CanvasRenderer: m_ObjectHideFlags: 0 @@ -1551,11 +1365,11 @@ RectTransform: m_Children: - {fileID: 1365427910} m_Father: {fileID: 41482507} - m_RootOrder: 3 + m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: -70, y: 70} + m_AnchoredPosition: {x: 0, y: 70} m_SizeDelta: {x: 120, y: 30} m_Pivot: {x: 0.5, y: 0} --- !u!114 &1174787945 diff --git a/Project Undercover/Assets/Scripts/Launcher.cs b/Project Undercover/Assets/Scripts/Launcher.cs index f14ee7e..755c5d0 100644 --- a/Project Undercover/Assets/Scripts/Launcher.cs +++ b/Project Undercover/Assets/Scripts/Launcher.cs @@ -1,125 +1,121 @@ using UnityEngine; using UnityEngine.UI; -namespace Com.MyCompany.MyGame + +public class Launcher : Photon.PunBehaviour { - public class Launcher : Photon.PunBehaviour + public byte MaxPlayersPerRoom = 4; + + [Tooltip("The Ui Panel to let the user enter name, connect and play")] + public GameObject controlPanel; + + [Tooltip("The UI Label to inform the user that the connection is in progress")] + public Text progressLabel; + + public GameObject nameSelectorPanel, roomSelectorPanel; + + public GameObject availableRoomsPanel; + + public GameObject roomStatusPanelPrefab; + + string _gameVersion = "1"; + bool isConnecting; + + void Awake() { - public byte MaxPlayersPerRoom = 4; + // #Critical + // we don't join the lobby. There is no need to join a lobby to get the list of rooms. + PhotonNetwork.autoJoinLobby = false; - [Tooltip("The Ui Panel to let the user enter name, connect and play")] - public GameObject controlPanel; + // #Critical + // This makes sure we can use PhotonNetwork.LoadLevel() on the master client + // and all clients in the same room sync their level automatically + PhotonNetwork.automaticallySyncScene = true; + } - [Tooltip("The UI Label to inform the user that the connection is in progress")] - public Text progressLabel; + void Start() + { + controlPanel.SetActive(true); + } - public GameObject nameSelectorPanel, roomSelectorPanel; - - public GameObject availableRoomsPanel; - - public GameObject roomStatusPanelPrefab; - - string _gameVersion = "1"; - /// - /// Keep track of the current process. Since connection is asynchronous and is based on several callbacks from Photon, - /// we need to keep track of this to properly adjust the behavior when we receive call back by Photon. - /// Typically this is used for the OnConnectedToMaster() callback. - /// - bool isConnecting; - - void Awake() + public void Connect() + { + isConnecting = true; + progressLabel.text = "Connecting..."; + if (PhotonNetwork.connected) { - // #Critical - // we don't join the lobby. There is no need to join a lobby to get the list of rooms. - PhotonNetwork.autoJoinLobby = false; - - - // #Critical - // This makes sure we can use PhotonNetwork.LoadLevel() on the master client - // and all clients in the same room sync their level automatically - PhotonNetwork.automaticallySyncScene = true; + PhotonNetwork.JoinLobby(); } - - void Start() + else { - controlPanel.SetActive(true); - } - - public void Connect() - { - isConnecting = true; - progressLabel.text = "Connecting..."; - // we check if we are connected or not, we join if we are , else we initiate the connection to the server. - if (PhotonNetwork.connected) - { - PhotonNetwork.JoinLobby(); - } - else - { - PhotonNetwork.ConnectUsingSettings(_gameVersion); - } - } - - public override void OnConnectedToMaster() - { - Debug.Log("Launcher: OnConnectedToMaster() was called by PUN"); - // we don't want to do anything if we are not attempting to join a room. - // this case where isConnecting is false is typically when you lost or quit the game, when this level is loaded, OnConnectedToMaster will be called, in that case - // we don't want to do anything. - if (isConnecting) - { - // #Critical: The first we try to do is to join a potential existing room. If there is, good, else, we'll be called back with OnPhotonRandomJoinFailed() - PhotonNetwork.JoinLobby(); - //PhotonNetwork.JoinRandomRoom(); - } - } - - public override void OnJoinedLobby() - { - Debug.Log("Launcher: Entered Lobby"); - nameSelectorPanel.SetActive(false); - roomSelectorPanel.SetActive(true); - RefreshRoomsList(); - } - - public void RefreshRoomsList() - { - RoomInfo[] roomsList = PhotonNetwork.GetRoomList(); - Debug.Log("Number of rooms available: " + roomsList.Length); - foreach (Transform child in availableRoomsPanel.transform) - { - Destroy(child.gameObject); - } - foreach (RoomInfo roomInfo in roomsList) - { - var roomStatusPanel = Instantiate(roomStatusPanelPrefab, availableRoomsPanel.transform); - roomStatusPanel.GetComponent().SetInformation(roomInfo); - } - } - - public void CreateNewRoom() - { - PhotonNetwork.CreateRoom(null, new RoomOptions() { MaxPlayers = MaxPlayersPerRoom }, null); - } - - public override void OnDisconnectedFromPhoton() - { - Debug.LogWarning("Launcher: OnDisconnectedFromPhoton() was called by PUN"); - } - - /* - public override void OnPhotonRandomJoinFailed(object[] codeAndMsg) - { - Debug.Log("Launcher:OnPhotonRandomJoinFailed() was called by PUN. No random room available, so we create one."); - // #Critical: we failed to join a random room, maybe none exists or they are all full. No worries, we create a new room. - PhotonNetwork.CreateRoom(null, new RoomOptions() { MaxPlayers = MaxPlayersPerRoom }, null); - }*/ - - public override void OnJoinedRoom() - { - Debug.Log("Launcher: OnJoinedRoom() called by PUN. Now this client is in a room."); - // #Critical: We only load if we are the first player, else we rely on PhotonNetwork.automaticallySyncScene to sync our instance scene. - PhotonNetwork.LoadLevel("Lobby"); + PhotonNetwork.ConnectUsingSettings(_gameVersion); } } + + public override void OnConnectedToMaster() + { + Debug.Log("Launcher: OnConnectedToMaster() was called by PUN"); + if (isConnecting) + { + PhotonNetwork.JoinLobby(); + } + } + + public override void OnJoinedLobby() + { + Debug.Log("Launcher: Entered Lobby"); + nameSelectorPanel.SetActive(false); + roomSelectorPanel.SetActive(true); + RefreshRoomsList(); + } + + public override void OnPhotonJoinRoomFailed(object[] codeAndMsg) + { + RefreshRoomsList(); + } + + public override void OnReceivedRoomListUpdate() + { + RefreshRoomsList(); + } + + public void RefreshRoomsList() + { + RoomInfo[] roomsList = PhotonNetwork.GetRoomList(); + foreach (Transform child in availableRoomsPanel.transform) + { + Destroy(child.gameObject); + } + foreach (RoomInfo roomInfo in roomsList) + { + var panel = Instantiate(roomStatusPanelPrefab, availableRoomsPanel.transform); + var roomStatusPanel = panel.GetComponent(); + roomStatusPanel.SetInformation(roomInfo); + roomStatusPanel.launcher = this; + } + } + + public void RoomSelected(RoomStatusPanel panel) + { + PhotonNetwork.JoinRoom(panel.GetRoomName()); + } + + public void CreateNewRoom() + { + string roomName = PhotonNetwork.playerName + "'s Room"; + PhotonNetwork.CreateRoom(roomName, new RoomOptions() { MaxPlayers = MaxPlayersPerRoom }, null); + } + + public override void OnDisconnectedFromPhoton() + { + Debug.LogWarning("Launcher: OnDisconnectedFromPhoton() was called by PUN"); + } + + public override void OnJoinedRoom() + { + Debug.Log("Launcher: OnJoinedRoom() called by PUN. Now this client is in a room."); + // #Critical: We only load if we are the first player, else we rely on PhotonNetwork.automaticallySyncScene to sync our instance scene. + PhotonNetwork.LoadLevel("Lobby"); + } } + diff --git a/Project Undercover/Assets/Scripts/RoomStatusPanel.cs b/Project Undercover/Assets/Scripts/RoomStatusPanel.cs index 25824e6..d7aa506 100644 --- a/Project Undercover/Assets/Scripts/RoomStatusPanel.cs +++ b/Project Undercover/Assets/Scripts/RoomStatusPanel.cs @@ -7,10 +7,31 @@ public class RoomStatusPanel : MonoBehaviour { public Text roomNameText; public Text numPlayersText; + public Launcher launcher; + private int numPlayers, maxPlayers; public void SetInformation(RoomInfo info) { roomNameText.text = info.Name; - numPlayersText.text = info.PlayerCount.ToString() + "/" + info.MaxPlayers.ToString(); + numPlayers = info.PlayerCount; + maxPlayers = info.MaxPlayers; + numPlayersText.text = numPlayers.ToString() + "/" + maxPlayers.ToString(); + if (numPlayers == maxPlayers) + { + numPlayersText.color = Color.red; + } + } + + public void RoomSelected() + { + if (numPlayers <= maxPlayers) + { + launcher.RoomSelected(this); + } + } + + public string GetRoomName() + { + return roomNameText.text; } }