@@ -18,6 +18,7 @@ public IEnumerator SetUp()
1818 // Make sure these static values are reset
1919 NetworkVariableInitOnNetworkSpawn . NetworkSpawnCalledOnClient = false ;
2020 NetworkVariableInitOnNetworkSpawn . NetworkSpawnCalledOnServer = false ;
21+ NetworkVariableInitOnNetworkSpawn . OnValueChangedCalledOnClient = false ;
2122 yield break ;
2223 }
2324
@@ -33,12 +34,11 @@ public IEnumerator Teardown()
3334 }
3435 NetworkVariableInitOnNetworkSpawn . NetworkSpawnCalledOnClient = false ;
3536 NetworkVariableInitOnNetworkSpawn . NetworkSpawnCalledOnServer = false ;
37+ NetworkVariableInitOnNetworkSpawn . OnValueChangedCalledOnClient = false ;
3638 yield break ;
3739 }
3840
39- [ UnityTest ]
40- [ Description ( "When a network variable is initialized in OnNetworkSpawn on the server, the spawned object's NetworkVariable on the client is initialized with the same value." ) ]
41- public IEnumerator WhenANetworkVariableIsInitializedInOnNetworkSpawnOnTheServer_TheSpawnedObjectsNetworkVariableOnTheClientIsInitializedWithTheSameValue ( )
41+ private IEnumerator RunTest ( )
4242 {
4343 const int numClients = 1 ;
4444 Assert . True ( MultiInstanceHelpers . Create ( numClients , out NetworkManager server , out NetworkManager [ ] clients ) ) ;
@@ -95,8 +95,88 @@ public IEnumerator WhenANetworkVariableIsInitializedInOnNetworkSpawnOnTheServer_
9595 var nextFrameNumber = Time . frameCount + 1 ;
9696 yield return new WaitUntil ( ( ) => Time . frameCount >= nextFrameNumber ) ;
9797 }
98+ }
99+
100+ [ UnityTest ]
101+ [ Description ( "When a network variable is initialized in OnNetworkSpawn on the server, the spawned object's NetworkVariable on the client is initialized with the same value." ) ]
102+ public IEnumerator WhenANetworkVariableIsInitializedInOnNetworkSpawnOnTheServer_TheSpawnedObjectsNetworkVariableOnTheClientIsInitializedWithTheSameValue ( )
103+ {
104+ yield return RunTest ( ) ;
98105 Assert . IsTrue ( NetworkVariableInitOnNetworkSpawn . NetworkSpawnCalledOnServer ) ;
99106 Assert . IsTrue ( NetworkVariableInitOnNetworkSpawn . NetworkSpawnCalledOnClient ) ;
100107 }
108+
109+ [ UnityTest ]
110+ [ Description ( "When a network variable is initialized in OnNetworkSpawn on the server, OnValueChanged is not called" ) ]
111+ public IEnumerator WhenANetworkVariableIsInitializedInOnNetworkSpawnOnTheServer_OnValueChangedIsNotCalled ( )
112+ {
113+ yield return RunTest ( ) ;
114+ Assert . IsFalse ( NetworkVariableInitOnNetworkSpawn . OnValueChangedCalledOnClient ) ;
115+ }
116+
117+ [ UnityTest ]
118+ [ Description ( "When a network variable is changed just after OnNetworkSpawn on the server, OnValueChanged is called after OnNetworkSpawn" ) ]
119+ public IEnumerator WhenANetworkVariableIsInitializedJustAfterOnNetworkSpawnOnTheServer_OnValueChangedIsCalledAfterOnNetworkSpawn ( )
120+ {
121+ const int numClients = 1 ;
122+ Assert . True ( MultiInstanceHelpers . Create ( numClients , out NetworkManager server , out NetworkManager [ ] clients ) ) ;
123+ m_Prefab = new GameObject ( "Object" ) ;
124+ var networkObject = m_Prefab . AddComponent < NetworkObject > ( ) ;
125+ m_Prefab . AddComponent < NetworkVariableInitOnNetworkSpawn > ( ) ;
126+
127+ // Make it a prefab
128+ MultiInstanceHelpers . MakeNetworkObjectTestPrefab ( networkObject ) ;
129+
130+ var validNetworkPrefab = new NetworkPrefab ( ) ;
131+ validNetworkPrefab . Prefab = m_Prefab ;
132+ server . NetworkConfig . NetworkPrefabs . Add ( validNetworkPrefab ) ;
133+ foreach ( var client in clients )
134+ {
135+ client . NetworkConfig . NetworkPrefabs . Add ( validNetworkPrefab ) ;
136+ }
137+
138+ // Start the instances
139+ if ( ! MultiInstanceHelpers . Start ( true , server , clients ) )
140+ {
141+ Debug . LogError ( "Failed to start instances" ) ;
142+ Assert . Fail ( "Failed to start instances" ) ;
143+ }
144+
145+ // [Client-Side] Wait for a connection to the server
146+ yield return MultiInstanceHelpers . Run ( MultiInstanceHelpers . WaitForClientsConnected ( clients , null , 512 ) ) ;
147+
148+ // [Host-Side] Check to make sure all clients are connected
149+ yield return MultiInstanceHelpers . Run (
150+ MultiInstanceHelpers . WaitForClientsConnectedToServer ( server , clients . Length + 1 , null , 512 ) ) ;
151+
152+ var serverObject = Object . Instantiate ( m_Prefab , Vector3 . zero , Quaternion . identity ) ;
153+ NetworkObject serverNetworkObject = serverObject . GetComponent < NetworkObject > ( ) ;
154+ serverNetworkObject . NetworkManagerOwner = server ;
155+ serverNetworkObject . Spawn ( ) ;
156+ serverNetworkObject . GetComponent < NetworkVariableInitOnNetworkSpawn > ( ) . Variable . Value = 10 ;
157+ Assert . IsFalse ( NetworkVariableInitOnNetworkSpawn . OnValueChangedCalledOnClient ) ;
158+
159+ // Wait until all objects have spawned.
160+ //const int expectedNetworkObjects = numClients + 2; // +2 = one for prefab, one for server.
161+ const int maxFrames = 240 ;
162+ var doubleCheckTime = Time . realtimeSinceStartup + 5.0f ;
163+ while ( ! NetworkVariableInitOnNetworkSpawn . OnValueChangedCalledOnClient )
164+ {
165+ if ( Time . frameCount > maxFrames )
166+ {
167+ // This is here in the event a platform is running at a higher
168+ // frame rate than expected
169+ if ( doubleCheckTime < Time . realtimeSinceStartup )
170+ {
171+ Assert . Fail ( "Did not successfully spawn all expected NetworkObjects" ) ;
172+ break ;
173+ }
174+ }
175+ var nextFrameNumber = Time . frameCount + 1 ;
176+ yield return new WaitUntil ( ( ) => Time . frameCount >= nextFrameNumber ) ;
177+ }
178+ // Test of ordering is handled by an assert within OnNetworkSpawn
179+ Assert . IsTrue ( NetworkVariableInitOnNetworkSpawn . OnValueChangedCalledOnClient ) ;
180+ }
101181 }
102182}
0 commit comments