WebXRInterface
Браузерный XR: сессии, features, ввод и события.
Абстрактный API браузерного WebXR: режимы сессии, features, ввод и события. Конкретный зарегистрированный интерфейс с именем WebXR создаётся в Web-сборке. Наличие SDK-типа в настольном редакторе не запускает browser XR. Текущий C# exporter 1.0.0 не реализует Web target; этот справочник не обещает C# Web export.
Подпишитесь на события до запроса. IsSessionSupported асинхронно сообщает результат через SessionSupported, не выдаёт разрешение и не запускает XR. Initialize устанавливает initialized до окончания запроса; ждите SessionStarted перед включением Viewport.UseXR. SessionEnded/SessionFailed требуют восстановления прежнего UI и viewport. Используйте заимствованный зарегистрированный интерфейс, не освобождайте его вручную.
Настройки применяйте до старта. RequestedReferenceSpaceTypes — порядок fallback; ReferenceSpaceType — фактический выбор. EnabledFeatures может быть пустым, если браузер не предоставляет список. Ввод зависит от источника, его активности и pose data. Select/Squeeze текущий код генерирует после соответствующего end-события: избегайте двойной игровой операции.
GetDisplayRefreshRate не является FPS. Запрос частоты асинхронный; rejected support/refresh promises текущий JS не превращает в SessionFailed. Предусмотрите наблюдаемое состояние ожидания/ошибки. Функции частоты используют integer JS ABI, дробные значения через WASM не проверены.
Запуск и диагностика WebXR. Тела JS-функций проверены с mock browser/session/GL в Node; native callbacks, настоящий экспорт, permissions, шлем, ввод и пиксели не приняты как проверенные. Исходники и сборка движка не менялись.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Свойства8
DisableWebxrLayersСвойство
public bool DisableWebxrLayers { get; set; }Сохранённый флаг отключения WebXR Layers, изначально false. Задавайте до Initialize; true выбирает XRWebGLLayer fallback. Фактический fallback возможен и при false из-за отсутствия multiview/binding/createProjectionLayer. Getter не сообщает реально выбранный рендер-путь и не является уровнем качества.
EnabledFeaturesСвойство
public string EnabledFeatures { get; }Сообщённые браузером принятые features строкой через запятую после SessionStarted. Это не копия RequiredFeatures/OptionalFeatures. Если браузер не предоставляет enabledFeatures, JS возвращает пустую строку, что не доказывает отсутствие всех возможностей. Uninitialize очищает значение.
OptionalFeaturesСвойство
public string OptionalFeatures { get; set; }Строка необязательных features через запятую, изначально пустая. Применяется при следующем запросе сессии; setter только сохраняет строку. Отсутствие optional feature не должно ломать основной сценарий: после SessionStarted проверяйте EnabledFeatures, а не только этот список.
ReferenceSpaceTypeСвойство
public string ReferenceSpaceType { get; }Реально выбранное пространство после SessionStarted, не первая строка RequestedReferenceSpaceTypes. До готовности может быть пустым; Uninitialize очищает его. Если выбран local, не считайте Y=0 физическим полом.
RequestedReferenceSpaceTypesСвойство
public string RequestedReferenceSpaceTypes { get; set; }Список пространств через запятую в порядке попыток, по умолчанию local. Например local-floor,local: fallback к local меняет смысл высоты, это не гарантированный пол. Запрашивайте нужные features отдельно. Полностью пустая строка вызывает раннюю ошибку Initialize; не добавляйте пустые элементы списка.
RequiredFeaturesСвойство
public string RequiredFeatures { get; set; }Строка обязательных features через запятую, изначально пустая. До Initialize задайте только необходимые функции, например local-floor. JS удаляет пустые элементы и пробелы. Неподдерживаемая обязательная feature может сорвать запрос; сохранённая строка не подтверждает разрешение.
SessionModeСвойство
public string SessionMode { get; set; }Запрошенный режим сессии: inline, immersive-vr или immersive-ar; по умолчанию inline. Setter сохраняет строку для следующего старта, не проверяет поддержку и не переключает действующую сессию. Нужный режим отдельно проверяют через IsSessionSupported.
VisibilityStateСвойство
public string VisibilityState { get; }Текущее browser visibilityState сессии: обычно visible, visible-blurred или hidden; пустая строка, если сессия/данные отсутствуют. Это состояние видимости XR-сессии, не готовность геометрии и не HasTrackingData отдельного устройства. Перечитывайте при VisibilityStateChanged.
Методы20
GetAvailableDisplayRefreshRatesReckfell.Collections.Array
public Reckfell.Collections.Array GetAvailableDisplayRefreshRates();Возвращает новый контейнер частот из browser supportedFrameRates; пустой при отсутствии сессии, свойства или элементов. Список не измеряет производительность и не гарантирует принятие каждого запроса сейчас. Освобождайте собственный Array-контейнер обычным Dispose/using; это не владельцы XR-устройств.
Reckfell.Collections.ArrayНовый Array частот, возможно пустой. Владение контейнером у вызывающего кода.
GetDisableWebxrLayersbool
public bool GetDisableWebxrLayers();Возвращает сохранённое значение. Сохранённый флаг отключения WebXR Layers, изначально false. Задавайте до Initialize; true выбирает XRWebGLLayer fallback. Фактический fallback возможен и при false из-за отсутствия multiview/binding/createProjectionLayer. Getter не сообщает реально выбранный рендер-путь и не является уровнем качества.
boolСохранённый флаг отключения WebXR Layers, изначально false. Задавайте до Initialize; true выбирает XRWebGLLayer fallback. Фактический fallback возможен и при false из-за отсутствия multiview/binding/createProjectionLayer. Getter не сообщает реально выбранный рендер-путь и не является уровнем качества.
GetDisplayRefreshRatefloat
public float GetDisplayRefreshRate();Читает session.frameRate браузера; 0, если сессии или поля нет. Это не измеренный FPS приложения и не сохранённая целевая частота. Функция JS объявлена с integer ABI; дробные значения через реальную WASM границу здесь не проверены.
floatСообщённая браузером частота или 0 при недоступности; не FPS приложения.
GetEnabledFeaturesstring
public string GetEnabledFeatures();Читает текущее значение. Сообщённые браузером принятые features строкой через запятую после SessionStarted. Это не копия RequiredFeatures/OptionalFeatures. Если браузер не предоставляет enabledFeatures, JS возвращает пустую строку, что не доказывает отсутствие всех возможностей. Uninitialize очищает значение.
stringСообщённые браузером принятые features строкой через запятую после SessionStarted. Это не копия RequiredFeatures/OptionalFeatures. Если браузер не предоставляет enabledFeatures, JS возвращает пустую строку, что не доказывает отсутствие всех возможностей. Uninitialize очищает значение.
GetInputSourceTargetRayModeWebXRInterface.TargetRayMode
public WebXRInterface.TargetRayMode GetInputSourceTargetRayMode(int inputSourceId);Возвращает режим луча активного слота: Gaze, TrackedPointer или Screen. Для неактивного/неверного индекса — Unknown; неверный индекс также вызывает native error. Режим луча не подтверждает наличие grip, кнопок или hand skeleton.
| Имя | Тип | По умолчанию |
|---|---|---|
inputSourceId | int | — |
inputSourceIdID слота WebXR, допустимый диапазон 0–15. Это временный источник, не gamepad index или постоянный ID устройства; проверяйте активность и tracking data.
WebXRInterface.TargetRayModeРежим активного источника либо Unknown; не подтверждение физического контроллера.
GetInputSourceTrackerXRControllerTracker
public XRControllerTracker GetInputSourceTracker(int inputSourceId);Возвращает заимствованный XRControllerTracker слота или null. Проверяйте активность и данные нужной pose; не вызывайте Free/Dispose у provider-owned wrapper. Слот и его tracker могут исчезнуть или использоваться заново; не сохраняйте их как постоянную идентичность устройства.
| Имя | Тип | По умолчанию |
|---|---|---|
inputSourceId | int | — |
inputSourceIdID слота WebXR, допустимый диапазон 0–15. Это временный источник, не gamepad index или постоянный ID устройства; проверяйте активность и tracking data.
XRControllerTrackerЗаимствованный tracker или null; владение не передаётся.
GetOptionalFeaturesstring
public string GetOptionalFeatures();Возвращает сохранённое значение. Строка необязательных features через запятую, изначально пустая. Применяется при следующем запросе сессии; setter только сохраняет строку. Отсутствие optional feature не должно ломать основной сценарий: после SessionStarted проверяйте EnabledFeatures, а не только этот список.
stringСтрока необязательных features через запятую, изначально пустая. Применяется при следующем запросе сессии; setter только сохраняет строку. Отсутствие optional feature не должно ломать основной сценарий: после SessionStarted проверяйте EnabledFeatures, а не только этот список.
GetReferenceSpaceTypestring
public string GetReferenceSpaceType();Читает текущее значение. Реально выбранное пространство после SessionStarted, не первая строка RequestedReferenceSpaceTypes. До готовности может быть пустым; Uninitialize очищает его. Если выбран local, не считайте Y=0 физическим полом.
stringРеально выбранное пространство после SessionStarted, не первая строка RequestedReferenceSpaceTypes. До готовности может быть пустым; Uninitialize очищает его. Если выбран local, не считайте Y=0 физическим полом.
GetRequestedReferenceSpaceTypesstring
public string GetRequestedReferenceSpaceTypes();Возвращает сохранённое значение. Список пространств через запятую в порядке попыток, по умолчанию local. Например local-floor,local: fallback к local меняет смысл высоты, это не гарантированный пол. Запрашивайте нужные features отдельно. Полностью пустая строка вызывает раннюю ошибку Initialize; не добавляйте пустые элементы списка.
stringСписок пространств через запятую в порядке попыток, по умолчанию local. Например local-floor,local: fallback к local меняет смысл высоты, это не гарантированный пол. Запрашивайте нужные features отдельно. Полностью пустая строка вызывает раннюю ошибку Initialize; не добавляйте пустые элементы списка.
GetRequiredFeaturesstring
public string GetRequiredFeatures();Возвращает сохранённое значение. Строка обязательных features через запятую, изначально пустая. До Initialize задайте только необходимые функции, например local-floor. JS удаляет пустые элементы и пробелы. Неподдерживаемая обязательная feature может сорвать запрос; сохранённая строка не подтверждает разрешение.
stringСтрока обязательных features через запятую, изначально пустая. До Initialize задайте только необходимые функции, например local-floor. JS удаляет пустые элементы и пробелы. Неподдерживаемая обязательная feature может сорвать запрос; сохранённая строка не подтверждает разрешение.
GetSessionModestring
public string GetSessionMode();Возвращает сохранённое значение. Запрошенный режим сессии: inline, immersive-vr или immersive-ar; по умолчанию inline. Setter сохраняет строку для следующего старта, не проверяет поддержку и не переключает действующую сессию. Нужный режим отдельно проверяют через IsSessionSupported.
stringЗапрошенный режим сессии: inline, immersive-vr или immersive-ar; по умолчанию inline. Setter сохраняет строку для следующего старта, не проверяет поддержку и не переключает действующую сессию. Нужный режим отдельно проверяют через IsSessionSupported.
GetVisibilityStatestring
public string GetVisibilityState();Читает текущее значение. Текущее browser visibilityState сессии: обычно visible, visible-blurred или hidden; пустая строка, если сессия/данные отсутствуют. Это состояние видимости XR-сессии, не готовность геометрии и не HasTrackingData отдельного устройства. Перечитывайте при VisibilityStateChanged.
stringТекущее browser visibilityState сессии: обычно visible, visible-blurred или hidden; пустая строка, если сессия/данные отсутствуют. Это состояние видимости XR-сессии, не готовность геометрии и не HasTrackingData отдельного устройства. Перечитывайте при VisibilityStateChanged.
IsInputSourceActivebool
public bool IsInputSourceActive(int inputSourceId);Читает активность слота источника WebXR. Допустимы ID 0–15; неверный индекс даёт native error и false. true не гарантирует grip pose, физический контроллер или все кнопки. Не путайте ID источника с gamepad index.
| Имя | Тип | По умолчанию |
|---|---|---|
inputSourceId | int | — |
inputSourceIdID слота WebXR, допустимый диапазон 0–15. Это временный источник, не gamepad index или постоянный ID устройства; проверяйте активность и tracking data.
boolАктивность слота сейчас; неверный индекс возвращает false с native error.
IsSessionSupportedvoid
public void IsSessionSupported(string sessionMode);Асинхронно запрашивает поддержку указанного режима; bool не возвращает и сессию не запускает. Подпишитесь на SessionSupported заранее и сопоставьте sessionMode ответа. В текущем JS-мосте нет обработки rejected promise: предусмотрите тайм-аут ожидания, не выдавая его за подтверждённый false.
| Имя | Тип | По умолчанию |
|---|---|---|
sessionMode | string | — |
sessionModeРежим inline, immersive-vr или immersive-ar. Поддержка и разрешение проверяются для конкретного режима отдельно.
SetDisableWebxrLayersvoid
public void SetDisableWebxrLayers(bool disable);Сохраняет настройку; действующий browser session не пересоздаёт. Сохранённый флаг отключения WebXR Layers, изначально false. Задавайте до Initialize; true выбирает XRWebGLLayer fallback. Фактический fallback возможен и при false из-за отсутствия multiview/binding/createProjectionLayer. Getter не сообщает реально выбранный рендер-путь и не является уровнем качества.
| Имя | Тип | По умолчанию |
|---|---|---|
disable | bool | — |
disableСохранённый флаг отключения WebXR Layers, изначально false. Задавайте до Initialize; true выбирает XRWebGLLayer fallback. Фактический fallback возможен и при false из-за отсутствия multiview/binding/createProjectionLayer. Getter не сообщает реально выбранный рендер-путь и не является уровнем качества.
SetDisplayRefreshRatevoid
public void SetDisplayRefreshRate(float refreshRate);Асинхронно просит session.updateTargetFrameRate установить частоту. Без сессии или метода молча ничего не делает. Выбирайте значение из доступного списка; применение не гарантировано. После успешного promise приходит DisplayRefreshRateChanged. У текущего моста нет rejection handler или отдельного события ошибки запроса.
| Имя | Тип | По умолчанию |
|---|---|---|
refreshRate | float | — |
refreshRateЗапрашиваемая частота в Гц из списка устройства; не желаемый FPS игры. Текущий JS ABI параметра integer, дробные частоты через WASM здесь не проверены.
SetOptionalFeaturesvoid
public void SetOptionalFeatures(string optionalFeatures);Сохраняет настройку; действующий browser session не пересоздаёт. Строка необязательных features через запятую, изначально пустая. Применяется при следующем запросе сессии; setter только сохраняет строку. Отсутствие optional feature не должно ломать основной сценарий: после SessionStarted проверяйте EnabledFeatures, а не только этот список.
| Имя | Тип | По умолчанию |
|---|---|---|
optionalFeatures | string | — |
optionalFeaturesСтрока необязательных features через запятую, изначально пустая. Применяется при следующем запросе сессии; setter только сохраняет строку. Отсутствие optional feature не должно ломать основной сценарий: после SessionStarted проверяйте EnabledFeatures, а не только этот список.
SetRequestedReferenceSpaceTypesvoid
public void SetRequestedReferenceSpaceTypes(string requestedReferenceSpaceTypes);Сохраняет настройку; действующий browser session не пересоздаёт. Список пространств через запятую в порядке попыток, по умолчанию local. Например local-floor,local: fallback к local меняет смысл высоты, это не гарантированный пол. Запрашивайте нужные features отдельно. Полностью пустая строка вызывает раннюю ошибку Initialize; не добавляйте пустые элементы списка.
| Имя | Тип | По умолчанию |
|---|---|---|
requestedReferenceSpaceTypes | string | — |
requestedReferenceSpaceTypesСписок пространств через запятую в порядке попыток, по умолчанию local. Например local-floor,local: fallback к local меняет смысл высоты, это не гарантированный пол. Запрашивайте нужные features отдельно. Полностью пустая строка вызывает раннюю ошибку Initialize; не добавляйте пустые элементы списка.
SetRequiredFeaturesvoid
public void SetRequiredFeatures(string requiredFeatures);Сохраняет настройку; действующий browser session не пересоздаёт. Строка обязательных features через запятую, изначально пустая. До Initialize задайте только необходимые функции, например local-floor. JS удаляет пустые элементы и пробелы. Неподдерживаемая обязательная feature может сорвать запрос; сохранённая строка не подтверждает разрешение.
| Имя | Тип | По умолчанию |
|---|---|---|
requiredFeatures | string | — |
requiredFeaturesСтрока обязательных features через запятую, изначально пустая. До Initialize задайте только необходимые функции, например local-floor. JS удаляет пустые элементы и пробелы. Неподдерживаемая обязательная feature может сорвать запрос; сохранённая строка не подтверждает разрешение.
SetSessionModevoid
public void SetSessionMode(string sessionMode);Сохраняет настройку; действующий browser session не пересоздаёт. Запрошенный режим сессии: inline, immersive-vr или immersive-ar; по умолчанию inline. Setter сохраняет строку для следующего старта, не проверяет поддержку и не переключает действующую сессию. Нужный режим отдельно проверяют через IsSessionSupported.
| Имя | Тип | По умолчанию |
|---|---|---|
sessionMode | string | — |
sessionModeРежим inline, immersive-vr или immersive-ar. Поддержка и разрешение проверяются для конкретного режима отдельно.
Сигналы и события13
DisplayRefreshRateChangedСобытие
public event Action DisplayRefreshRateChanged;Уведомление без аргументов после успешного updateTargetFrameRate promise. Перечитайте GetDisplayRefreshRate; это не событие каждого кадра и не счётчик FPS. При отсутствии метода запрос игнорируется; rejected promise не преобразуется в SessionFailed.
ReferenceSpaceResetСобытие
public event Action ReferenceSpaceReset;Событие без аргументов от reset выбранного reference space. Пересмотрите привязки игрового мира к пространству; текущее событие не передаёт исходный browser transform. Не применяйте дополнительное recenter автоматически поверх настроенного origin.
SelectСобытие
public event WebXRInterface.SelectEventHandler Select;Завершение действия основного выбора, синтезируемое текущим native-кодом сразу после Selectend. Не отдельное прямое browser-событие и не начало удержания. Выберите одно completion-событие для однократной игровой операции.
| Имя | Тип | По умолчанию |
|---|---|---|
inputSourceId | long | — |
inputSourceIdID слота WebXR, допустимый диапазон 0–15. Это временный источник, не gamepad index или постоянный ID устройства; проверяйте активность и tracking data.
SelectendСобытие
public event WebXRInterface.SelectendEventHandler Selectend;Конец действия основного выбора источника; текущий native-код затем отдельно генерирует Select. Не обрабатывайте оба события как две независимые покупки/выстрела.
| Имя | Тип | По умолчанию |
|---|---|---|
inputSourceId | long | — |
inputSourceIdID слота WebXR, допустимый диапазон 0–15. Это временный источник, не gamepad index или постоянный ID устройства; проверяйте активность и tracking data.
SelectstartСобытие
public event WebXRInterface.SelectstartEventHandler Selectstart;Начало действия основного выбора источника. Перед событием native-код обновляет input source. Не означает наличие trigger/grip кнопки у любого устройства; используйте переданный ID и режим луча.
| Имя | Тип | По умолчанию |
|---|---|---|
inputSourceId | long | — |
inputSourceIdID слота WebXR, допустимый диапазон 0–15. Это временный источник, не gamepad index или постоянный ID устройства; проверяйте активность и tracking data.
SessionEndedСобытие
public event Action SessionEnded;Browser end уведомление после native Uninitialize. Восстановите прежний Viewport.UseXR, обычный UI и собственное состояние. Не считайте, что каждый прямой вызов Uninitialize обязан синхронно породить это событие; не начинайте бесконечный автоперезапуск.
SessionFailedСобытие
public event WebXRInterface.SessionFailedEventHandler SessionFailed;Ошибка ранней проверки или асинхронного старта с текстом причины. Ранний отказ возможен внутри Initialize; browser-failure callback сначала делает Uninitialize. Восстановите UI/viewport и сохраните message. Это не универсальное событие всех ошибок: rejected support/refresh promises текущий мост не обрабатывает.
| Имя | Тип | По умолчанию |
|---|---|---|
message | string | — |
messageПричина отказа старта. Сохраните для диагностики и покажите пользователю понятный результат; не подменяйте сообщение утверждением об отсутствии шлема.
SessionStartedСобытие
public event Action SessionStarted;Событие после создания browser session, настройки GL и получения reference space. После него читайте ReferenceSpaceType/EnabledFeatures и включайте Viewport.UseXR. Не заменяйте ожидание события проверкой true из Initialize: initialized выставляется раньше. Событие не подтверждает качество пикселей или наличие контроллеров.
SessionSupportedСобытие
public event WebXRInterface.SessionSupportedEventHandler SessionSupported;Результат IsSessionSupported: режим и bool поддержки. Не разрешение на запуск, не проверка required features и не подтверждение будущего успешного Initialize. При отсутствии navigator.xr мост сообщает false; rejected browser promise сейчас может не дать событие.
| Имя | Тип | По умолчанию |
|---|---|---|
sessionMode | string | — |
supported | bool | — |
sessionModeРежим inline, immersive-vr или immersive-ar. Поддержка и разрешение проверяются для конкретного режима отдельно.
supportedРезультат проверки поддержки режима; true не подтверждает пользовательское разрешение или обязательные features будущего запроса.
SqueezeСобытие
public event WebXRInterface.SqueezeEventHandler Squeeze;Завершение действия сжатия, синтезируемое текущим native-кодом сразу после Squeezeend. Не отдельное прямое browser-событие и не начало удержания. Выберите одно completion-событие для однократной игровой операции.
| Имя | Тип | По умолчанию |
|---|---|---|
inputSourceId | long | — |
inputSourceIdID слота WebXR, допустимый диапазон 0–15. Это временный источник, не gamepad index или постоянный ID устройства; проверяйте активность и tracking data.
SqueezeendСобытие
public event WebXRInterface.SqueezeendEventHandler Squeezeend;Конец действия сжатия источника; текущий native-код затем отдельно генерирует Squeeze. Не обрабатывайте оба события как две независимые покупки/выстрела.
| Имя | Тип | По умолчанию |
|---|---|---|
inputSourceId | long | — |
inputSourceIdID слота WebXR, допустимый диапазон 0–15. Это временный источник, не gamepad index или постоянный ID устройства; проверяйте активность и tracking data.
SqueezestartСобытие
public event WebXRInterface.SqueezestartEventHandler Squeezestart;Начало действия сжатия источника. Перед событием native-код обновляет input source. Не означает наличие trigger/grip кнопки у любого устройства; используйте переданный ID и режим луча.
| Имя | Тип | По умолчанию |
|---|---|---|
inputSourceId | long | — |
inputSourceIdID слота WebXR, допустимый диапазон 0–15. Это временный источник, не gamepad index или постоянный ID устройства; проверяйте активность и tracking data.
VisibilityStateChangedСобытие
public event Action VisibilityStateChanged;Событие без аргументов от browser visibilitychange. Перечитайте VisibilityState и обновите паузу/интерфейс по политике игры. Не означает завершение сессии, появление модели или восстановление трекинга.
WebXRInterface.TargetRayMode
| Значение | Описание |
|---|---|
Gaze = 1 | Луч цели исходит из глаз наблюдателя и указывает в направлении его взгляда. |
Screen = 3 | Направляет луч с сенсорного экрана, мыши или другого тактильного устройства ввода. |
TrackedPointer = 2 | Направляет луч от портативной указки, скорее всего, сенсорного контроллера виртуальной реальности. |
Unknown = 0 | Мы не знаем целевой режим луча. |