// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; namespace Microsoft.MixedReality.Toolkit.Utilities { public static class RuntimeSceneUtils { public static string GetSceneNameFromScenePath(string scenePath) { return System.IO.Path.GetFileNameWithoutExtension(scenePath); } /// /// Finds a scene in our build settings by name. /// public static bool FindScene(string sceneName, out Scene scene, out int sceneIndex) { scene = default(Scene); sceneIndex = -1; // This is the only method to get all scenes (including unloaded) // This absurdity is necessary due to a long-standing Unity bug // https://issuetracker.unity3d.com/issues/scenemanager-dot-getscenebybuildindex-dot-name-returns-an-empty-string-if-scene-is-not-loaded List allScenesInProject = new List(); for (int i = 0; i < SceneManager.sceneCountInBuildSettings; i++) { string pathToScene = SceneUtility.GetScenePathByBuildIndex(i); string checkSceneName = System.IO.Path.GetFileNameWithoutExtension(pathToScene); if (checkSceneName == sceneName) { scene = SceneManager.GetSceneByBuildIndex(i); sceneIndex = i; return true; } } return false; } /// /// Returns all root GameObjects in all loaded scenes. /// public static IEnumerable GetRootGameObjectsInLoadedScenes() { for (int i = 0; i < SceneManager.sceneCount; i++) { Scene loadedScene = SceneManager.GetSceneAt(i); if (!loadedScene.isLoaded) { continue; } foreach (GameObject rootGameObject in loadedScene.GetRootGameObjects()) { yield return rootGameObject; } } yield break; } /// /// Sets the active scene to the supplied scene. Returns true if successful. /// public static bool SetActiveScene(Scene scene) { if (!scene.IsValid() || !scene.isLoaded) { return false; } try { SceneManager.SetActiveScene(scene); } catch (Exception e) { Debug.LogException(e); return false; } return true; } } }