void ResolveScene(Entity sceneEntity, ref SceneReference scene, RequestSceneLoaded requestSceneLoaded, Hash128 artifactHash) { if (ResolveSceneSectionUtility.ResolveSceneSections(EntityManager, sceneEntity, scene.SceneGUID, requestSceneLoaded, artifactHash)) { LogResolving("ResolveScene (success)", scene.SceneGUID); Assertions.Assert.IsTrue(EntityManager.GetEntityQueryMask(m_ResolvedScenes).Matches(sceneEntity)); } else { LogResolving("ResolveScene (failed)", scene.SceneGUID); } }
protected override void OnUpdate() { SceneWithBuildConfigurationGUIDs.ValidateBuildSettingsCache(); var sceneSystem = World.GetExistingSystem <SceneSystem>(); var buildConfigurationGUID = sceneSystem.BuildConfigurationGUID; // Add scene entities that haven't been encountered yet if (!m_AddScenes.IsEmptyIgnoreFilter) { //@TODO: Should use Entities.ForEach but we are missing // 1. Entities.ForEach support with execute always (ILPP compilation not taking effect on first domain reload) // 2. Entities.ForEach not supporting explicit queries using (var addScenes = m_AddScenes.ToEntityArray(Allocator.TempJob)) { var trackerStates = new NativeArray <AssetDependencyTrackerState>(addScenes.Length, Allocator.Temp); for (int i = 0; i != addScenes.Length; i++) { var sceneEntity = addScenes[i]; var scene = EntityManager.GetComponentData <SceneReference>(sceneEntity); var requestSceneLoaded = EntityManager.GetComponentData <RequestSceneLoaded>(sceneEntity); var guid = SceneWithBuildConfigurationGUIDs.EnsureExistsFor(scene.SceneGUID, buildConfigurationGUID, out var requireRefresh); var async = (requestSceneLoaded.LoadFlags & SceneLoadFlags.BlockOnImport) == 0; LogResolving(async ? "Adding Async" : "Adding Sync", guid); _AssetDependencyTracker.Add(guid, sceneEntity, async); if (requireRefresh) { _AssetDependencyTracker.RequestRefresh(); } trackerStates[i] = new AssetDependencyTrackerState { SceneAndBuildConfigGUID = guid }; } EntityManager.AddComponentData(m_AddScenes, trackerStates); trackerStates.Dispose(); } } // Remove scene entities that were added and should no longer be tracked if (!m_RemoveScenes.IsEmptyIgnoreFilter) { using (var removeEntities = m_RemoveScenes.ToEntityArray(Allocator.TempJob)) using (var removeGuids = m_RemoveScenes.ToComponentDataArray <AssetDependencyTrackerState>(Allocator.TempJob)) { for (int i = 0; i != removeEntities.Length; i++) { LogResolving("Removing", removeGuids[i].SceneAndBuildConfigGUID); _AssetDependencyTracker.Remove(removeGuids[i].SceneAndBuildConfigGUID, removeEntities[i]); } } EntityManager.RemoveComponent <AssetDependencyTrackerState>(m_RemoveScenes); } // Process any scenes that have completed their asset import var isDone = _AssetDependencyTracker.GetCompleted(_Changed); foreach (var change in _Changed) { var sceneEntity = change.UserKey; LogResolving($"Resolving: {change.Asset} -> {change.ArtifactID}"); if (!m_ValidSceneMask.Matches(sceneEntity)) { throw new InvalidOperationException("entity should have been removed from tracker already"); } // Unload any previous state var unloadFlags = SceneSystem.UnloadParameters.DestroySectionProxyEntities | SceneSystem.UnloadParameters.DontRemoveRequestSceneLoaded; sceneSystem.UnloadScene(sceneEntity, unloadFlags); // Resolve new state var scene = EntityManager.GetComponentData <SceneReference>(change.UserKey); var request = EntityManager.GetComponentData <RequestSceneLoaded>(change.UserKey); if (change.ArtifactID != default) { ResolveSceneSectionUtility.ResolveSceneSections(EntityManager, change.UserKey, scene.SceneGUID, request, change.ArtifactID); } else { Debug.LogError( $"Failed to import entity scene because the automatically generated SceneAndBuildConfigGUID asset was not present: '{AssetDatabaseCompatibility.GuidToPath(scene.SceneGUID)}' -> '{AssetDatabaseCompatibility.GuidToPath(change.Asset)}'"); } } if (!isDone) { EditorUpdateUtility.EditModeQueuePlayerLoopUpdate(); } }