监测内容加载 Monitoring Content Loading
场景操作进展 Scene Operation Progress
当内容被加载或卸载时SceneOperationInProgress
属性将返回true。您可以通过SceneOperationInProgress
属性监视此操作的进度。
SceneOperationProgress
值是当前所有异步场景操作的平均值。在内容加载开始时, SceneOperationProgress
将为零。一旦完全完成, SceneOperationProgress
将被设置为1,并将保持为1,直到下一次操作发生。请注意,只有内容场景的操作才会影响这些属性。
这些属性反映了一个整个操作从开始到结束的状态,即使该操作包含多个步骤:
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
//首先做一个附加的场景加载
// SceneOperationInProgress在整个操作过程中都是 true
// SceneOperationProgress将显示0-1,作为完成。
await sceneSystem.LoadContent("ContentScene1");
//现在加载一个场景
//这将导致两个连续的动作
//首先“ContentScene1”将被卸载
//然后“ContentScene2”将被加载
// SceneOperationInProgress在整个操作过程中都是true
// SceneOperationProgress将显示0-1,作为完成。
sceneSystem.LoadContent("ContentScene2", LoadSceneMode.Single)
进程示例 Progress Examples
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();
}
}
...
}
监测动作 Monitoring With Actions
The Scene System provides several actions to let you know when scenes are being loaded or unloaded. Each action relays the name of the affected scene.
场景系统提供了几个动作(actions),让您知道何时加载或卸载场景。每个动作都会转述受影响场景的名称。
如果加载或卸载操作涉及多个场景,则每个受影响的场景将调用一次相关操作。当加载或卸载操作完全完成时,也会同时调用它们。由于这个原因,建议您使用OnWillUnload操作来检测将要被销毁的内容,而不是使用OnUnloaded操作来检测销毁后的内容。
另一方面,由于OnLoaded操作只在所有场景激活并完全加载时调用,因此使用OnLoaded操作来检测和使用新内容是肯定安全的。
动作 | 何时调用 | 内容场景 | 光照场景 | Manager 场景 |
---|---|---|---|---|
OnWillLoadContent |
在一个内容场景加载之前 | • | ||
OnContentLoaded |
加载操作中的所有内容场景都已完全加载并激活之后 | • | ||
OnWillUnloadContent |
在内容场景卸载操作之前 | • | ||
OnContentUnloaded |
卸载操作中的所有内容场景完全卸载之后 | • | ||
OnWillLoadLighting |
在一个光照场景加载之前 | • | ||
OnLightingLoaded |
在一个光照场景已经完全加载和激活后 | • | ||
OnWillUnloadLighting |
在一个光照场景卸载之前 | • | ||
OnLightingUnloaded |
在一个照明场景已经完全卸载后 | • | ||
OnWillLoadScene |
在一个场景加载之前 | • | • | • |
OnSceneLoaded |
在操作中的所有场景都被完全加载并激活之后 | • | • | • |
OnWillUnloadScene |
在一个场景卸载之前 | • | • | • |
OnSceneUnloaded |
在一个场景完全卸载后 | • | • | • |
动作示例 Action Examples
另一个使用动作和协程代替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)
{
// 每个帧可以调用多次——每个场景加载或卸载一次.
// 因此,适当地过滤事件.
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;
}
...
}
控制场景激活 Controlling Scene Activation
默认情况下,内容场景在加载时被设置为激活。如果你想手动控制场景激活,你可以向任何内容加载方法传递一个 SceneActivationToken
。如果单个操作加载多个内容场景,则此激活token将应用于所有场景。
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
SceneActivationToken activationToken = new SceneActivationToken();
// 加载内容并传递 activation token
sceneSystem.LoadContent(new string[] { "ContentScene1", "ContentScene2", "ContentScene3" }, LoadSceneMode.Additive, activationToken);
// 等待所有用户都加入 experience
while (!AllUsersHaveJoinedExperience())
{
await Task.Yield();
}
// 让 scene system 知道我们已经准备好激活所有场景
activationToken.AllowSceneActivation = true;
// 等待所有场景全部加载并激活
while (sceneSystem.SceneOperationInProgress)
{
await Task.Yield();
}
// Proceed with experience
检查加载了哪些内容 Checking which content is loaded
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]);
}