İçerik yüklemesini izleme — MRTK2

Sahne işlemi ilerleme durumu

İçerik yüklenirken veya kaldırılırken özelliği SceneOperationInProgress true değerini döndürür. Bu işlemin ilerleme durumunu özelliği aracılığıyla SceneOperationProgress izleyebilirsiniz.

SceneOperationProgress Değer, tüm geçerli zaman uyumsuz sahne işlemlerinin ortalamasıdır. İçerik yükünün SceneOperationProgress başlangıcında sıfır olacaktır. Tam olarak tamamlandıktan sonra, SceneOperationProgress 1 olarak ayarlanır ve bir sonraki işlem gerçekleşene kadar 1'de kalır. Yalnızca içerik sahnesi işlemlerinin bu özellikleri etkilediğini unutmayın.

Bu özellikler, işlem birden çok adım içerse bile baştan sona tüm işlemin durumunu yansıtır:

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)

İlerleme örnekleri

SceneOperationInProgress içerik yüklenirken etkinliğin askıya alınması gerekiyorsa yararlı olabilir:

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 ilerleme durumu iletişim kutularını görüntülemek için kullanılabilir:

public class ProgressDialog : MonoBehaviour
{
    private void Update()
    {
        IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();

        if (sceneSystem.SceneOperationInProgress)
        {
            DisplayProgressIndicator(sceneSystem.SceneOperationProgress);
        }
        else
        {
            HideProgressIndicator();
        }
    }
    ...
}

Eylemlerle izleme

Sahne Sistemi, sahnelerin ne zaman yüklendiğini veya kaldırıldığını size bildirmek için çeşitli eylemler sağlar. Her eylem, etkilenen sahnenin adını aktarır.

Bir yükleme veya kaldırma işlemi birden çok sahne içeriyorsa, etkilenen sahne başına ilgili eylemler bir kez çağrılır. Ayrıca, yükleme veya kaldırma işlemi tam olarak tamamlandığında hepsi bir kerede çağrılır. Bu nedenle, yok edilecek içeriği algılamak için OnWillUnload eylemlerini kullanmanız önerilir. Bunun yerine, yok edilen içeriği algılamak için OnUnloaded eylemleri kullanmanız önerilir.

Ters çevirme tarafında, Yüklü eylemler yalnızca tüm sahneler etkinleştirildiğinde ve tamamen yüklendiğinde çağrıldığından, yeni içeriği algılamak ve kullanmak için Yüklü eylemlerin kullanılması güvenli olması garanti edilir.

Eylem Çağrıldığında İçerik Sahneleri Aydınlatma Sahneleri Yönetici Sahneleri
OnWillLoadContent İçerik sahnesi yüklemeden hemen önce
OnContentLoaded Bir yükleme işlemindeki tüm içerik sahneleri tamamen yüklendikten ve etkinleştirildikten sonra
OnWillUnloadContent İçerik sahnesi kaldırma işleminden hemen önce
OnContentUnloaded Bir kaldırma işlemindeki tüm içerik sahneleri tamamen kaldırıldıktan sonra
OnWillLoadLighting Aydınlatma sahnesi yüklemeden hemen önce
OnLightingLoaded Bir aydınlatma sahnesi tamamen yüklendikten ve etkinleştirildikten sonra
OnWillUnloadLighting Bir aydınlatma sahnesi boşaltmadan hemen önce
OnLightingUnloaded Bir aydınlatma sahnesi tamamen boşaltıldıktan sonra
OnWillLoadScene Sahne yüklemeden hemen önce
OnSceneLoaded Bir işlemdeki tüm sahneler tamamen yüklendikten ve etkinleştirildikten sonra
OnWillUnloadScene Sahne kaldırmadan hemen önce
OnSceneUnloaded Bir sahne tamamen kaldırıldıktan sonra

Eylem örnekleri

Güncelleştirme yerine eylemler ve bir eş yordam kullanan başka bir ilerleme durumu iletişim kutusu örneği:

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

    ...
}

Sahne etkinleştirmeyi denetleme

Varsayılan olarak içerik sahneleri yüklendiğinde etkinleştirecek şekilde ayarlanır. Sahne etkinleştirmeyi el ile denetlemek istiyorsanız, herhangi bir içerik yükleme yöntemine geçirebilirsiniz SceneActivationToken . Tek bir işlem tarafından birden çok içerik sahnesi yükleniyorsa, bu etkinleştirme belirteci tüm sahnelere uygulanır.

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

Hangi içeriğin yüklendiğini denetleme

özelliği, ContentSceneNames derleme dizinine göre bir dizi kullanılabilir içerik sahnesi sağlar. Bu sahnelerin aracılığıyla IsContentLoaded(string contentName)yüklenip yüklenmediğini de kontrol edebilirsiniz.

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