В этом руководстве объясняется, как обновить игру с версии 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
.
При обновлении привязок клавиш ознакомьтесь с рекомендациями по разработке привязок клавиш и учтите ограничения функции переназначения.