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