mixedreality/com.microsoft.mixedreality..../Core/Utilities/Scenes/RuntimeSceneUtils.cs

87 lines
2.8 KiB
C#

// 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);
}
/// <summary>
/// Finds a scene in our build settings by name.
/// </summary>
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<Scene> allScenesInProject = new List<Scene>();
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;
}
/// <summary>
/// Returns all root GameObjects in all loaded scenes.
/// </summary>
public static IEnumerable<GameObject> 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;
}
/// <summary>
/// Sets the active scene to the supplied scene. Returns true if successful.
/// </summary>
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;
}
}
}