이 가이드에서는 게임을 Java 및 Kotlin용 1.0.0-beta 입력 SDK에서 1.1.1-beta로 업그레이드하는 방법을 설명합니다. Unity 관련 안내는 Unity 업그레이드 가이드를 참고하세요.
출시 노트
PC용 Google Play 게임즈는 입력 SDK를 사용하여 게임에서 제공하는 키 바인딩을 기반으로 키보드 컨트롤의 재매핑을 지원합니다.
사용자는 오버레이를 열고 컨트롤을 선택한 후 재매핑하려는 작업을 클릭하여 이 기능에 액세스합니다.
PC용 Google Play 게임즈는 사용자가 재매핑한 모든 입력을 게임의 기본 입력에 매핑합니다. 이렇게 하면 게임이 플레이어의 재매핑을 인식할 필요가 없습니다. 게임 내 키보드 컨트롤 표시와 같은 인게임 작업의 새로운 입력을 알아야 하는 경우 재매핑 이벤트에 관한 알림을 받을 콜백을 선택적으로 등록할 수 있습니다.
PC용 Google Play 게임즈는 각 사용자의 재매핑된 컨트롤을 로컬에 저장하므로 게임 세션 전반에 걸쳐 유지됩니다. 로컬에 저장되므로 모바일 환경에 영향을 미치지 않고 PC용 Google Play 게임즈를 제거하면 삭제됩니다. 컨트롤 설정은 여러 PC 기기에서 유지되지 않습니다.
게임에서 키 재매핑을 사용 설정하기 위해 입력 SDK를 업그레이드할 필요는 없지만 지원되지 않는 구성이 감지되면 게임에서 재매핑이 사용 중지될 수 있습니다.
입력 재매핑 환경을 제어하려는 경우 또는 게임에서 재매핑 기능이 사용 중지된 경우 다음 단계를 따르세요.
- 입력 SDK
1.1.1-beta
로 업그레이드합니다. - 지원되지 않는 구성을 방지하려면 모든 키 바인딩을 업데이트합니다.
InputMap
을 업데이트하여 재매핑 기능을 사용 설정합니다.
읽기 전용 키 바인딩 버전을 계속 표시하면서 게임의 재매핑 기능을 선택 해제하려면 다음 단계를 따르세요.
- 입력 SDK
1.1.1-beta
로 업그레이드합니다. InputMap
을 업데이트하여 재매핑 기능을 사용 중지합니다.
입력 SDK 버전을 1.1.1-beta
로 업그레이드하여 InputContexts
를 사용하여 게임의 여러 장면에 대한 컨트롤을 정의하고, 재매핑 이벤트를 수신 대기하는 콜백을 추가하고, 사용자가 재매핑할 수 없는 예약된 키 집합을 정의하고, InputAction
, InputGroup
또는 InputMap
별로 재매핑 기능을 비활성화하여 PC용 Google Play 게임즈의 고급 재매핑 기능을 활용할 수 있습니다.
새 SDK 버전으로 업그레이드하는 동안 다음 예외를 고려하세요.
지원되지 않는 구성
다음 조건이 충족되지 않으면 입력 재매핑이 사용 중지됩니다.
여러 키를 활용하는
InputAction
은 특수키와 비 특수키로 구성되어야 합니다. 예를 들어Shift + A 는 유효하지만A + B ,Ctrl + Alt ,Shift + A + Tab 은 유효하지 않습니다.둘 이상의
InputAction
또는InputGroup
객체는 동일한 고유 ID를 공유할 수 없습니다.
업그레이드
입력 SDK 1.1.1-beta는 입력 SDK 1.0.0-beta와 호환됩니다. 입력 SDK의 이전 구현을 사용하는 게임은 지원되지 않는 구성을 사용하지 않는 한 기본 재매핑을 계속 지원합니다. 게임에서 이전 버전의 입력 SDK를 사용하는 경우 0.0.4에서 1.0.0-beta로의 업그레이드 가이드를 읽어보세요.
1.1.1-beta로 업그레이드하면 다음과 같은 새로운 기능을 사용할 수 있습니다.
- 장면 컨트롤 변경사항 트리거
- 키 매핑 이벤트 알림 수신
- Action, Group, Context 또는 Map별로 재매핑 사용 중지
종속 항목 업그레이드
Gradle을 사용하여 입력 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
클래스의 정적 필드로 정의하는 것이 좋습니다. 애플리케이션의 다른 부분에서 이러한 필드에 액세스할 수 있기 때문입니다.
Kotlin
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 업데이트
입력 SDK 1.0.0-beta
의 InputAction.create()
메서드는 지원 중단되었습니다. InputAction
은 이제 버전 식별자가 있으며 매핑 가능 또는 불가능으로 표시할 수 있습니다. 입력 SDK 1.0.0-beta
create()
메서드를 사용하여 정의된 InputAction
은 기본적으로 재매핑할 수 있으며 버전 관리 정보를 포함하지 않습니다.
입력 SDK 1.0.0-beta의 InputAction
Kotlin
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()
)
);
입력 SDK 1.1.1-beta의 InputAction
Kotlin
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
);
입력 SDK 1.1.1-beta의 InputAction (버전 문자열 포함)
Kotlin
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
);
키 바인딩 버전 관리에 관한 자세한 내용은 키 ID 추적을 참고하세요.
InputGroups 업데이트
입력 SDK 1.1.1-beta
에서는 각 InputGroup
을 고유하게 식별해야 합니다. 각 InputAction
은 관련 작업 모음인 InputGroup
에 속합니다. 이를 통해 게임플레이 중에 컨트롤의 탐색 및 검색 가능성이 향상됩니다. InputAction
이 단일 InputContext
의 모든 작업 간에 고유 식별자를 가져야 하는 것처럼 InputGroup
도 기존 그룹 간에 고유 ID가 있어야 합니다.
이 섹션의 예에서는 게임에 기본 메뉴와 게임플레이를 나타내는 InputContext
객체가 두 개 있습니다. 이러한 컨텍스트에서는 다음 열거형을 사용하여 각 InputGroup
의 적절한 ID를 추적합니다.
Kotlin
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
과 마찬가지로 입력 SDK 1.0.0-beta
의 InputGroup.create()
메서드가 지원 중단되었습니다. 그룹의 InputAction
객체를 재매핑할 수 있는지 나타내는 불리언 값과 버전 식별자를 사용하여 게임의 InputGroup
을 업데이트해야 합니다. 지원 중단된 입력 SDK 1.0.0-beta
create()
메서드로 만든 그룹은 재매핑할 수 있고, ID는 0이며, 버전 ID는 빈 문자열(""
)입니다.
입력 SDK 1.0.0-beta의 InputGroup
Kotlin
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
)
);
입력 SDK 1.1.1-beta의 InputGroup
Kotlin
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
);
입력 SDK 1.1.1-beta의 InputGroup (버전 문자열 포함)
Kotlin
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
);
키 바인딩 버전 관리에 관한 자세한 내용은 키 ID 추적을 참고하세요.
InputMap 업데이트
입력 SDK 1.0.0-beta
의 InputMap.create()
메서드가 지원 중단되었습니다. InputMap
을 업데이트하여 버전 식별자를 할당하거나, 재매핑 기능을 완전히 선택 해제하거나, 사용자가 재매핑하는 데 사용하지 않을 게임의 예약된 키 목록을 할당합니다. 입력 SDK 1.0.0-beta
create()
메서드를 사용하여 정의된 모든 InputMap
은 기본적으로 재매핑할 수 있으며, ID 0
으로 식별되고, 예약된 키를 포함하지 않습니다.
입력 SDK 1.0.0-beta의 InputMap
Kotlin
val gameInputMap = InputMap.create(
listOf(movementInputGroup, mouseMovementInputGroup),
MouseSettings.create(true, false)
)
자바
InputMap gameInputMap = InputMap.create(
Arrays.asList(movementInputGroup, mouseMovementInputGroup),
MouseSettings.create(true, false)
);
입력 SDK 1.1.1-beta의 InputMap
Kotlin
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()
)
)
);
다음 단계
InputContexts
를 사용하여 다른 장면에 다른 컨트롤을 할당하거나, InputRemappingListeners
를 사용하여 재매핑 이벤트에 관한 알림을 받아 게임의 UI를 업데이트하여 1.1.1-beta로 계속 업그레이드하세요.
키 바인딩을 업데이트할 때는 키 바인딩 설계 권장사항을 살펴보고 재매핑 기능의 제약사항과 제한사항을 고려하세요.