コード例 #1
0
        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
                }
        }
コード例 #2
0
        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
                }
        }
コード例 #3
0
        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
                }
        }