Uaktualnij pakiet SDK do wprowadzania danych dla Javy i Kotlin do wersji 1.1

Z tego przewodnika dowiesz się, jak uaktualnić grę z pakietu SDK do obsługi danych wejściowych w wersji 1.0.0-beta dla języków Java i Kotlin do wersji 1.1.1-beta. Instrukcje dotyczące Unity znajdziesz w przewodniku po uaktualnianiu Unity.

Informacje o wersjach

Gry Google Play na PC obsługują zmianę przypisania klawiszy na podstawie przypisań klawiszy podanych przez grę za pomocą pakietu SDK do obsługi danych wejściowych.

Użytkownicy mogą uzyskać dostęp do tej funkcji, otwierając nakładkę, wybierając elementy sterujące, a następnie klikając działanie, które chcą ponownie przypisać.

Gry Google Play na PC mapują wszystkie zmiany wprowadzone przez użytkownika na domyślne dane wejściowe gry. Dzięki temu gra nie musi rozpoznawać zmian wprowadzonych przez gracza. Jeśli potrzebujesz znać nowe dane wejściowe dla działania w grze, np. aby wyświetlać w niej sterowanie klawiaturą, możesz opcjonalnie zarejestrować wywołanie zwrotne, aby otrzymywać powiadomienia o zdarzeniach związanych ze zmianą mapowania.

Gry Google Play na PC przechowują lokalnie zmienione ustawienia sterowania każdego użytkownika, dzięki czemu są one zachowywane podczas kolejnych sesji gry. Ponieważ jest on przechowywany lokalnie, nie ma wpływu na wrażenia użytkownika na urządzeniu mobilnym i jest usuwany po odinstalowaniu Gier Google Play na PC. Ustawienia sterowania nie są zachowywane na wielu komputerach.

Aby włączyć w grze zmianę przypisania klawiszy, nie musisz uaktualniać pakietu Input SDK, ale zmiana przypisania może zostać wyłączona, jeśli zostanie wykryta nieobsługiwana konfiguracja.

Jeśli chcesz kontrolować mapowanie wejść lub jeśli funkcja mapowania jest wyłączona w Twojej grze, wykonaj te czynności, aby rozwiązać problem:

  • Uaktualnij pakiet Input SDK do wersji 1.1.1-beta.
  • Zaktualizuj wszystkie powiązania klawiszy, aby uniknąć nieobsługiwanych konfiguracji.
  • Zaktualizuj InputMap, aby włączyć funkcję ponownego mapowania.

Jeśli chcesz zrezygnować z funkcji ponownego mapowania w swojej grze, ale nadal wyświetlać wersję tylko do odczytu powiązań klawiszy, wykonaj te czynności:

  • Uaktualnij pakiet Input SDK do wersji 1.1.1-beta.
  • Zaktualizuj InputMap, aby ustawić funkcję ponownego mapowania na wyłączoną.

Możesz uaktualnić wersję pakietu Input SDK do wersji 1.1.1-beta, aby korzystać z zaawansowanych funkcji ponownego mapowania w Gry Google Play na PC. W tym celu użyj InputContexts, aby zdefiniować elementy sterujące dla różnych scen w grze, dodać wywołania zwrotne do nasłuchiwania zdarzeń ponownego mapowania, zdefiniować zestaw zarezerwowanych klawiszy, których użytkownik nie może ponownie mapować, i dezaktywować funkcję ponownego mapowania dla InputAction, InputGroup lub InputMap.

Podczas przechodzenia na nową wersję pakietu SDK weź pod uwagę te wyjątki:

Nieobsługiwane konfiguracje

Mapowanie wejść jest wyłączone, jeśli nie są spełnione te warunki:

  • InputAction składający się z wielu klawiszy musi zawierać klawisz modyfikujący i klawisz niemodyfikujący. Na przykład Shift + A jest prawidłowy, ale A + B, Ctrl + Alt i Shift + A + Tab nie są.

  • Co najmniej 2 obiekty InputAction lub InputGroup nie mogą mieć tego samego unikalnego identyfikatora.

Uaktualnij

Pakiet Input SDK 1.1.1-beta jest wstecznie zgodny z pakietem Input SDK 1.0.0-beta. Gry korzystające z poprzednich implementacji pakietu SDK do obsługi danych wejściowych nadal obsługują podstawowe mapowanie, chyba że używają nieobsługiwanej konfiguracji. Jeśli Twoja gra korzysta ze starszej wersji pakietu Input SDK, zapoznaj się z przewodnikiem po aktualizacji z wersji 0.0.4 do wersji 1.0.0-beta.

