В этом руководстве объясняется, как обновить вашу игру с версии 1.0.0-beta Input SDK для Java и Kotlin до версии 1.1.1-beta. Инструкции, специфичные для Unity, см. в руководстве по обновлению Unity.
Примечания к выпуску
Google Play Games на ПК поддерживает переназначение клавиш управления с клавиатуры в соответствии с настройками клавиш, предоставляемыми вашей игрой, с помощью Input SDK.
Пользователи получают доступ к этой функции, открыв всплывающее окно , выбрав элементы управления, а затем щелкнув по действию, которое они хотят переназначить.
Google Play Games на ПК сопоставляет каждое переназначенное пользователем действие с настройкой по умолчанию в вашей игре. Таким образом, вашей игре не нужно знать о переназначении действий игроком. Если вам необходимо знать новое действие для внутриигрового события, например, для отображения элементов управления клавиатуры в вашей игре, вы можете дополнительно зарегистрировать функцию обратного вызова, чтобы получать уведомления о событиях переназначения.
Google Play Games на ПК сохраняет переназначенные элементы управления каждого пользователя локально, поэтому они сохраняются между игровыми сессиями. Поскольку это хранится локально, это не влияет на работу мобильного приложения и удаляется при удалении Google Play Games на ПК. Настройки управления не сохраняются на разных устройствах ПК.
Для включения переназначения клавиш в игре не требуется обновлять Input SDK, однако переназначение можно отключить, если обнаружена неподдерживаемая конфигурация .
Если вы хотите управлять процессом переназначения клавиш или если функция переназначения клавиш отключена в вашей игре, выполните следующие действия для решения проблемы:
- Обновите Input SDK до
1.1.1-beta. - Обновите все сочетания клавиш, чтобы избежать неподдерживаемых настроек .
- Обновите
InputMap, чтобы включить функцию переназначения клавиш.
Если вы хотите отключить функцию переназначения клавиш в игре, но при этом сохранить отображение версии настроек клавиш только для чтения, выполните следующие действия:
- Обновите Input SDK до
1.1.1-beta. - Обновите
InputMap, отключив функцию переназначения клавиш .
Вы можете обновить версию Input SDK до 1.1.1-beta , чтобы воспользоваться расширенными функциями переназначения клавиш в Google Play Games на ПК, используя InputContexts для определения элементов управления для различных сцен вашей игры, добавления коллбэков для отслеживания событий переназначения, определения набора зарезервированных клавиш, на которые пользователь не может переназначить клавиши, и отключения функции переназначения для каждого InputAction , InputGroup или InputMap .
При обновлении до новой версии SDK следует учитывать следующие исключения:
Неподдерживаемые конфигурации
Переназначение входных сигналов отключается, если не выполняются следующие условия:
InputActionиспользующий несколько клавиш, должен состоять из клавиши-модификатора и клавиши без модификатора. Например,Shift + A это верно, ноА + В ,Ctrl + Alt , иShift + A + Tab не являются.Два или более объекта
InputActionилиInputGroupне могут иметь один и тот же уникальный идентификатор.
Обновление
Input SDK 1.1.1-beta обратно совместим с Input SDK 1.0.0-beta. Игры, использующие предыдущие реализации Input SDK, по-прежнему поддерживают базовое переназначение клавиш, если только они не используют неподдерживаемую конфигурацию . Если ваша игра использует более раннюю версию Input SDK, рекомендуется ознакомиться с руководством по обновлению с версии 0.0.4 до 1.0.0-beta .
Обновление до версии 1.1.1-beta открывает доступ к новым функциям, в том числе:
- Запуск изменений в настройках сцены .
- Получение уведомлений о ключевых событиях сопоставления .
- Отключение переназначения для каждого действия, группы, контекста или карты.
Зависимость обновления
Если вы используете 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(...)
}
}
Java
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;
}
}
Обновите ваши InputActions.
Метод InputAction.create() из Input SDK 1.0.0-beta устарел. Теперь InputAction имеет идентификатор версии и может быть помечен как переназначаемый или нет. InputAction определенный с помощью метода create() из Input SDK 1.0.0-beta , по умолчанию является переназначаемым и не имеет информации о версии:
Функция InputAction в Input SDK 1.0.0-beta
Котлин
val jumpInputAction = InputAction.create(
"Jump",
InputEventIds.JUMP.id,
InputControls.create(
listOf(KeyEvent.KEYCODE_SPACE),
emptyList()
)
)
Java
InputAction moveUpInputAction = InputAction.create(
"Move Up",
InputEventIds.MOVE_UP.ordinal(),
InputControls.create(
Collections.singletonList(KeyEvent.KEYCODE_W),
Collections.emptyList()
)
);
Функция InputAction в Input SDK 1.1.1-beta
Котлин
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
}
Java
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 в Input SDK 1.1.1-beta (с указанием версии)
Котлин
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
)
Java
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
);
Для получения дополнительной информации о версионировании сочетаний клавиш см. раздел «Отслеживание идентификаторов клавиш» .
Обновите ваши InputGroups
В Input SDK 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
}
Java
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() из Input SDK 1.0.0-beta устарел. Вам необходимо обновить InputGroup в вашей игре, указав идентификатор версии и логическое значение, указывающее, можно ли переназначать объекты InputAction в ваших группах. Группы, созданные с помощью устаревшего метода create() из Input SDK 1.0.0-beta , являются переназначаемыми, имеют ID 0, а идентификатор версии представляет собой пустую строку ( "" ):
InputGroup в Input SDK 1.0.0-beta
Котлин
val movementInputGroup = InputGroup.create(
"Basic Movement",
listOf(
moveUpInputAction,
moveLeftInputAction,
moveDownInputAction,
moveRightInputAction,
jumpInputAction,
runInputAction)
)
Java
InputGroup movementInputGroup = InputGroup.create(
"Basic movement",
Arrays.asList(
moveUpInputAction,
moveLeftInputAction,
moveDownInputAction,
moveRightInputAction,
jumpInputAction,
runInputAction
)
);
InputGroup в Input SDK 1.1.1-beta
Котлин
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
)
}
Java
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-beta (со строкой версии)
Котлин
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
)
}
Java
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.
Метод InputMap.create() из Input SDK 1.0.0-beta устарел. Обновите свой InputMap , указав идентификатор версии, полностью отключив функцию переназначения клавиш или назначив список зарезервированных клавиш для вашей игры, которые вы не хотите, чтобы пользователь переназначал. Каждый InputMap определенный с помощью метода create() из Input SDK 1.0.0-beta , по умолчанию допускает переназначение клавиш, идентифицируется с ID 0 и не содержит зарезервированных клавиш.
InputMap в Input SDK 1.0.0-beta
Котлин
val gameInputMap = InputMap.create(
listOf(movementInputGroup, mouseMovementInputGroup),
MouseSettings.create(true, false)
)
Java
InputMap gameInputMap = InputMap.create(
Arrays.asList(movementInputGroup, mouseMovementInputGroup),
MouseSettings.create(true, false)
);
InputMap в Input SDK 1.1.1-beta
Котлин
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()))
)
}
Java
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-beta, назначив разные элементы управления для разных сцен с помощью InputContexts или обновив пользовательский интерфейс игры, получая уведомления о событиях переназначения с помощью InputRemappingListeners .
При обновлении сочетаний клавиш ознакомьтесь с рекомендациями по разработке сочетаний клавиш и учтите ограничения и недостатки функции переназначения.