From 2732458ea9ed5a5053096e593c37e48524475124 Mon Sep 17 00:00:00 2001 From: NoelStephensUnity Date: Tue, 17 Oct 2023 17:07:30 -0500 Subject: [PATCH 1/3] fix Assure GenericNetworkObjectBehaviour is properly reset when despawned (for re-use in pool). --- .../Manual/Scripts/GenericNetworkObjectBehaviour.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/testproject/Assets/Tests/Manual/Scripts/GenericNetworkObjectBehaviour.cs b/testproject/Assets/Tests/Manual/Scripts/GenericNetworkObjectBehaviour.cs index 137f33bc86..c1135b1c8b 100644 --- a/testproject/Assets/Tests/Manual/Scripts/GenericNetworkObjectBehaviour.cs +++ b/testproject/Assets/Tests/Manual/Scripts/GenericNetworkObjectBehaviour.cs @@ -136,6 +136,18 @@ private void Update() } } + public override void OnNetworkDespawn() + { + if (m_RigidBody != null) + { + m_RigidBody.Sleep(); + m_RigidBody.transform.position = Vector3.zero; + } + m_Direction = Vector3.zero; + + base.OnNetworkDespawn(); + } + [HideInInspector] public bool HasHandler; From 4ad25c43a9ff72fc0a6de4091bced40f9a0b3bf9 Mon Sep 17 00:00:00 2001 From: NoelStephensUnity Date: Tue, 17 Oct 2023 17:09:08 -0500 Subject: [PATCH 2/3] fix set rotation and position to the pool's rotation and position when putting the object back into the pool in order to avoid the momentary "blip" from last position when despawned. --- testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs index 3035cfcfc0..405c86f81a 100644 --- a/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs +++ b/testproject/Assets/Tests/Manual/Scripts/NetworkPrefabPool.cs @@ -623,6 +623,8 @@ public void Destroy(NetworkObject networkObject) var genericBehaviour = networkObject.gameObject.GetComponent(); if (genericBehaviour.IsRegisteredPoolObject) { + networkObject.transform.position = transform.position; + networkObject.transform.rotation = transform.rotation; networkObject.gameObject.SetActive(false); } else From 4d6ae9b0f4ff1a0b2efc2b6af75d867b2d4e759a Mon Sep 17 00:00:00 2001 From: NoelStephensUnity Date: Wed, 18 Oct 2023 17:31:22 -0500 Subject: [PATCH 3/3] update adding a potentially useful example script --- .../ShutdownWhenNoClients.cs | 67 +++++++++++++++++++ .../ShutdownWhenNoClients.cs.meta | 11 +++ 2 files changed, 78 insertions(+) create mode 100644 testproject/Assets/Tests/Manual/SceneTransitioningAdditive/ShutdownWhenNoClients.cs create mode 100644 testproject/Assets/Tests/Manual/SceneTransitioningAdditive/ShutdownWhenNoClients.cs.meta diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/ShutdownWhenNoClients.cs b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/ShutdownWhenNoClients.cs new file mode 100644 index 0000000000..df43cdf462 --- /dev/null +++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/ShutdownWhenNoClients.cs @@ -0,0 +1,67 @@ +using System.Collections; +using Unity.Netcode; +using UnityEngine; + + +public class ShutdownWhenNoClients : MonoBehaviour +{ + [Tooltip("When enabled, the DGS will wait for the defined ShutdownWaitTime period of time and if no new clients connected will shutdown")] + public bool WaitBeforeShutdown = true; + + [Tooltip("The period of time a server will wait after the last client has disconnected before completely shutting itself down.")] + public float ShutdownWaitTime = 4.0f; + + private NetworkManager m_NetworkManager; + + private void Awake() + { + m_NetworkManager = GetComponent(); + if (m_NetworkManager == null) + { + Debug.LogError($"No {nameof(NetworkManager)} found on {name}! This component should be placed on the same {nameof(GameObject)} as the {nameof(NetworkManager)}!"); + // Disable until resolved + gameObject.SetActive(false); + } + else + { + m_NetworkManager.OnServerStarted += OnServerStarted; + m_NetworkManager.OnServerStopped += OnServerStopped; + } + } + + private void OnServerStarted() + { + m_NetworkManager.OnClientDisconnectCallback += OnClientDisconnectCallback; + } + + private void OnServerStopped(bool obj) + { + m_NetworkManager.OnClientDisconnectCallback -= OnClientDisconnectCallback; + } + + private void OnClientDisconnectCallback(ulong clientId) + { + if (m_NetworkManager.ConnectedClientsList.Count == 1 && m_NetworkManager.ConnectedClients.ContainsKey(clientId)) + { + if (WaitBeforeShutdown) + { + StartCoroutine(WaitForShutdown()); + } + else + { + m_NetworkManager.Shutdown(); + } + } + } + + private IEnumerator WaitForShutdown() + { + yield return new WaitForSeconds(ShutdownWaitTime); + // Make sure no clients have connected while waiting to shutdown + if (m_NetworkManager.ConnectedClients.Count == 0) + { + // If none then shut down + m_NetworkManager.Shutdown(); + } + } +} diff --git a/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/ShutdownWhenNoClients.cs.meta b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/ShutdownWhenNoClients.cs.meta new file mode 100644 index 0000000000..ac9615e8ae --- /dev/null +++ b/testproject/Assets/Tests/Manual/SceneTransitioningAdditive/ShutdownWhenNoClients.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6ed947a9f50a9ca41af3e9d2da92f69f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: