Обновите SDK ввода для Java и Kotlin до версии 1.1.

В этом руководстве объясняется, как обновить игру с версии 1.0.0-бета-Input SDK для Java и Kotlin до версии 1.1.1-бета. Подробные инструкции для Unity см. в руководстве по обновлению Unity .

Примечания к выпуску

Google Play Games для ПК поддерживает переназначение элементов управления клавиатуры на основе привязок клавиш, предоставляемых вашей игрой с помощью Input SDK.

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

Google Play Games на ПК сопоставляет каждый ввод, переназначенный пользователем, с вводом по умолчанию в вашей игре. Таким образом, вашей игре не обязательно знать о переназначении игрока. Если вам нужно узнать новый ввод для внутриигрового действия, например отображения элементов управления с клавиатуры в вашей игре, вы можете дополнительно зарегистрировать обратный вызов для получения уведомлений о событиях переназначения.

Google Play Games на ПК сохраняет переназначенные элементы управления каждого пользователя локально, поэтому они сохраняются в течение игровых сеансов. Поскольку они хранятся локально, они не влияют на работу мобильных устройств и удаляются при удалении Google Play Games на ПК. Настройки управления не сохраняются на нескольких устройствах ПК.

Вам не нужно обновлять Input SDK, чтобы включить переназначение клавиш в вашей игре, но переназначение можно отключить для вашей игры, если обнаружена неподдерживаемая конфигурация .

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

  • Обновите входной SDK до 1.1.1-beta .
  • Обновите все сочетания клавиш, чтобы избежать неподдерживаемых конфигураций .
  • Обновите свой InputMap , чтобы включить функцию переназначения.

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

  • Обновите входной SDK до 1.1.1-beta .
  • Обновите свой InputMap , чтобы отключить функцию переназначения.

Вы можете обновить версию Input SDK до 1.1.1-beta , чтобы воспользоваться преимуществами расширенных функций переназначения в Google Play Games на ПК, используя InputContexts для определения элементов управления для различных сцен вашей игры, добавления обратных вызовов для прослушивания событий переназначения, определения набор зарезервированных ключей, которые пользователь не может переназначить, и деактивировать функцию переназначения для каждого InputAction , InputGroup или InputMap .

При обновлении до новой версии SDK учитывайте следующие исключения:

Неподдерживаемые конфигурации

Переназначение входов отключается, если не выполняются следующие условия:

  • Действие InputAction использующее несколько ключей, должно состоять из ключа-модификатора и ключа-немодификатора. Например, Шифт + А действителен, но А + Б , Ctrl + Альт , и Shift + А + Tab нет.

  • Два или более объектов InputAction или InputGroup не могут использовать один и тот же уникальный идентификатор.

Обновление

Входной SDK 1.1.1-бета обратно совместим с входным SDK 1.0.0-бета. Игры, использующие предыдущие реализации Input SDK, по-прежнему поддерживают базовое переназначение, если только они не используют неподдерживаемую конфигурацию . Если в вашей игре используется более ранняя версия Input SDK, прочтите руководство по обновлению с 0.0.4 до 1.0.0-бета .

Обновление до бета-версии 1.1.1 открывает новые функции, в том числе:

Обновление зависимости

Если вы используете Gradle для импорта Input SDK, обновите его до последней версии:

// build.gradle
dependencies {
   ...
   implementation 'com.google.android.libraries.play.games:inputmapping:1.1.1-beta'
   ...
}

Определите статические поля

Для 1.1.1-beta рекомендуется определять объекты InputAction , InputGroup , InputContext и InputMap как статические поля вашего класса InputMappingProvider поскольку эти поля доступны из других частей вашего приложения:

Котлин

class InputSDKProvider : InputMappingProvider {
    override fun onProvideInputMap(): InputMap { return gameInputMap }

    companion object {
        const val INPUTMAP_VERSION = "1.0.0"

        private val moveUpInputAction = InputAction.create(...)
        private val movementInputGroup = InputGroup.create(...)
        val menuContext = InputContext.create(...)
        val gameInputMap = InputMap.create(...)
    }
}

Ява

public class MyInputMappingProvider implements InputMappingProvider {
    private static final String INPUTMAP_VERSION = "1.0.0";

    private static final InputAction moveUpInputAction =
        InputAction.create(...);
    private static final InputGroup movementInputGroup = InputGroup.create(...);
    public static final InputContext menuContext = InputContext.create(...);
    public static final InputMap gameInputMap = InputMap.create(...);

    @Override
    public InputMap onProvideInputMap() {
        return gameInputMap;
    }
}

Обновите свои действия ввода

Метод InputAction.create() 1.0.0-beta устарел. InputAction теперь имеет идентификатор версии и может быть помечен как подлежащий переназначению или нет. InputAction определенный с помощью метода create() входного SDK 1.0.0-beta по умолчанию переназначается и не содержит информации о версии:

