public void LoadAndUnloadSubScene() { using (var worldA = new World("World A")) using (var worldB = new World("World B")) { RegisterStreamingSystems(worldA); RegisterStreamingSystems(worldB); var loadParams = new SceneSystem.LoadParameters { Flags = SceneLoadFlags.BlockOnImport | SceneLoadFlags.BlockOnStreamIn }; #if UNITY_EDITOR Debug.Log(AssetDatabase.AssetPathToGUID(m_SubScenePath)); Unity.Entities.Hash128 sceneGuid = new GUID(AssetDatabase.AssetPathToGUID(m_SubScenePath)); #else var sceneGuid = new Unity.Entities.Hash128(); #endif var worldAScene = worldA.GetOrCreateSystem <SceneSystem>().LoadSceneAsync(sceneGuid, loadParams); worldA.Update(); var worldBScene = worldB.GetOrCreateSystem <SceneSystem>().LoadSceneAsync(sceneGuid, loadParams); worldB.Update(); var worldAEntities = worldA.EntityManager.GetAllEntities(Allocator.TempJob); var worldBEntities = worldB.EntityManager.GetAllEntities(Allocator.TempJob); using (worldAEntities) using (worldBEntities) { Assert.AreEqual(worldAEntities.Length, worldBEntities.Length); } var worldAQuery = worldA.EntityManager.CreateEntityQuery(typeof(SharedWithMaterial)); var worldBQuery = worldB.EntityManager.CreateEntityQuery(typeof(SharedWithMaterial)); Assert.AreEqual(worldAQuery.CalculateEntityCount(), worldBQuery.CalculateEntityCount()); Assert.AreEqual(1, worldAQuery.CalculateEntityCount()); // Get Material on RenderMesh var sharedEntitiesA = worldAQuery.ToEntityArray(Allocator.TempJob); var sharedEntitiesB = worldBQuery.ToEntityArray(Allocator.TempJob); SharedWithMaterial sharedA; SharedWithMaterial sharedB; using (sharedEntitiesA) using (sharedEntitiesB) { sharedA = worldA.EntityManager.GetSharedComponentData <SharedWithMaterial>(sharedEntitiesA[0]); sharedB = worldB.EntityManager.GetSharedComponentData <SharedWithMaterial>(sharedEntitiesB[0]); } Assert.AreSame(sharedA.material, sharedB.material); Assert.IsTrue(sharedA.material != null, "sharedA.material != null"); var material = sharedA.material; #if !UNITY_EDITOR Assert.AreEqual(1, SceneBundleHandle.GetLoadedCount()); #else Assert.AreEqual(0, SceneBundleHandle.GetLoadedCount()); #endif Assert.AreEqual(0, SceneBundleHandle.GetUnloadingCount()); worldA.GetOrCreateSystem <SceneSystem>().UnloadScene(worldAScene); worldA.Update(); worldB.GetOrCreateSystem <SceneSystem>().UnloadScene(worldBScene); worldB.Update(); Assert.AreEqual(0, SceneBundleHandle.GetLoadedCount()); Assert.AreEqual(0, SceneBundleHandle.GetUnloadingCount()); #if !UNITY_EDITOR Assert.IsTrue(material == null); #endif } }
public void LoadMultipleSubscenes_Blocking_WithAssetBundles() { using (var worldA = TestWorldSetup.CreateEntityWorld("World A", false)) using (var worldB = TestWorldSetup.CreateEntityWorld("World B", false)) { var loadParams = new SceneSystem.LoadParameters { Flags = SceneLoadFlags.BlockOnImport | SceneLoadFlags.BlockOnStreamIn }; Assert.IsTrue(SceneGUID.IsValid); var worldAScene = worldA.GetOrCreateSystem <SceneSystem>().LoadSceneAsync(SceneGUID, loadParams); var worldBScene = worldB.GetOrCreateSystem <SceneSystem>().LoadSceneAsync(SceneGUID, loadParams); Assert.IsFalse(worldA.GetExistingSystem <SceneSystem>().IsSceneLoaded(worldAScene)); Assert.IsFalse(worldB.GetExistingSystem <SceneSystem>().IsSceneLoaded(worldBScene)); worldA.Update(); worldB.Update(); Assert.IsTrue(worldA.GetExistingSystem <SceneSystem>().IsSceneLoaded(worldAScene)); Assert.IsTrue(worldB.GetExistingSystem <SceneSystem>().IsSceneLoaded(worldBScene)); var worldAEntities = worldA.EntityManager.GetAllEntities(Allocator.TempJob); var worldBEntities = worldB.EntityManager.GetAllEntities(Allocator.TempJob); using (worldAEntities) using (worldBEntities) { Assert.AreEqual(worldAEntities.Length, worldBEntities.Length); } var worldAQuery = worldA.EntityManager.CreateEntityQuery(typeof(SharedWithMaterial)); var worldBQuery = worldB.EntityManager.CreateEntityQuery(typeof(SharedWithMaterial)); Assert.AreEqual(worldAQuery.CalculateEntityCount(), worldBQuery.CalculateEntityCount()); Assert.AreEqual(1, worldAQuery.CalculateEntityCount()); // Get Material on RenderMesh var sharedEntitiesA = worldAQuery.ToEntityArray(Allocator.TempJob); var sharedEntitiesB = worldBQuery.ToEntityArray(Allocator.TempJob); SharedWithMaterial sharedA; SharedWithMaterial sharedB; using (sharedEntitiesA) using (sharedEntitiesB) { sharedA = worldA.EntityManager.GetSharedComponentData <SharedWithMaterial>(sharedEntitiesA[0]); sharedB = worldB.EntityManager.GetSharedComponentData <SharedWithMaterial>(sharedEntitiesB[0]); } Assert.AreSame(sharedA.material, sharedB.material); Assert.IsTrue(sharedA.material != null, "sharedA.material != null"); var material = sharedA.material; #if !UNITY_EDITOR Assert.AreEqual(1, SceneBundleHandle.GetLoadedCount()); #else Assert.AreEqual(0, SceneBundleHandle.GetLoadedCount()); #endif Assert.AreEqual(0, SceneBundleHandle.GetUnloadingCount()); worldA.GetOrCreateSystem <SceneSystem>().UnloadScene(worldAScene); worldA.Update(); worldB.GetOrCreateSystem <SceneSystem>().UnloadScene(worldBScene); worldB.Update(); Assert.AreEqual(0, SceneBundleHandle.GetLoadedCount()); Assert.AreEqual(0, SceneBundleHandle.GetUnloadingCount()); #if !UNITY_EDITOR Assert.IsTrue(material == null); #endif } }
public IEnumerator LoadMultipleSubscenes_Async_WithAssetBundles() { using (var worldA = TestWorldSetup.CreateEntityWorld("World A", false)) using (var worldB = TestWorldSetup.CreateEntityWorld("World B", false)) { var sceneSystemA = worldA.GetExistingSystem <SceneSystem>(); var sceneSystemB = worldB.GetExistingSystem <SceneSystem>(); Assert.IsTrue(m_SceneGUID.IsValid); var worldAScene = sceneSystemA.LoadSceneAsync(m_SceneGUID); var worldBScene = sceneSystemB.LoadSceneAsync(m_SceneGUID); Assert.IsFalse(sceneSystemA.IsSceneLoaded(worldAScene)); Assert.IsFalse(sceneSystemB.IsSceneLoaded(worldBScene)); while (!sceneSystemA.IsSceneLoaded(worldAScene) || !sceneSystemB.IsSceneLoaded(worldBScene)) { worldA.Update(); worldB.Update(); yield return(null); } var worldAEntities = worldA.EntityManager.GetAllEntities(Allocator.TempJob); var worldBEntities = worldB.EntityManager.GetAllEntities(Allocator.TempJob); using (worldAEntities) using (worldBEntities) { Assert.AreEqual(worldAEntities.Length, worldBEntities.Length); } var worldAQuery = worldA.EntityManager.CreateEntityQuery(typeof(SharedWithMaterial)); var worldBQuery = worldB.EntityManager.CreateEntityQuery(typeof(SharedWithMaterial)); Assert.AreEqual(worldAQuery.CalculateEntityCount(), worldBQuery.CalculateEntityCount()); Assert.AreEqual(1, worldAQuery.CalculateEntityCount()); // Get Material on RenderMesh var sharedEntitiesA = worldAQuery.ToEntityArray(Allocator.TempJob); var sharedEntitiesB = worldBQuery.ToEntityArray(Allocator.TempJob); SharedWithMaterial sharedA; SharedWithMaterial sharedB; using (sharedEntitiesA) using (sharedEntitiesB) { sharedA = worldA.EntityManager.GetSharedComponentData <SharedWithMaterial>(sharedEntitiesA[0]); sharedB = worldB.EntityManager.GetSharedComponentData <SharedWithMaterial>(sharedEntitiesB[0]); } Assert.AreSame(sharedA.material, sharedB.material); Assert.IsTrue(sharedA.material != null, "sharedA.material != null"); var material = sharedA.material; #if !UNITY_EDITOR Assert.AreEqual(1, SceneBundleHandle.GetLoadedCount()); #else Assert.AreEqual(0, SceneBundleHandle.GetLoadedCount()); #endif Assert.AreEqual(0, SceneBundleHandle.GetUnloadingCount()); worldA.GetOrCreateSystem <SceneSystem>().UnloadScene(worldAScene); worldA.Update(); worldB.GetOrCreateSystem <SceneSystem>().UnloadScene(worldBScene); worldB.Update(); Assert.AreEqual(0, SceneBundleHandle.GetLoadedCount()); Assert.AreEqual(0, SceneBundleHandle.GetUnloadingCount()); #if !UNITY_EDITOR Assert.IsTrue(material == null); #endif } }