Потеря слежения в Unity

Если устройство не может найти себя в мире, приложение испытывает "отслеживание потери". По умолчанию Unity приостанавливает цикл обновления и отображает пользователю изображение-заставку при потере отслеживания. После восстановления отслеживания образ-заставка исчезает, а цикл обновления продолжается.

В качестве альтернативы пользователь может вручную обработать этот переход, отказаясь от этого параметра. Все содержимое будет казаться заблокированным во время отслеживания потери, если ничего не делается для его обработки.

Обработка по умолчанию

Цикл обновления и все сообщения и события по умолчанию будут останавливаться на время отслеживания потерь. В то же время пользователю будет отображаться изображение. Этот образ можно настроить, перейдя в раздел Edit-Settings-Player>, щелкнув изображение-заставку> и задав изображение голографического отслеживания потери.

Ручная обработка

Чтобы вручную обработать отслеживание потерь, перейдите в раздел Изменение>параметров> проектаПроигрыватель>универсальная платформа Windows вкладку> Параметрызаставки Изображение>Windows Holographic и снимите флажок "При отслеживании потери пауза и показать изображение". После этого необходимо обработать изменения отслеживания с помощью указанных ниже API.

Пространство имен:UnityEngine.XR.WSA
Тип:WorldManager

  • World Manager предоставляет событие для обнаружения потерянных и полученных данных отслеживания (WorldManager.OnPositionalLocatorStateChanged) и свойства для запроса текущего состояния (WorldManager.state)
  • Если состояние отслеживания неактивно, камера не будет отображаться для перевода в виртуальном мире, даже когда пользователь переводит. Объекты больше не будут соответствовать какому-либо физическому расположению, и все они будут отображаться как заблокированные.

При обработке изменений отслеживания самостоятельно необходимо опросить свойство состояния для каждого кадра или обработать событие OnPositionalLocatorStateChanged .

Опрос

Наиболее важным состоянием является PositionalLocatorState.Active, что означает полное функционирование отслеживания. Любое другое состояние приведет к вращению только к main камере. Пример:

void Update()
{
    switch (UnityEngine.XR.WSA.WorldManager.state)
    {
        case PositionalLocatorState.Active:
            // handle active
            break;
        case PositionalLocatorState.Activating:
        case PositionalLocatorState.Inhibited:
        case PositionalLocatorState.OrientationOnly:
        case PositionalLocatorState.Unavailable:
        default:
            // only rotational information is available
            break;
    }
}

Обработка события OnPositionalLocatorStateChanged

Удобнее также подписаться на OnPositionalLocatorStateChanged для обработки переходов:

void Start()
{
    UnityEngine.XR.WSA.WorldManager.OnPositionalLocatorStateChanged += WorldManager_OnPositionalLocatorStateChanged;
}

private void WorldManager_OnPositionalLocatorStateChanged(PositionalLocatorState oldState, PositionalLocatorState newState)
{
    if (newState == PositionalLocatorState.Active)
    {
        // Handle becoming active
    }
    else
    {
        // Handle becoming rotational only
    }
}

См. также раздел