InputAction во входном SDK 1.0.0-бета

Котлин

val jumpInputAction = InputAction.create(
    "Jump",
    InputEventIds.JUMP.id,
    InputControls.create(
        listOf(KeyEvent.KEYCODE_SPACE),
        emptyList()
    )
)

Ява

InputAction moveUpInputAction = InputAction.create(
    "Move Up",
    InputEventIds.MOVE_UP.ordinal(),
    InputControls.create(
        Collections.singletonList(KeyEvent.KEYCODE_W),
        Collections.emptyList()
    )
);

InputAction во входном SDK 1.1.1-бета

Котлин

companion object {
  private val moveUpInputAction = InputAction.create(
    "Move Up",
    InputActionsIds.DRIVE.ordinal.toLong(),
    InputControls.create(listOf(KeyEvent.KEYCODE_W), emptyList()),
    InputEnums.REMAP_OPTION_ENABLED) // This action is remappable
}

Ява

private static final InputAction moveUpInputAction = InputAction.create(
    "Move Up",
    InputEventIds.MOVE_UP.ordinal(),
    InputControls.create(
            Collections.singletonList(KeyEvent.KEYCODE_W),
            Collections.emptyList()),
    InputEnums.REMAP_OPTION_ENABLED // this action is remappable
);

InputAction во входном SDK 1.1.1-бета (со строкой версии)

Котлин

private val enterMenuInputAction = InputAction.create(
    "Enter menu",
    InputControls.create(listOf(KeyEvent.KEYCODE_ENTER), emptyList()),
    InputIdentifier.create(
    INPUTMAP_VERSION, InputActionsIds.ENTER_MENU.ordinal.toLong()),
    InputEnums.REMAP_OPTION_ENABLED
)

Ява

private static final InputAction moveUpInputAction = InputAction.create(
    "Move Up",
    InputControls.create(
            Collections.singletonList(KeyEvent.KEYCODE_W),
            Collections.emptyList()),
    InputIdentifier.create(
            INPUTMAP_VERSION,
            InputEventIds.MOVE_UP.ordinal()),
    InputEnums.REMAP_OPTION_ENABLED // this action is remappable
);

Дополнительные сведения об управлении версиями привязок клавиш см. в разделе Отслеживание идентификаторов клавиш .

Обновите свои группы ввода

В 1.1.1-beta вам необходимо однозначно идентифицировать каждую InputGroup . Каждое InputAction принадлежит InputGroup — коллекции связанных действий. Это улучшает навигацию и доступность элементов управления во время игры. Точно так же, как InputAction должен иметь уникальный идентификатор среди всех действий в одном InputContext , InputGroup должен иметь уникальный идентификатор во всех существующих группах.

В примерах этого раздела в игре есть два объекта InputContext , представляющие главное меню и игровой процесс. Соответствующие идентификаторы отслеживаются для каждой InputGroup в этих контекстах с использованием следующего перечисления:

Котлин

enum class InputGroupsIds {
    // Main menu scene
    BASIC_NAVIGATION, // WASD, Enter, Backspace
    MENU_ACTIONS, // C: chat, Space: quick game, S: store
    // Gameplay scene
    BASIC_MOVEMENT, // WASD, space: jump, Shift: run
    MOUSE_ACTIONS, // Left click: shoot, Right click: aim
    EMOJIS, // Emojis with keys 1,2,3,4 and 5
    GAME_ACTIONS, // M: map, P: pause, R: reload
}

Ява

public enum InputGroupsIds {
    // Main menu scene
    BASIC_NAVIGATION, // WASD, Enter, Backspace
    MENU_ACTIONS, // C: chat, Space: quick game, S: store
    // Gameplay scene
    BASIC_MOVEMENT, // WASD, space: jump, Shift: run
    MOUSE_ACTIONS, // Left click: shoot, Right click: aim
    EMOJIS, // Emojis with keys 1,2,3,4 and 5
    GAME_ACTIONS, // M: map, P: pause, R: reload
}

Как и InputAction , метод InputGroup.create() 1.0.0-beta устарел. Вы должны обновить свою InputGroup в своей игре, указав идентификатор версии и логическое значение, указывающее, можно ли переназначать объекты InputAction в ваших группах. Группы, созданные с помощью устаревшего метода create() входного SDK 1.0.0-beta допускают переназначение, имеют идентификатор 0, а идентификатор версии представляет собой пустую строку ( "" ):

InputGroup в Input SDK 1.0.0-бета

Котлин

val movementInputGroup = InputGroup.create(
    "Basic Movement",
    listOf(
        moveUpInputAction,
        moveLeftInputAction,
        moveDownInputAction,
        moveRightInputAction,
        jumpInputAction,
        runInputAction)
)

Ява

