Общая схема работы

Стандарт компонентов ввода разработан для поддержки адаптивного управления. Это означает, что стандарт поддерживает различные устройства ввода (в частности, клавиатуру, геймпад, мышь и сенсорный экран), а также поддерживает динамическую конфигурацию управления внешней системой настроек управления. Общая схема работы стандарта выглядит следующим образом:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/9b663c40-380c-4e8c-a63a-4dcf772f7173/Untitled.png

Раскладка управления состоит из произвольного количества элементов управления. В элементе управления сначала происходят вычисления состояний всех InputComponentController-ов, затем они собираются в InputHubController, затем общее значение по необходимости корректируется компонентом InputPostprocessController и отправляется во внешний компонент управления аватаром.

Input component controller

Класс InputComponentController является базовым для всех компонентов аппаратного ввода. Стандарт включает в себя минимальный набор компонентов аппаратного ввода, которые условно разделены на две группы: механические (mechanical) и сенсорные (touchscreen). Дерево наследования выглядит следующим образом:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a5803b0c-d47f-4496-a736-49ccee86e2d6/Untitled.png

В наследниках класса InputComponentController производится привязка к кнопкам/осям устройства ввода и настройка различных параметров ввода (такие как чувствительность, инверсия и др.). Например, компонент MechanicalDirection2DController, настроенный на приём ввода с геймпада, выглядит следующим образом:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/34e4bdf2-da05-4377-92bd-c049a6af38cf/Untitled.png

Input hub controller

Компонент InputHubController является агрегатором всех компонентов InputComponentController для элемента управления. Как видно из общей схемы, InputHubController поддерживает до четырёх аппаратных вариаций управления (то есть клавиатуру, мышь, геймпад и тачскрин). В зависимости от того, какой из компонентов InputComponentController является активным, InputHubController берёт соответствующие данные ввода и определяет режим ввода. Если несколько компонентов InputComponentController оказываются активными, то InputHubController выбирает приоритетный исходя из установленного порядка:

  1. Touchscreen
  2. Gamepad
  3. Mouse
  4. Keyboard

Помимо четырёх ссылок на компоненты ввода различных устройств, InputHubController также имеет свойство-перечисление inputMode, значение которого указывает на текущее активное устройство ввода и событие OnInputModeChanged, срабатывающее в момент переключения активного устройства ввода. В редакторе InputHubController выглядит следующим образом: