Мониторинг загрузки содержимого — MRTK2
Ход выполнения операции сцены
При загрузке или выгрузке содержимого SceneOperationInProgress
свойство возвращает значение true. Ход выполнения этой операции можно отслеживать с помощью SceneOperationProgress
свойства .
Значение SceneOperationProgress
является средним для всех текущих операций асинхронной сцены. В начале загрузки SceneOperationProgress
содержимого значение будет равно нулю. После полного завершения SceneOperationProgress
будет задано значение 1 и останется на уровне 1 до следующей операции. Обратите внимание, что только операции сцены содержимого влияют на эти свойства.
Эти свойства отражают состояние всей операции от начала до конца, даже если эта операция включает несколько шагов:
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
// First do an additive scene load
// SceneOperationInProgress will be true for the duration of this operation
// SceneOperationProgress will show 0-1 as it completes
await sceneSystem.LoadContent("ContentScene1");
// Now do a single scene load
// This will result in two actions back-to-back
// First "ContentScene1" will be unloaded
// Then "ContentScene2" will be loaded
// SceneOperationInProgress will be true for the duration of this operation
// SceneOperationProgress will show 0-1 as it completes
sceneSystem.LoadContent("ContentScene2", LoadSceneMode.Single)
Примеры хода выполнения
SceneOperationInProgress
может быть полезно, если действие должно быть приостановлено во время загрузки содержимого:
public class FooManager : MonoBehaviour
{
private void Update()
{
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
// Don't update foos while a scene operation is in progress
if (sceneSystem.SceneOperationInProgress)
{
return;
}
// Update foos
...
}
...
}
SceneOperationProgress
можно использовать для отображения диалоговых окон хода выполнения:
public class ProgressDialog : MonoBehaviour
{
private void Update()
{
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
if (sceneSystem.SceneOperationInProgress)
{
DisplayProgressIndicator(sceneSystem.SceneOperationProgress);
}
else
{
HideProgressIndicator();
}
}
...
}
Мониторинг с помощью действий
Система сцен предоставляет несколько действий, чтобы сообщить вам, когда сцены загружаются или выгружаются. Каждое действие передает имя затронутой сцены.
Если операция загрузки или выгрузки включает несколько сцен, соответствующие действия будут вызываться один раз для каждой затронутой сцены. Они также вызываются сразу после полного завершения операции загрузки или выгрузки. По этой причине рекомендуется использовать действия OnWillUnload для обнаружения содержимого, которое будет уничтожено, в отличие от действий OnUnloaded для обнаружения уничтоженного содержимого после факта.
С другой стороны, поскольку действия OnLoaded вызываются только при активации и полной загрузке всех сцен, использование действий OnLoaded для обнаружения и использования нового содержимого гарантируется в безопасности.
Действие | При вызове | Сцены содержимого | Сцены освещения | Сцены руководителя |
---|---|---|---|---|
OnWillLoadContent |
Непосредственно перед загрузкой сцены содержимого | • | ||
OnContentLoaded |
После полной загрузки и активации всех сцен содержимого в операции загрузки | • | ||
OnWillUnloadContent |
Непосредственно перед операцией выгрузки сцены содержимого | • | ||
OnContentUnloaded |
После полной выгрузки всех сцен содержимого в операции выгрузки | • | ||
OnWillLoadLighting |
Непосредственно перед загрузкой сцены освещения | • | ||
OnLightingLoaded |
После полной загрузки и активации сцены освещения | • | ||
OnWillUnloadLighting |
Непосредственно перед выгрузкой сцены освещения | • | ||
OnLightingUnloaded |
После полной выгрузки сцены освещения | • | ||
OnWillLoadScene |
Непосредственно перед загрузкой сцены | • | • | • |
OnSceneLoaded |
После полной загрузки и активации всех сцен в операции | • | • | • |
OnWillUnloadScene |
Непосредственно перед выгрузкой сцены | • | • | • |
OnSceneUnloaded |
После полной выгрузки сцены | • | • | • |
Примеры действий
Еще один пример диалога хода выполнения с использованием действий и сопрограммы вместо Update:
public class ProgressDialog : MonoBehaviour
{
private bool displayingProgress = false;
private void Start()
{
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
sceneSystem.OnWillLoadContent += HandleSceneOperation;
sceneSystem.OnWillUnloadContent += HandleSceneOperation;
}
private void HandleSceneOperation (string sceneName)
{
// This may be invoked multiple times per frame - once per scene being loaded or unloaded.
// So filter the events appropriately.
if (displayingProgress)
{
return;
}
displayingProgress = true;
StartCoroutine(DisplayProgress());
}
private IEnumerator DisplayProgress()
{
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
while (sceneSystem.SceneOperationInProgress)
{
DisplayProgressIndicator(sceneSystem.SceneOperationProgress);
yield return null;
}
HideProgressIndicator();
displayingProgress = false;
}
...
}
Управление активацией сцены
По умолчанию сцены содержимого активируются при загрузке. Если вы хотите управлять активацией сцены вручную, можно передать в любой SceneActivationToken
метод загрузки содержимого. Если одна операция загружает несколько сцен содержимого, этот маркер активации будет применяться ко всем сценам.
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
SceneActivationToken activationToken = new SceneActivationToken();
// Load the content and pass the activation token
sceneSystem.LoadContent(new string[] { "ContentScene1", "ContentScene2", "ContentScene3" }, LoadSceneMode.Additive, activationToken);
// Wait until all users have joined the experience
while (!AllUsersHaveJoinedExperience())
{
await Task.Yield();
}
// Let scene system know we're ready to activate all scenes
activationToken.AllowSceneActivation = true;
// Wait for all scenes to be fully loaded and activated
while (sceneSystem.SceneOperationInProgress)
{
await Task.Yield();
}
// Proceed with experience
Проверка загруженного содержимого
Свойство ContentSceneNames
предоставляет массив доступных сцен содержимого в порядке индекса сборки. Вы можете проверка, загружаются ли эти сцены через IsContentLoaded(string contentName)
.
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
string[] contentSceneNames = sceneSystem.ContentSceneNames;
bool[] loadStatus = new bool[contentSceneNames.Length];
for (int i = 0; i < contentSceneNames.Length; i++>)
{
loadStatus[i] = sceneSystem.IsContentLoaded(contentSceneNames[i]);
}