|
8 | 8 | using UnityEngine.TestTools;
|
9 | 9 | using Unity.Netcode.RuntimeTests;
|
10 | 10 | using Unity.Netcode;
|
| 11 | +using Object = UnityEngine.Object; |
11 | 12 |
|
12 | 13 | namespace TestProject.RuntimeTests
|
13 | 14 | {
|
@@ -980,7 +981,129 @@ public IEnumerator FastReaderAllocationTest()
|
980 | 981 | nativeArray.Dispose();
|
981 | 982 | fastBufferWriter.Dispose();
|
982 | 983 | networkManager.Shutdown();
|
983 |
| - UnityEngine.Object.Destroy(networkManagerGameObject); |
| 984 | + Object.Destroy(networkManagerGameObject); |
984 | 985 | }
|
985 | 986 | }
|
| 987 | + |
| 988 | + public class NetworkSceneManagerDDOLTests |
| 989 | + { |
| 990 | + private NetworkManager m_ServerNetworkManager; |
| 991 | + private GameObject m_NetworkManagerGameObject; |
| 992 | + private GameObject m_DDOL_ObjectToSpawn; |
| 993 | + |
| 994 | + protected float m_ConditionMetFrequency = 0.1f; |
| 995 | + |
| 996 | + [UnitySetUp] |
| 997 | + protected IEnumerator SetUp() |
| 998 | + { |
| 999 | + m_NetworkManagerGameObject = new GameObject("NetworkManager - Host"); |
| 1000 | + m_ServerNetworkManager = m_NetworkManagerGameObject.AddComponent<NetworkManager>(); |
| 1001 | + |
| 1002 | + m_DDOL_ObjectToSpawn = new GameObject(); |
| 1003 | + m_DDOL_ObjectToSpawn.AddComponent<NetworkObject>(); |
| 1004 | + m_DDOL_ObjectToSpawn.AddComponent<DDOLBehaviour>(); |
| 1005 | + |
| 1006 | + m_ServerNetworkManager.NetworkConfig = new NetworkConfig() |
| 1007 | + { |
| 1008 | + ConnectionApproval = false, |
| 1009 | + NetworkPrefabs = new List<NetworkPrefab>(), |
| 1010 | + NetworkTransport = m_NetworkManagerGameObject.AddComponent<SIPTransport>(), |
| 1011 | + }; |
| 1012 | + m_ServerNetworkManager.StartHost(); |
| 1013 | + yield break; |
| 1014 | + } |
| 1015 | + |
| 1016 | + [UnityTearDown] |
| 1017 | + protected IEnumerator TearDown() |
| 1018 | + { |
| 1019 | + m_ServerNetworkManager.Shutdown(); |
| 1020 | + |
| 1021 | + Object.Destroy(m_NetworkManagerGameObject); |
| 1022 | + Object.Destroy(m_DDOL_ObjectToSpawn); |
| 1023 | + |
| 1024 | + yield break; |
| 1025 | + } |
| 1026 | + |
| 1027 | + public enum DefaultState |
| 1028 | + { |
| 1029 | + IsEnabled, |
| 1030 | + IsDisabled |
| 1031 | + } |
| 1032 | + |
| 1033 | + public enum MovedIntoDDOLBy |
| 1034 | + { |
| 1035 | + User, |
| 1036 | + NetworkSceneManager |
| 1037 | + } |
| 1038 | + |
| 1039 | + public enum NetworkObjectType |
| 1040 | + { |
| 1041 | + InScenePlaced, |
| 1042 | + DynamicallySpawned |
| 1043 | + } |
| 1044 | + |
| 1045 | + /// <summary> |
| 1046 | + /// Tests to make sure NetworkObjects moved into the DDOL will |
| 1047 | + /// restore back to their currently active state when a full |
| 1048 | + /// scene transition is complete. |
| 1049 | + /// This tests both in-scene placed and dynamically spawned NetworkObjects |
| 1050 | + [UnityTest] |
| 1051 | + public IEnumerator InSceneNetworkObjectState([Values(DefaultState.IsEnabled, DefaultState.IsDisabled)] DefaultState activeState, |
| 1052 | + [Values(MovedIntoDDOLBy.User, MovedIntoDDOLBy.NetworkSceneManager)] MovedIntoDDOLBy movedIntoDDOLBy, |
| 1053 | + [Values(NetworkObjectType.InScenePlaced, NetworkObjectType.DynamicallySpawned)] NetworkObjectType networkObjectType) |
| 1054 | + { |
| 1055 | + var isActive = activeState == DefaultState.IsEnabled ? true : false; |
| 1056 | + var isInScene = networkObjectType == NetworkObjectType.InScenePlaced ? true : false; |
| 1057 | + var networkObject = m_DDOL_ObjectToSpawn.GetComponent<NetworkObject>(); |
| 1058 | + var ddolBehaviour = m_DDOL_ObjectToSpawn.GetComponent<DDOLBehaviour>(); |
| 1059 | + |
| 1060 | + // All tests require this to be false |
| 1061 | + networkObject.DestroyWithScene = false; |
| 1062 | + |
| 1063 | + if (movedIntoDDOLBy == MovedIntoDDOLBy.User) |
| 1064 | + { |
| 1065 | + ddolBehaviour.MoveToDDOL(); |
| 1066 | + } |
| 1067 | + |
| 1068 | + // Sets whether we are in-scene or dynamically spawned NetworkObject |
| 1069 | + ddolBehaviour.SetInScene(isInScene); |
| 1070 | + |
| 1071 | + Assert.That(networkObject.IsSpawned); |
| 1072 | + |
| 1073 | + m_DDOL_ObjectToSpawn.SetActive(isActive); |
| 1074 | + |
| 1075 | + m_ServerNetworkManager.SceneManager.MoveObjectsToDontDestroyOnLoad(); |
| 1076 | + |
| 1077 | + yield return new WaitForSeconds(0.03f); |
| 1078 | + |
| 1079 | + // It should be isActive when MoveObjectsToDontDestroyOnLoad is called. |
| 1080 | + Assert.That(networkObject.isActiveAndEnabled == isActive); |
| 1081 | + |
| 1082 | + m_ServerNetworkManager.SceneManager.MoveObjectsFromDontDestroyOnLoadToScene(SceneManager.GetActiveScene()); |
| 1083 | + |
| 1084 | + yield return new WaitForSeconds(0.03f); |
| 1085 | + |
| 1086 | + // It should be isActive when MoveObjectsFromDontDestroyOnLoadToScene is called. |
| 1087 | + Assert.That(networkObject.isActiveAndEnabled == isActive); |
| 1088 | + |
| 1089 | + //Done |
| 1090 | + networkObject.Despawn(false); |
| 1091 | + } |
| 1092 | + |
| 1093 | + public class DDOLBehaviour : NetworkBehaviour |
| 1094 | + { |
| 1095 | + public void MoveToDDOL() |
| 1096 | + { |
| 1097 | + DontDestroyOnLoad(gameObject); |
| 1098 | + } |
| 1099 | + |
| 1100 | + public void SetInScene(bool isInScene) |
| 1101 | + { |
| 1102 | + var networkObject = GetComponent<NetworkObject>(); |
| 1103 | + networkObject.IsSceneObject = isInScene; |
| 1104 | + } |
| 1105 | + } |
| 1106 | + |
| 1107 | + } |
| 1108 | + |
986 | 1109 | }
|
0 commit comments