InputGroup movementInputGroup = InputGroup.create(
    "Basic movement",
    Arrays.asList(
        moveUpInputAction,
        moveLeftInputAction,
        moveDownInputAction,
        moveRightInputAction,
        jumpInputAction,
        runInputAction
    )
);

InputGroup в Input SDK 1.1.1-бета

Котлин

companion object {
    private val movementInputGroup = InputGroup.create(
        "Basic movement",
        listOf(
            moveUpInputAction,
            moveLeftInputAction,
            moveDownInputAction,
            moveRightInputAction,
            jumpInputAction,
            runInputAction),
        InputGroupsIds.BASIC_MOVEMENT.ordinal.toLong(),
        // All the actions in this groups can't be remapped
        InputEnums.REMAP_OPTION_DISABLED
    )
}

Ява

private static final InputGroup movementInputGroup = InputGroup.create(
    "Basic movement",
    Arrays.asList(
            moveUpInputAction,
            moveLeftInputAction,
            moveDownInputAction,
            moveRightInputAction,
            jumpInputAction,
            runInputAction
    ),
    InputGroupsIds.BASIC_MOVEMENT.ordinal(),
    // All the actions in this groups can't be remapped
    InputEnums.REMAP_OPTION_DISABLED
);

InputGroup в Input SDK 1.1.1-бета (со строкой версии)

Котлин

companion object {
    private val movementInputGroup  = InputGroup.create(
        "Basic movement",
        listOf(
            moveUpInputAction,
            moveLeftInputAction,
            moveDownInputAction,
            moveRightInputAction,
            jumpInputAction,
            runInputAction),
        InputIdentifier.create(
            INPUTMAP_VERSION, InputGroupsIds.BASIC_MOVEMENT.ordinal.toLong()),
        // All the actions in this groups can't be remapped
        InputEnums.REMAP_OPTION_DISABLED
    )
}

Ява

private static final InputGroup movementInputGroup = InputGroup.create(
    "Basic movement",
    Arrays.asList(
            moveUpInputAction,
            moveLeftInputAction,
            moveDownInputAction,
            moveRightInputAction,
            jumpInputAction,
            runInputAction
    ),
    InputIdentifier.create(
            INPUTMAP_VERSION,
            InputGroupsIds.BASIC_MOVEMENT.ordinal()),
    // All the actions in this groups can't be remapped
    InputEnums.REMAP_OPTION_DISABLED
);

Дополнительные сведения об управлении версиями привязок клавиш см. в разделе Отслеживание идентификаторов клавиш .

Обновите свою карту ввода

Метод InputMap.create() из входного SDK 1.0.0-beta устарел. Обновите свой InputMap , чтобы присвоить идентификатор версии, полностью отказаться от функции переназначения или назначить список зарезервированных ключей для вашей игры, которые вы не хотите использовать для переназначения пользователем. Каждая InputMap определенная с помощью метода create() входного SDK 1.0.0-beta по умолчанию допускает переназначение, идентифицируется с идентификатором 0 и не имеет зарезервированных ключей.

InputMap в Input SDK 1.0.0-бета

Котлин

val gameInputMap = InputMap.create(
    listOf(movementInputGroup, mouseMovementInputGroup),
    MouseSettings.create(true, false)
)

Ява

InputMap gameInputMap = InputMap.create(
    Arrays.asList(movementInputGroup, mouseMovementInputGroup),
    MouseSettings.create(true, false)
);

InputMap в Input SDK 1.1.1-бета

Котлин

companion object {

  const val INPUTMAP_VERSION = "1.0.0"
  const val INPUT_MAP_ID = 0

  val gameInputMap = InputMap.create(
    listOf(movementInputGroup, mouseMovementInputGroup),
    MouseSettings.create(true, false),
    InputIdentifier.create(INPUTMAP_VERSION, INPUT_MAP_ID.toLong()),
    InputEnums.REMAP_OPTION_ENABLED,
    // Use ESCAPE as reserved key
    listof(InputControls.create(listOf(KeyEvent.KEYCODE_ESCAPE), emptyList()))
  )
}

Ява


public static final String INPUT_MAP_VERSION = "1.0.0-beta";
public static final long INPUT_MAP_ID = 0;

public static final InputMap gameInputMap = InputMap.create(
        Arrays.asList(movementInputGroup, mouseMovementInputGroup),
        MouseSettings.create(true, false),
        InputIdentifier.create(INPUTMAP_VERSION, INPUT_MAP_ID),
        InputEnums.REMAP_OPTION_ENABLED,
        // Use ESC key as reserved key
        Arrays.asList(
                InputControls.create(
                        Collections.singletonList(KeyEvent.KEYCODE_ESCAPE),
                        Collections.emptyList()
                )
        )
);

Что дальше

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

При обновлении привязок клавиш ознакомьтесь с рекомендациями по разработке привязок клавиш и учтите ограничения и ограничения функции переназначения.