İçerik yüklemesini izleme


Eylemlerle izleme

Sahne Sistemi, sahnelerin ne zaman yükleniyor veya kaldırılmış olduğunu size haber veren çeşitli eylemler sağlar. Her eylem etkilenen sahnenin adını iletir.

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. Yükleme veya kaldırma işlemi tam olarak tamamlandığında bunların hepsi aynı anda çağrılır. Bu nedenle, yok edilecek içeriği algılamak için OnWillUnload eylemlerini kullanmanın aksine, yok edilen içeriği algılayan OnUnloaded eylemlerinin aksine, aslında yok edilen içeriği algılamak için kullanılması önerilir.

Çevirme tarafında, OnLoaded eylemleri yalnızca tüm sahneler etkinleştirildiğinde ve tam olarak yüklendiğinde çağrıldığında, yeni içeriği algılamak ve kullanmak için OnLoaded eylemlerinin güvenli olduğu garanti edilir.

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

Eylem örnekleri

Eylemler ve Güncelleştirme yerine bir coroutine kullanan başka bir ilerleme 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ştir olarak ayarlanır. Sahne etkinleştirmeyi el ile kontrol etmek için herhangi bir içerik yükleme SceneActivationToken yöntemine geçebilirsiniz. Tek bir işlem tarafından birden çok içerik sahnesi yükleniyorsa, bu etkinleştirme belirteci tüm sahneler için geçerli olur.

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ükleniyor olduğunu denetleme

özelliği, ContentSceneNames derleme dizini sırasına göre kullanılabilir içerik sahneleri dizisi sağlar. Bu sahnelerin aracılığıyla yükleniyor olup olmadığını kontrol IsContentLoaded(string contentName) edin.

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

Sahne işlemi ilerleme durumu

İçerik yüklenirken veya kaldırılanda özelliği SceneOperationInProgress true değerine döner. bu işlem ilerleme durumunu özelliği aracılığıyla SceneOperationProgress izleyebilirsiniz.

Değer, SceneOperationProgress tüm geçerli zaman uyumsuz sahne işlemlerinin ortalamasıdır. İçerik yüklemesi başlarken SceneOperationProgress sıfır olur. Tam olarak SceneOperationProgress tamamlandıktan sonra, 1 olarak ayarlanır ve sonraki işlem yapılana kadar 1'de kalır. Bu özellikleri yalnızca içerik sahnesi işlemlerinin etkilediğini unutmayın.

Bu özellikler, bir işlem birden çok adımdan oluşursa bile baştan sona tüm bir işlem durumunu gösterir:

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 etkinlik askıya alınırsa 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();
        }
    }
    ...
}