From 2ccec93bb7bac0d26e66f695f3d378fd0371ceb4 Mon Sep 17 00:00:00 2001 From: LPLafontaineB Date: Wed, 6 Jul 2022 15:14:41 -0400 Subject: [PATCH 1/5] players now visible and playable when late-joining --- Basic/Invaders/Assets/Prefabs/player.prefab | 1 + .../Invaders/Assets/Scripts/PlayerControl.cs | 32 ++++++------------- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/Basic/Invaders/Assets/Prefabs/player.prefab b/Basic/Invaders/Assets/Prefabs/player.prefab index c2d78b8a1..9aa0d647d 100644 --- a/Basic/Invaders/Assets/Prefabs/player.prefab +++ b/Basic/Invaders/Assets/Prefabs/player.prefab @@ -110,6 +110,7 @@ MonoBehaviour: m_HitParticleSystem: {fileID: 2274621649305592229, guid: 4bf8467f048bdca478f6702a5286ef53, type: 3} m_PlayerColorInGame: {r: 0.32941177, g: 1, b: 0.19215687, a: 1} + m_PlayerVisual: {fileID: 21200000} --- !u!61 &6100000 BoxCollider2D: m_ObjectHideFlags: 0 diff --git a/Basic/Invaders/Assets/Scripts/PlayerControl.cs b/Basic/Invaders/Assets/Scripts/PlayerControl.cs index c0e18b31b..1169be99e 100644 --- a/Basic/Invaders/Assets/Scripts/PlayerControl.cs +++ b/Basic/Invaders/Assets/Scripts/PlayerControl.cs @@ -26,7 +26,6 @@ public class PlayerControl : NetworkBehaviour [SerializeField] Color m_PlayerColorInGame; - private SceneTransitionHandler.SceneStates m_CurrentSceneState; private bool m_HasGameStarted; private bool m_IsAlive = true; @@ -36,6 +35,7 @@ public class PlayerControl : NetworkBehaviour private GameObject m_MyBullet; private ClientRpcParams m_OwnerRPCParams; + [SerializeField] private SpriteRenderer m_PlayerVisual; private NetworkVariable m_Score = new NetworkVariable(0); @@ -46,15 +46,9 @@ private void Awake() m_HasGameStarted = false; } - private void Start() - { - m_PlayerVisual = GetComponent(); - if (m_PlayerVisual != null) m_PlayerVisual.color = Color.clear; - } - private void Update() { - switch (m_CurrentSceneState) + switch (SceneTransitionHandler.sceneTransitionHandler.GetCurrentSceneState()) { case SceneTransitionHandler.SceneStates.Ingame: { @@ -94,21 +88,14 @@ public override void OnNetworkDespawn() } } - private void SceneTransitionHandler_clientLoadedScene(ulong clientId) - { - SceneStateChangedClientRpc(m_CurrentSceneState); - } - - [ClientRpc] - private void SceneStateChangedClientRpc(SceneTransitionHandler.SceneStates state) + private void SceneTransitionHandler_sceneStateChanged(SceneTransitionHandler.SceneStates newState) { - if (!IsServer) SceneTransitionHandler.sceneTransitionHandler.SetSceneState(state); + UpdateColor(); } - private void SceneTransitionHandler_sceneStateChanged(SceneTransitionHandler.SceneStates newState) + private void UpdateColor() { - m_CurrentSceneState = newState; - if (m_CurrentSceneState == SceneTransitionHandler.SceneStates.Ingame) + if (SceneTransitionHandler.sceneTransitionHandler.GetCurrentSceneState() == SceneTransitionHandler.SceneStates.Ingame) { if (m_PlayerVisual != null) m_PlayerVisual.color = m_PlayerColorInGame; } @@ -133,10 +120,9 @@ public override void OnNetworkSpawn() InvadersGame.OnSingletonReady += SubscribeToDelegatesAndUpdateValues; else SubscribeToDelegatesAndUpdateValues(); - - if (IsServer) SceneTransitionHandler.sceneTransitionHandler.OnClientLoadedScene += SceneTransitionHandler_clientLoadedScene; - + SceneTransitionHandler.sceneTransitionHandler.OnSceneStateChanged += SceneTransitionHandler_sceneStateChanged; + UpdateColor(); } private void SubscribeToDelegatesAndUpdateValues() @@ -149,6 +135,8 @@ private void SubscribeToDelegatesAndUpdateValues() InvadersGame.Singleton.SetScore(m_Score.Value); InvadersGame.Singleton.SetLives(m_Lives.Value); } + + m_HasGameStarted = InvadersGame.Singleton.hasGameStarted.Value; } public void IncreasePlayerScore(int amount) From 4acfed8caffd9d76f7535682262fcc162a5f7ea4 Mon Sep 17 00:00:00 2001 From: LPLafontaineB Date: Thu, 7 Jul 2022 10:23:12 -0400 Subject: [PATCH 2/5] removed unneeded TryGetComponents --- Basic/Invaders/Assets/Scripts/PlayerControl.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Basic/Invaders/Assets/Scripts/PlayerControl.cs b/Basic/Invaders/Assets/Scripts/PlayerControl.cs index 1169be99e..0ddd14459 100644 --- a/Basic/Invaders/Assets/Scripts/PlayerControl.cs +++ b/Basic/Invaders/Assets/Scripts/PlayerControl.cs @@ -153,8 +153,8 @@ private void OnGameStartedChanged(bool previousValue, bool newValue) private void OnLivesChanged(int previousAmount, int currentAmount) { // Hide graphics client side upon death - if (currentAmount <= 0 && IsClient && TryGetComponent(out var spriteRenderer)) - spriteRenderer.enabled = false; + if (currentAmount <= 0 && IsClient) + m_PlayerVisual.enabled = false; if (!IsOwner) return; Debug.LogFormat("Lives {0} ", currentAmount); @@ -225,8 +225,7 @@ public void HitByBullet() // Hide graphics of this player object server-side. Note we don't want to destroy the object as it // may stop the RPC's from reaching on the other side, as there is only one player controlled object - if (TryGetComponent(out var spriteRenderer)) - spriteRenderer.enabled = false; + m_PlayerVisual.enabled = false; } else { From c213c7fc0d640e66bf1491345bc8a582b47d476d Mon Sep 17 00:00:00 2001 From: LPLafontaineB Date: Thu, 7 Jul 2022 10:23:34 -0400 Subject: [PATCH 3/5] simplified registration of NetworkSceneManager callbacks --- Basic/Invaders/Assets/Scripts/MenuControl.cs | 1 + .../Assets/Scripts/SceneTransitionHandler.cs | 20 ++++++++++--------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Basic/Invaders/Assets/Scripts/MenuControl.cs b/Basic/Invaders/Assets/Scripts/MenuControl.cs index d0158748e..b13d34bca 100644 --- a/Basic/Invaders/Assets/Scripts/MenuControl.cs +++ b/Basic/Invaders/Assets/Scripts/MenuControl.cs @@ -20,6 +20,7 @@ public void StartLocalGame() if (utpTransport) m_HostIpInput.text = "127.0.0.1"; if (NetworkManager.Singleton.StartHost()) { + SceneTransitionHandler.sceneTransitionHandler.RegisterCallbacks(); SceneTransitionHandler.sceneTransitionHandler.SwitchScene(m_LobbySceneName); } else diff --git a/Basic/Invaders/Assets/Scripts/SceneTransitionHandler.cs b/Basic/Invaders/Assets/Scripts/SceneTransitionHandler.cs index aaa3fe739..c3432144c 100644 --- a/Basic/Invaders/Assets/Scripts/SceneTransitionHandler.cs +++ b/Basic/Invaders/Assets/Scripts/SceneTransitionHandler.cs @@ -87,6 +87,15 @@ private void Start() } } + /// + /// Registers callbacks to the NetworkSceneManager. This should be called when starting the server + /// + public void RegisterCallbacks() + { + NetworkManager.Singleton.SceneManager.OnLoadComplete += OnLoadComplete; + + } + /// /// Switches to a new scene /// @@ -96,8 +105,6 @@ public void SwitchScene(string scenename) if(NetworkManager.Singleton.IsListening) { m_numberOfClientLoaded = 0; - NetworkManager.Singleton.SceneManager.OnLoadComplete += OnLoadComplete; - NetworkManager.Singleton.SceneManager.OnLoadEventCompleted += OnLoadEventCompleted; NetworkManager.Singleton.SceneManager.LoadScene(scenename, LoadSceneMode.Single); } else @@ -106,18 +113,12 @@ public void SwitchScene(string scenename) } } - void OnLoadComplete(ulong clientId, string sceneName, LoadSceneMode loadSceneMode) + private void OnLoadComplete(ulong clientId, string sceneName, LoadSceneMode loadSceneMode) { m_numberOfClientLoaded += 1; OnClientLoadedScene?.Invoke(clientId); } - void OnLoadEventCompleted(string sceneName, LoadSceneMode loadSceneMode, List clientsCompleted, List clientsTimedOut) - { - NetworkManager.Singleton.SceneManager.OnLoadComplete -= OnLoadComplete; - NetworkManager.Singleton.SceneManager.OnLoadEventCompleted -= OnLoadEventCompleted; - } - public bool AllClientsAreLoaded() { return m_numberOfClientLoaded == NetworkManager.Singleton.ConnectedClients.Count; @@ -129,6 +130,7 @@ public bool AllClientsAreLoaded() /// public void ExitAndLoadStartMenu() { + NetworkManager.Singleton.SceneManager.OnLoadComplete -= OnLoadComplete; OnClientLoadedScene = null; SetSceneState(SceneStates.Start); SceneManager.LoadScene(1); From 69954a9252fbf241b5ce7e28a748040c04d49fad Mon Sep 17 00:00:00 2001 From: LPLafontaineB Date: Thu, 7 Jul 2022 11:32:23 -0400 Subject: [PATCH 4/5] Replicating timer on newly connected clients --- Basic/Invaders/Assets/Scripts/InvadersGame.cs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/Basic/Invaders/Assets/Scripts/InvadersGame.cs b/Basic/Invaders/Assets/Scripts/InvadersGame.cs index 3c61d5b95..024444b4d 100644 --- a/Basic/Invaders/Assets/Scripts/InvadersGame.cs +++ b/Basic/Invaders/Assets/Scripts/InvadersGame.cs @@ -147,6 +147,8 @@ public override void OnNetworkDespawn() m_Enemies.Clear(); m_Shields.Clear(); } + + NetworkManager.OnClientConnectedCallback -= OnClientConnected; } internal static event Action OnSingletonReady; @@ -183,9 +185,23 @@ public override void OnNetworkSpawn() //and in turn makes the players visible and allows for the players to be controlled. SceneTransitionHandler.sceneTransitionHandler.SetSceneState(SceneTransitionHandler.SceneStates.Ingame); + if (IsServer) + { + NetworkManager.OnClientConnectedCallback += OnClientConnected; + } + base.OnNetworkSpawn(); } + private void OnClientConnected(ulong clientId) + { + if (m_ReplicatedTimeSent) + { + // Send the RPC only to the newly connected client + SetReplicatedTimeRemainingClientRPC(m_TimeRemaining, new ClientRpcParams {Send = new ClientRpcSendParams{TargetClientIds = new List() {clientId}}}); + } + } + /// /// ShouldStartCountDown /// Determines when the countdown should start @@ -217,8 +233,9 @@ private bool ShouldStartCountDown() /// will deal with updating it. For that, we use a ClientRPC /// /// + /// [ClientRpc] - private void SetReplicatedTimeRemainingClientRPC(float delayedStartTime) + private void SetReplicatedTimeRemainingClientRPC(float delayedStartTime, ClientRpcParams clientRpcParams = new ClientRpcParams()) { // See the ShouldStartCountDown method for when the server updates the value if (m_TimeRemaining == 0) From c0124ab761c810816c2fe73607b144bfb17716b6 Mon Sep 17 00:00:00 2001 From: LPLafontaineB Date: Tue, 12 Jul 2022 15:59:16 -0400 Subject: [PATCH 5/5] using NetworkManager.Singleton for consistency --- Basic/Invaders/Assets/Scripts/InvadersGame.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Basic/Invaders/Assets/Scripts/InvadersGame.cs b/Basic/Invaders/Assets/Scripts/InvadersGame.cs index 024444b4d..e4239b340 100644 --- a/Basic/Invaders/Assets/Scripts/InvadersGame.cs +++ b/Basic/Invaders/Assets/Scripts/InvadersGame.cs @@ -148,7 +148,7 @@ public override void OnNetworkDespawn() m_Shields.Clear(); } - NetworkManager.OnClientConnectedCallback -= OnClientConnected; + NetworkManager.Singleton.OnClientConnectedCallback -= OnClientConnected; } internal static event Action OnSingletonReady; @@ -187,7 +187,7 @@ public override void OnNetworkSpawn() if (IsServer) { - NetworkManager.OnClientConnectedCallback += OnClientConnected; + NetworkManager.Singleton.OnClientConnectedCallback += OnClientConnected; } base.OnNetworkSpawn();