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

Ten przewodnik wyjaśnia, jak uaktualnić grę z wersji 1.0.0-beta pakietu Input SDK dla Javy i Kotlin do wersji 1.1.0-beta. Instrukcje dotyczące Unity znajdziesz w przewodniku po uaktualnieniu na Unity.

Informacje o wersji

Gry Google Play na PC obsługują ponowne mapowanie sterowania klawiaturą na podstawie powiązań klawiszy w grze za pomocą pakietu wejściowego SDK.

Aby uzyskać dostęp do tej funkcji, użytkownicy muszą otworzyć nakładkę, wybrać elementy sterujące i kliknąć działanie, które chcą zmapować.

Gry Google Play na PC mapują wszystkie odpowiednio zmapowane przez użytkownika dane wejściowe w grze. Dzięki temu gra nie musi wiedzieć o zmianie mapowania gracza. Jeśli chcesz znać nowe dane wejściowe dla działania w grze, na przykład wyświetlić elementy sterujące klawiaturą w grze, możesz opcjonalnie zarejestrować wywołanie zwrotne, aby otrzymać powiadomienie o zmianie wydarzeń.

Gry Google Play na PC przechowują odpowiednio zmapowane elementy sterujące każdego użytkownika, dzięki czemu są one trwałe, niezależnie od czasu gry. Są one przechowywane lokalnie, więc nie wpływają na działanie urządzeń mobilnych i są usuwane po odinstalowaniu Gier Google Play na PC. Ustawienia sterowania nie są zachowywane na wielu urządzeniach PC.

Nie musisz uaktualniać pakietu wejściowego SDK, aby włączyć mapowanie klawiszy w grze. Jeśli jednak wykryjemy nieobsługiwaną konfigurację, możesz wyłączyć w grze mapowanie.

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

  • Uaktualnij pakiet SDK do wprowadzania danych 1.1.0-beta.
  • Zaktualizuj wszystkie powiązania kluczy, aby uniknąć nieobsługiwanych konfiguracji.
  • Zaktualizuj urządzenie InputMap, aby włączyć funkcję ponownego mapowania włączoną.

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

  • Uaktualnij pakiet SDK do wprowadzania danych 1.1.0-beta.
  • Zaktualizuj urządzenie InputMap, aby ustawić funkcję mapowania na wyłączoną.

Możesz uaktualnić wersję pakietu SDK do wprowadzania danych do wersji 1.1.0-beta, aby korzystać z zaawansowanych funkcji mapowania w Grach Google Play na PC. Możesz użyć parametru InputContexts, aby zdefiniować elementy sterujące różnymi scenami gry, dodać wywołania zwrotne w celu wykrywania zdarzeń zmiany zmapowanego, zdefiniować zestaw zarezerwowanych kluczy, do których użytkownik nie może przypisywać zmian, oraz wyłączyć funkcję mapowania w InputAction, InputGroup lub InputMap.

Podczas uaktualniania do nowej wersji pakietu SDK weź pod uwagę te wyjątki:

Nieobsługiwane konfiguracje

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

  • InputAction wykorzystujący wiele kluczy musi składać się z klucza modyfikującego i niemodyfikacyjnego. Na przykład możesz użyć kombinacji klawiszy Shift + A, ale nie A + B, Ctrl + Alt i Shift + A + Tab.

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

Przejdź na Gemini Advanced

Wejściowy pakiet SDK 1.1.0 w wersji beta jest zgodny wstecznie z pakietem SDK do wprowadzania danych w wersji 1.0.0 w wersji beta. Gry korzystające z wcześniejszych implementacji pakietu wejściowego SDK nadal obsługują podstawowe mapowanie, chyba że korzystają z nieobsługiwanej konfiguracji. Jeśli Twoja gra korzysta z wcześniejszej wersji pakietu wejściowego SDK, przeczytaj przewodnik uaktualnienia z wersji 0.0.4 do 1.0.0 w wersji beta.

Przejście na wersję 1.1.0 w wersji beta włącza nowe funkcje, w tym:

Uaktualnij zależność

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

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

Zdefiniuj pola statyczne

