|
| 1 | +using System.Collections; |
| 2 | +using System.Collections.Generic; |
| 3 | +using UnityEngine; |
| 4 | +using UnityEngine.SceneManagement; |
| 5 | +using UnityEngine.TestTools; |
| 6 | +using NUnit.Framework; |
| 7 | +using Unity.Netcode; |
| 8 | +using Unity.Netcode.TestHelpers.Runtime; |
| 9 | +using Object = UnityEngine.Object; |
| 10 | + |
| 11 | +namespace TestProject.RuntimeTests |
| 12 | +{ |
| 13 | + public class NetworkSceneManagerPopulateInSceneTests : NetcodeIntegrationTest |
| 14 | + { |
| 15 | + protected override int NumberOfClients => 0; |
| 16 | + |
| 17 | + |
| 18 | + protected Dictionary<uint, GameObject> m_InSceneObjectList = new Dictionary<uint, GameObject>(); |
| 19 | + |
| 20 | + protected override IEnumerator OnSetup() |
| 21 | + { |
| 22 | + m_InSceneObjectList.Clear(); |
| 23 | + return base.OnSetup(); |
| 24 | + } |
| 25 | + |
| 26 | + protected override void OnServerAndClientsCreated() |
| 27 | + { |
| 28 | + // Create one that simulates when an in-scene placed NetworkObject is first instantiated when |
| 29 | + // the scene is loaded (i.e. IsSceneObject is null) |
| 30 | + var inScenePrefab = CreateNetworkObjectPrefab("NewSceneObject"); |
| 31 | + var networkObject = inScenePrefab.GetComponent<NetworkObject>(); |
| 32 | + networkObject.IsSceneObject = null; |
| 33 | + networkObject.NetworkManagerOwner = m_ServerNetworkManager; |
| 34 | + m_InSceneObjectList.Add(networkObject.GlobalObjectIdHash, inScenePrefab); |
| 35 | + |
| 36 | + // Create one that simulates when an in-scene placed NetworkObject has already been instantiated |
| 37 | + // (i.e. IsSceneObject is true) which can happen if a client disconnects and then reconnects without |
| 38 | + // unloading/reloading any scenes. |
| 39 | + inScenePrefab = CreateNetworkObjectPrefab("SetInSceneObject"); |
| 40 | + networkObject = inScenePrefab.GetComponent<NetworkObject>(); |
| 41 | + networkObject.IsSceneObject = true; |
| 42 | + networkObject.NetworkManagerOwner = m_ServerNetworkManager; |
| 43 | + m_InSceneObjectList.Add(networkObject.GlobalObjectIdHash, inScenePrefab); |
| 44 | + } |
| 45 | + |
| 46 | + [UnityTest] |
| 47 | + public IEnumerator PopulateScenePlacedObjectsTest() |
| 48 | + { |
| 49 | + var activeScene = SceneManager.GetActiveScene(); |
| 50 | + |
| 51 | + m_ServerNetworkManager.SceneManager.PopulateScenePlacedObjects(activeScene, true); |
| 52 | + var scenePlacedNetworkObjects = m_ServerNetworkManager.SceneManager.ScenePlacedObjects; |
| 53 | + foreach (var entry in m_InSceneObjectList) |
| 54 | + { |
| 55 | + // Verify the GlobalObjectIdHash for this object has an entry |
| 56 | + Assert.IsTrue(scenePlacedNetworkObjects.ContainsKey(entry.Key), $"Failed to find {nameof(NetworkObject.GlobalObjectIdHash)}({entry.Key}) for {entry.Value.name} in the {nameof(NetworkSceneManager.ScenePlacedObjects)}!"); |
| 57 | + |
| 58 | + // Verify the active scene for this object has an entry |
| 59 | + Assert.IsTrue(scenePlacedNetworkObjects[entry.Key].ContainsKey(activeScene.handle), $"Failed to find the scene handle {activeScene.handle} ({activeScene.name}) entry for {entry.Value.name} in the {nameof(NetworkSceneManager.ScenePlacedObjects)}!"); |
| 60 | + |
| 61 | + // Verify the GameObject is the same one |
| 62 | + var inSceneGameObject = scenePlacedNetworkObjects[entry.Key][activeScene.handle].gameObject; |
| 63 | + Assert.IsTrue(inSceneGameObject == entry.Value, $"{nameof(GameObject)} {entry.Value.name} is not the same as {inSceneGameObject.name}!"); |
| 64 | + } |
| 65 | + |
| 66 | + yield break; |
| 67 | + } |
| 68 | + |
| 69 | + protected override IEnumerator OnTearDown() |
| 70 | + { |
| 71 | + foreach (var spawnedInstance in m_InSceneObjectList) |
| 72 | + { |
| 73 | + Object.Destroy(spawnedInstance.Value); |
| 74 | + } |
| 75 | + return base.OnTearDown(); |
| 76 | + } |
| 77 | + } |
| 78 | +} |
0 commit comments