Uaktualnienie do wersji 1.1.1-beta umożliwia korzystanie z nowych funkcji, takich jak:

Uaktualnianie zależności

Jeśli do importowania pakietu Input SDK używasz Gradle, zaktualizuj go do najnowszej wersji:

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

Definiowanie pól statycznych

W przypadku wersji 1.1.1-beta dobrym rozwiązaniem jest zdefiniowanie obiektów InputAction, InputGroup, InputContextInputMap jako statycznych pól klasy InputMappingProvider, ponieważ te pola są dostępne z innych części aplikacji:

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;
    }
}

Aktualizowanie InputActions

Metoda InputAction.create() pakietu Input SDK 1.0.0-beta została wycofana. InputAction ma teraz identyfikator wersji i może być oznaczony jako element, który można ponownie mapować, lub nie. InputAction zdefiniowany za pomocą pakietu Input SDK 1.0.0-beta create() można domyślnie ponownie mapować i nie zawiera informacji o obsłudze wersji:

InputAction w pakiecie Input SDK w wersji 1.0.0-beta

Kotlin

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 w pakiecie Input SDK w wersji 1.1.1-beta

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
}

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 w pakiecie Input SDK w wersji 1.1.1-beta (z ciągiem tekstowym wersji)

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
);

Więcej informacji o obsłudze wersji powiązań klawiszy znajdziesz w artykule Śledzenie identyfikatorów kluczy.

Aktualizowanie grup wejściowych

W sekcji Input SDK 1.1.1-beta musisz jednoznacznie zidentyfikować każdy InputGroup. Każda InputAction należy do InputGroup – kolekcji powiązanych działań. Ułatwia to nawigację i zwiększa wykrywalność elementów sterujących podczas rozgrywki. Podobnie jak atrybut InputAction musi mieć unikalny identyfikator wśród wszystkich działań w ramach jednego InputContext, atrybut InputGroup musi mieć unikalny identyfikator wśród istniejących grup.

W przykładach w tej sekcji gra ma 2 obiektyInputContext reprezentujące menu główne i rozgrywkę. Odpowiednie identyfikatory są śledzone w przypadku każdego InputGroup w tych kontekstach przy użyciu tego wyliczenia:

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
}

Podobnie jak InputAction, metoda InputGroup.create() pakietu Input SDK1.0.0-beta została wycofana. Musisz zaktualizować InputGroup w grzeInputActionza pomocą identyfikatora wersji i wartości logicznej wskazującej, czy obiekty InputActionInputActionw grupach można ponownie mapować. Grupy utworzone za pomocą wycofanej metody 1.0.0-beta create() pakietu Input SDK można ponownie mapować, mają one identyfikator 0, a identyfikator wersji jest pustym ciągiem znaków (""):

InputGroup w pakiecie Input SDK w wersji 1.0.0-beta

Kotlin

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 w pakiecie Input SDK w wersji 1.1.1-beta

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
    )
}

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 w pakiecie Input SDK w wersji 1.1.1-beta (z ciągiem tekstowym wersji)

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
);

Więcej informacji o obsłudze wersji powiązań klawiszy znajdziesz w artykule Śledzenie identyfikatorów kluczy.

Aktualizowanie InputMap

Metoda InputMap.create() w pakiecie Input SDK 1.0.0-beta została wycofana. Zaktualizuj InputMap, aby przypisać identyfikator wersji, całkowicie zrezygnować z funkcji ponownego mapowania lub przypisać listę zarezerwowanych klawiszy w grze, których użytkownik nie może używać do ponownego mapowania. Każdy InputMap zdefiniowany za pomocą metody pakietu Input SDK 1.0.0-beta create() jest domyślnie mapowalny, ma identyfikator 0 i nie ma żadnych zarezerwowanych klawiszy.

InputMap w pakiecie Input SDK w wersji 1.0.0-beta

Kotlin

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 w pakiecie Input SDK w wersji 1.1.1-beta

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()
                )
        )
);

Co dalej?

Kontynuuj uaktualnianie do wersji 1.1.1-beta, przypisując różne elementy sterujące do różnych scen za pomocą InputContexts lub aktualizując interfejs gry przez otrzymywanie powiadomień o zdarzeniach ponownego mapowania za pomocą InputRemappingListeners.

Podczas aktualizowania przypisań klawiszy zapoznaj się z sprawdzonymi metodami projektowania przypisań klawiszy i weź pod uwagę ograniczenia oraz limity funkcji ponownego mapowania.