W przypadku wersji 1.1.0-beta warto zdefiniować obiekty InputAction, InputGroup, InputContext i InputMap jako pola statyczne klasy InputMappingProvider, ponieważ są one 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;
    }
}

Zaktualizuj swoje działania wejściowe

InputAction

Metoda InputAction.create() w pakiecie SDK do wprowadzania danych 1.0.0-beta została wycofana. Element InputAction ma teraz identyfikator wersji i można go oznaczyć jako powtarzalny lub nie. Element InputAction zdefiniowany za pomocą metody 1.0.0-beta create() z pakietu wejściowego SDK jest domyślnie możliwy do ponownego przypisania i nie zawiera informacji o wersji:

Akcja wprowadzanie w pakiecie SDK do wprowadzania danych 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()
    )
);

Działanie wejściowe w pakiecie SDK do wprowadzania danych w wersji 1.1.0-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
);

Działanie wejściowe funkcji w pakiecie SDK w wersji 1.1.0-beta (z ciągiem znaków 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ń kluczy znajdziesz w artykule Identyfikatory kluczy śledzenia.

Zaktualizuj grupy wejściowe

We wejściowym pakiecie SDK 1.1.0-beta musisz jednoznacznie identyfikować każdy element (InputGroup). Każdy element InputAction należy do InputGroup, czyli zbioru powiązanych działań. Poprawia to nawigację i wykrywalność elementów sterujących podczas rozgrywki. Tak samo jak InputAction musi mieć unikalny identyfikator wśród wszystkich działań w pojedynczym elemencie InputContext, tak samo InputGroup musi mieć unikalny identyfikator we wszystkich istniejących grupach.

W przykładach z tej sekcji gra zawiera 2 obiekty InputContext reprezentujące menu główne i rozgrywkę. Odpowiednie identyfikatory są śledzone dla każdego elementu InputGroup w tych kontekstach za pomocą 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
}

Tak jak w przypadku InputAction, metoda InputGroup.create() w pakiecie SDK do wprowadzania danych 1.0.0-beta została wycofana. Musisz zaktualizować InputGroup w grze, podając identyfikator wersji i wartość logiczna wskazującą, czy obiekty InputAction w grupach można wykorzystać ponownie. Grupy utworzone za pomocą wycofanej metody create() pakietu wejściowego 1.0.0-beta z pakietu SDK można przypisać ponownie. Grupy te mają identyfikator 0, a identyfikator wersji jest pustym ciągiem znaków (""):

Grupa wejściowa w pakiecie SDK do wprowadzania danych 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
    )
);

Grupa wejściowa w pakiecie SDK do wprowadzania danych w wersji beta 1.1.0

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

Grupa wejściowa w pakiecie SDK do wprowadzania danych w wersji 1.1.0-beta (z ciągiem znaków 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ń kluczy znajdziesz w artykule Identyfikatory kluczy śledzenia.

Aktualizowanie mapy wejściowej

Metoda InputMap.create() w pakiecie SDK 1.0.0-beta została wycofana. Zaktualizuj urządzenie InputMap, aby przypisać identyfikator wersji, zrezygnuj całkowicie z funkcji mapowania lub przypisz listę zarezerwowanych kluczy do gry, których użytkownik nie ma używać do ponownego mapowania. Każdy element InputMap zdefiniowany za pomocą metody wejściowego pakietu SDK 1.0.0-beta create() jest domyślnie możliwy do ponownego przypisania, jest identyfikowany za pomocą identyfikatora 0 i nie ma żadnych zarezerwowanych kluczy.

Identyfikator wejściowy w pakiecie SDK wejściowym 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)
);

Mapa wprowadzania w pakiecie SDK wejściowym w wersji 1.1.0-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

Przejdź na wersję 1.1.0 w wersji beta, przypisując różne elementy sterujące do różnych scen za pomocą InputContexts lub aktualizując interfejs gry za pomocą opcji Otrzymywanie powiadomień o zmianie mapowania zdarzeń w aplikacji InputRemappingListeners.

Podczas aktualizowania powiązań kluczy zapoznaj się ze sprawdzonymi metodami ich projektowania oraz weź pod uwagę ograniczenia i ograniczenia funkcji mapowania.