コンテンツの読み込みの監視

シーン操作の進行状況

コンテンツが読み込まれるかアンロードされると、 プロパティ SceneOperationInProgress は true を返します。 プロパティを使用して、この操作の進行状況を監視 SceneOperationProgress できます。

SceneOperationProgress は、現在のすべての非同期シーン操作の平均です。 コンテンツの読み込み時に、 SceneOperationProgress は 0 になります。 完全に完了すると、 は 1 に設定され、次の操作が行されるまで SceneOperationProgress 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();
        }
    }
    ...
}

アクションによる監視

シーン システムには、シーンの読み込みまたはアンロードの際に通知するアクションがいくつか含まれています。 各アクションは、影響を受けるシーンの名前をリレーします。

読み込みまたはアンロード操作に複数のシーンが含まれる場合は、影響を受けるシーンごとに関連するアクションが 1 回呼び出されます。 また、読み込みまたはアンロード操作が完全に完了すると、一度 にすべて呼び出されます。 このため 、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 み方法に を渡します。 1 回の操作で複数のコンテンツ シーンが読み込まれている場合は、このアクティブ化トークンがすべてのシーンに適用されます。

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]);
}