Потеря слежения в Unity
Когда устройство не может найти себя в мире, приложение испытывает "отслеживание потери". По умолчанию Unity приостанавливает цикл обновления и отображает образ-заставку пользователю в любое время, когда отслеживание теряется. После восстановления отслеживания образ-заставка исчезает, и цикл обновления продолжается.
В качестве альтернативы пользователь может вручную обработать этот переход, отказав от параметра. Все содержимое, кажется, будет заблокировано во время отслеживания потери, если ничего не делается для его обработки.
Обработка по умолчанию
Цикл обновления и все сообщения и события будут останавливаться на время потери отслеживания по умолчанию. В то же время изображение будет отображаться пользователю. Этот образ можно настроить, перейдя в раздел "Изменить> параметры-проигрыватель>", щелкнув "Заставка" и установив изображение "Потеря голографического отслеживания".
Обработка вручную
Чтобы вручную обработать потерю отслеживания, необходимо перейти к разделу "Изменить>проигрыватель> параметров>проекта универсальная платформа Windows параметров вкладки>"Заставка">Windows Holographic и снять флажок "При приостановке отслеживания и показать изображение". После этого необходимо обрабатывать изменения отслеживания с помощью API, указанных ниже.
Пространство имен: UnityEngine.XR.WSA
Тип: WorldManager
- World Manager предоставляет событие для обнаружения потери и получения отслеживания (WorldManager.OnPositionalLocatorStateChanged) и свойства для запроса текущего состояния (WorldManager.state)
- Если состояние отслеживания неактивно, камера не будет переводиться в виртуальном мире, даже если пользователь переводит его. Объекты больше не будут соответствовать любому физическому расположению, и все они будут заблокированы.
При обработке изменений отслеживания изменений самостоятельно необходимо провести опрос по свойству состояния каждого кадра или обработать событие OnPositionalLocatorStateChanged .
Опросы
Самое важное состояние — PositionalLocatorState.Active, что означает, что отслеживание является полностью функциональным. Любое другое состояние приведет только к поворотным разностям к основной камере. Например:
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
}
}