11using System . Collections ;
2+ using System . Collections . Generic ;
23using System . Linq ;
34using NUnit . Framework ;
45using Unity . Netcode ;
@@ -19,6 +20,36 @@ public class SceneObjectsNotDestroyedOnShutdownTest : NetcodeIntegrationTest
1920 private Scene m_TestScene ;
2021 private WaitForSeconds m_DefaultWaitForTick = new WaitForSeconds ( 1.0f / 30 ) ;
2122
23+ private NetworkObject m_LoadedSceneObject ;
24+ private List < NetworkObject > m_LoadedSceneOBjects = new List < NetworkObject > ( ) ;
25+
26+ private bool FoundLoadedSceneObject ( )
27+ {
28+ m_LoadedSceneObject = null ;
29+ #if UNITY_2023_1_OR_NEWER
30+ m_LoadedSceneObject = Object . FindObjectsByType < NetworkObject > ( FindObjectsSortMode . InstanceID ) . Where ( ( c ) => c . name . Contains ( k_SceneObjectName ) ) . FirstOrDefault ( ) ;
31+ #else
32+ m_LoadedSceneObject = Object . FindObjectsOfType < NetworkObject > ( ) . Where ( ( c ) => c . name . Contains ( k_SceneObjectName ) ) . FirstOrDefault ( ) ;
33+ #endif
34+ return m_LoadedSceneObject != null ;
35+ }
36+
37+ private bool FoundLoadedSceneObjects ( )
38+ {
39+ m_LoadedSceneOBjects . Clear ( ) ;
40+ #if UNITY_2023_1_OR_NEWER
41+ var loadedInSceneObjects = Object . FindObjectsByType < NetworkObject > ( FindObjectsSortMode . InstanceID ) . Where ( ( c ) => c . name . Contains ( k_SceneObjectName ) ) ;
42+ #else
43+ var loadedInSceneObjects = Object . FindObjectsOfType < NetworkObject > ( ) . Where ( ( c ) => c . name . Contains ( k_SceneObjectName ) ) ;
44+ #endif
45+ if ( loadedInSceneObjects . Count ( ) == 0 )
46+ {
47+ return false ;
48+ }
49+ m_LoadedSceneOBjects . AddRange ( loadedInSceneObjects ) ;
50+ return true ;
51+ }
52+
2253 [ UnityTest ]
2354 public IEnumerator SceneObjectsNotDestroyedOnShutdown ( )
2455 {
@@ -28,30 +59,22 @@ public IEnumerator SceneObjectsNotDestroyedOnShutdown()
2859 yield return WaitForConditionOrTimeOut ( ( ) => m_TestScene . IsValid ( ) && m_TestScene . isLoaded ) ;
2960 AssertOnTimeout ( $ "Timed out waiting for scene { k_TestScene } to load!") ;
3061
31- #if UNITY_2023_1_OR_NEWER
32- var loadedInSceneObject = Object . FindObjectsByType < NetworkObject > ( FindObjectsSortMode . InstanceID ) . Where ( ( c ) => c . name == k_SceneObjectName ) . FirstOrDefault ( ) ;
33- #else
34- var loadedInSceneObject = Object . FindObjectsOfType < NetworkObject > ( ) . Where ( ( c ) => c . name . Contains ( k_SceneObjectName ) ) . FirstOrDefault ( ) ;
35- #endif
36- Assert . IsNotNull ( loadedInSceneObject , $ "Failed to find { k_SceneObjectName } before starting client!") ;
62+ yield return WaitForConditionOrTimeOut ( FoundLoadedSceneObject ) ;
63+ AssertOnTimeout ( $ "Failed to find { k_SceneObjectName } before starting client!") ;
3764 yield return CreateAndStartNewClient ( ) ;
3865
39- #if UNITY_2023_1_OR_NEWER
40- var loadedInSceneObjects = Object . FindObjectsByType < NetworkObject > ( FindObjectsSortMode . InstanceID ) . Where ( ( c ) => c . name == k_SceneObjectName ) ;
41- #else
42- var loadedInSceneObjects = Object . FindObjectsOfType < NetworkObject > ( ) . Where ( ( c ) => c . name . Contains ( k_SceneObjectName ) ) ;
43- #endif
44- Assert . IsTrue ( loadedInSceneObjects . Count ( ) > 1 , $ "Only found one instance of { k_SceneObjectName } after client connected!") ;
66+ yield return WaitForConditionOrTimeOut ( FoundLoadedSceneObjects ) ;
67+ AssertOnTimeout ( $ "Failed to find { k_SceneObjectName } objects after starting Client-{ m_ClientNetworkManagers [ 0 ] . LocalClientId } !") ;
68+
69+ Assert . IsTrue ( m_LoadedSceneOBjects . Count ( ) > 1 , $ "Only found one instance of { k_SceneObjectName } after Client-{ m_ClientNetworkManagers [ 0 ] . LocalClientId } connected!") ;
4570 m_ClientNetworkManagers [ 0 ] . Shutdown ( ) ;
4671 yield return m_DefaultWaitForTick ;
47- #if UNITY_2023_1_OR_NEWER
48- loadedInSceneObjects = Object . FindObjectsByType < NetworkObject > ( FindObjectsSortMode . InstanceID ) . Where ( ( c ) => c . name == k_SceneObjectName ) ;
49- #else
50- loadedInSceneObjects = Object . FindObjectsOfType < NetworkObject > ( ) . Where ( ( c ) => c . name . Contains ( k_SceneObjectName ) ) ;
51- #endif
52- Assert . IsTrue ( loadedInSceneObjects . Count ( ) > 1 , $ "Only found one instance of { k_SceneObjectName } after client shutdown!") ;
72+ yield return WaitForConditionOrTimeOut ( FoundLoadedSceneObjects ) ;
73+ AssertOnTimeout ( $ "Failed to find { k_SceneObjectName } objects after shutting down client!") ;
74+ Assert . IsTrue ( m_LoadedSceneOBjects . Count ( ) > 1 , $ "Only found one instance of { k_SceneObjectName } after client shutdown!") ;
5375 }
5476
77+
5578 [ UnityTest ]
5679 public IEnumerator ChildSceneObjectsDoNotDestroyOnShutdown ( )
5780 {
@@ -61,46 +84,39 @@ public IEnumerator ChildSceneObjectsDoNotDestroyOnShutdown()
6184 yield return WaitForConditionOrTimeOut ( ( ) => m_TestScene . IsValid ( ) && m_TestScene . isLoaded ) ;
6285 AssertOnTimeout ( $ "Timed out waiting for scene { k_TestScene } to load!") ;
6386
64- #if UNITY_2023_1_OR_NEWER
65- var loadedInSceneObject = Object . FindObjectsByType < NetworkObject > ( FindObjectsSortMode . InstanceID ) . Where ( ( c ) => c . name == k_SceneObjectName ) . FirstOrDefault ( ) ;
66- #else
67- var loadedInSceneObject = Object . FindObjectsOfType < NetworkObject > ( ) . Where ( ( c ) => c . name . Contains ( k_SceneObjectName ) ) . FirstOrDefault ( ) ;
68- #endif
69- Assert . IsNotNull ( loadedInSceneObject , $ "Failed to find { k_SceneObjectName } before starting client!") ;
87+ yield return WaitForConditionOrTimeOut ( FoundLoadedSceneObject ) ;
88+ AssertOnTimeout ( $ "Failed to find { k_SceneObjectName } before starting client!") ;
89+
7090 yield return CreateAndStartNewClient ( ) ;
7191
7292 var clientId = m_ClientNetworkManagers [ 0 ] . LocalClientId ;
73- Assert . IsTrue ( loadedInSceneObject . TrySetParent ( m_PlayerNetworkObjects [ 0 ] [ clientId ] ) , $ "Failed to parent in-scene object under client player") ;
93+ Assert . IsTrue ( m_LoadedSceneObject . TrySetParent ( m_PlayerNetworkObjects [ 0 ] [ clientId ] ) , $ "Failed to parent in-scene object under client player") ;
7494
7595 yield return WaitForConditionOrTimeOut ( ( ) => PlayerHasChildren ( clientId ) ) ;
7696 AssertOnTimeout ( $ "Client-{ clientId } player never parented { k_SceneObjectName } !") ;
7797
78- #if UNITY_2023_1_OR_NEWER
79- var loadedInSceneObjects = Object . FindObjectsByType < NetworkObject > ( FindObjectsSortMode . InstanceID ) . Where ( ( c ) => c . name == k_SceneObjectName ) ;
80- #else
81- var loadedInSceneObjects = Object . FindObjectsOfType < NetworkObject > ( ) . Where ( ( c ) => c . name . Contains ( k_SceneObjectName ) ) ;
82- #endif
83- Assert . IsTrue ( loadedInSceneObjects . Count ( ) > 1 , $ "Only found one instance of { k_SceneObjectName } after client connected!") ;
98+ yield return WaitForConditionOrTimeOut ( FoundLoadedSceneObjects ) ;
99+ AssertOnTimeout ( $ "Failed to find { k_SceneObjectName } objects before shutting down Client-{ m_ClientNetworkManagers [ 0 ] . LocalClientId } !") ;
100+ Assert . IsTrue ( m_LoadedSceneOBjects . Count ( ) > 1 , $ "Only found one instance of { k_SceneObjectName } after client connected!") ;
84101 m_ClientNetworkManagers [ 0 ] . Shutdown ( ) ;
85102 yield return m_DefaultWaitForTick ;
86103
87104 // Sanity check to make sure the client's player no longer has any children
88105 yield return WaitForConditionOrTimeOut ( ( ) => PlayerNoLongerExistsWithChildren ( clientId ) ) ;
89106 AssertOnTimeout ( $ "Client-{ clientId } player still exits with children after client shutdown!") ;
90- #if UNITY_2023_1_OR_NEWER
91- loadedInSceneObjects = Object . FindObjectsByType < NetworkObject > ( FindObjectsSortMode . InstanceID ) . Where ( ( c ) => c . name == k_SceneObjectName ) ;
92- #else
93- loadedInSceneObjects = Object . FindObjectsOfType < NetworkObject > ( ) . Where ( ( c ) => c . name . Contains ( k_SceneObjectName ) ) ;
94- #endif
107+
108+ yield return WaitForConditionOrTimeOut ( FoundLoadedSceneObjects ) ;
109+ AssertOnTimeout ( $ "Failed to find { k_SceneObjectName } objects after shutting down client!") ;
110+
95111 // Make sure any in-scene placed NetworkObject instantiated has no parent
96- foreach ( var insceneObject in loadedInSceneObjects )
112+ foreach ( var insceneObject in m_LoadedSceneOBjects )
97113 {
98114 Assert . IsTrue ( insceneObject . transform . parent == null , $ "{ insceneObject . name } is still parented!") ;
99115 }
100116
101117 // We should have exactly 2 in-scene placed NetworkObjects remaining:
102118 // One instance on host side and one on the disconnected client side.
103- Assert . IsTrue ( loadedInSceneObjects . Count ( ) == 2 , $ "Only found one instance of { k_SceneObjectName } after client shutdown!") ;
119+ Assert . IsTrue ( m_LoadedSceneOBjects . Count ( ) == 2 , $ "Only found one instance of { k_SceneObjectName } after client shutdown!") ;
104120 }
105121
106122 private bool PlayerHasChildren ( ulong clientId )
0 commit comments