Документация Steamworks
Слои наборов действий
Слои наборов действий — это необязательные наборы раскладок действий, которые могут быть наложены на существующие наборы. В отличие от наборов действий, слои получают действия от наборов действий, внутри которых они заданы, и не заменяют полностью всё, что было задано на момент их применения: они представляют собой небольшие изменения. Они могут быть как изменением настроек, так и добавлением или удалением привязок действий из базового набора действий. Одновременно могут быть применены несколько слоёв, которые будут применены последовательно.

С технической точки зрения ограничения на количество одновременно активных слоёв нет, но на практике слишком большое число слоёв в интерфейсе ввода Steam запутает игроков.

Обратите внимание, что:
  • Активация уже активного набора действий не повлияет на его слои.
  • Активация нового набора действий очистит все активные слои старого набора.
  • Активация уже активного слоя набора действий ни на что не повлияет.
  • Активация уже активного слоя набора действий не повлияет на его порядок в стеке.
  • Активация слоя набора действий после его деактивации выведет его наверх в стеке.
  • Вызов ActivateActionSetLayer требует мало ресурсов, поэтому его можно спокойно вызывать несколько раз (но см. выноску ниже).

    Осторожнее с несколькими слоями!

    Несмотря на то, что вы можете применять слои наборов действий каждый кадр, поступать так не рекомендуется, особенно если вы используете более одного слоя. Последний применённый слой будет иметь приоритет над любой несогласующейся информацией, пришедшей ранее, так что рекомендуется особенно внимательно проверять их порядок. В коде могут наблюдаться состояния гонки (race conditions) или иные трудноуловимые баги, которые могут изменить порядок слоёв.

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

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

    Практический пример


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

    action_set_layers_basic_1.png

    Когда игрок выбирает класс, добавляется соответствующий слой, к примеру, «снайпер».

    action_set_layers_sniper_2.png

    Код в этом случае может выглядеть примерно так:

    void changeClass(EClassID myClass) { if(myClass == SNIPER) { SteamInput()->ActivateActionSetLayer( controllerHandle1, sniperLayerHandle ); } //logic for other classes }

    Если игрок входит в транспортное средство или выходит из него, включается или выключается управление для соответствующего состоянию игры слоя, при этом добавляются или удаляются элементы ввода для конкретных функций управления ТС.

    action_set_layers_vehicle_1.png

    void changeVehicle(EVehicleID myVehicle, bool entering) { InputActionSetHandle_t layerHandle; if(myVehicle == AUTOMATIC) { layerHandle = automaticHandle; //автоматическая коробка передач -- руль, газ, тормоз } else if(myVehicle == STICK_SHIFT) { layerHandle = stickShiftHandle; //ручная коробка передач -- руль, газ, тормоз, сцепление, переключение передач и т. д. } if(entering) { SteamInput()->ActivateActionSetLayer( controllerHandle1, layerHandle ); //включаем слой набора действий, когда игрок зашёл в транспортное средство } else { SteamInput()->DeactivateActionSetLayer( controllerHandle1, layerHandle ); //выключаем слой набора действий, когда игрок вышел из ТС } }

    В этой игре могут использовать оружие, даже находясь в транспортном средстве. Поэтому когда снайпер использует прицел на снайперской винтовке, это активирует третий слой набора действий, вне зависимости от того, передвигается ли персонаж пешком или в транспортном средстве.

    action_set_layers_scope.png

    void useScope(bool entering) { if(entering) { SteamInput()->ActivateActionSetLayer( controllerHandle1, scopeHandle ); //применяем слой прицела, когда персонаж прицеливается } else { SteamInput()->DeactivateActionSetLayer( controllerHandle1, scopeHandle ); //убираем слой прицела, когда персонаж опускает оружие } }

    Вот как будет выглядеть наложение всех слоёв:

    action_set_layers_result_2.png

    Обратите внимание, что слои могут не только добавлять новые действия к более ранним слоям, но и переопределять предыдущие раскладки. В данном случае, тормоз (brake) и газ (gas) из набора «транспортное средство» замещают прыжок (jump) и взаимодействие (interact) из базового набора (которые привязаны к трекпаду и джойстику), и затем в свою очередь замещаются прицеливанием (aim) из слоя набора действий «прицел». Поскольку все три слоя набора действий наложены один на другой, единственным оставшимся из базового набора действием будет стрельба (shoot).

    Режим совместимости


    Создание слоя набора действий аналогично созданию обычного набора действий. Просто нажмите кнопку «Добавить слой набора действий» в настройках:

    add_action_layer.png

    Здесь вы можете дать слою набора действий название и указать сочетания клавиш для него. Поскольку это слой набора действий в режиме совместимости, у игры нет информации о нём, и игроку потребуется активировать его самостоятельно. Решите, какой элемент ввода активирует слой набора действий, откройте меню сочетаний клавиш, нажмите на иконку активации набора действий, которая расположена слева в ряду специальных иконок.

    bind_action_set.png

    Это действие открывает меню активации набора действий:

    change_action_set.png

    В данном случае мы хотим применить слой, а не активировать набор действий. Поэтому в выпадающем меню выберите «Применить слой действий»:

    apply_action_set_layer.png

    Наконец, выберите слой, который вы хотите применить:

    select_action_set_layer.png

    Ту же процедуру можно использовать, чтобы назначить отдельное сочетание клавиш или чтобы удалить слой.
  翻译: