87 lines
2.8 KiB
C#
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;
|
|
}
|
|
}
|
|
} |