Uaktualnienie pakietu wejściowego SDK dla Unity do wersji 1.1

Z tego przewodnika dowiesz się, jak zaktualizować grę z pakietu Input SDK w wersji 1.0 do wersji 1.1 na platformie Unity. Kliknij tutaj, aby wyświetlić instrukcje dotyczące języków Java i Kotlin.

Informacje o wersji

Gry Google Play na PC obsługują zmianę przypisania klawiszy na podstawie przypisań klawiszy w grze, które są udostępniane za pomocą pakietu Input SDK.

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 zmienione przez użytkownika dane wejściowe na domyślne dane wejściowe gry. Dzięki temu gra nie musi wiedzieć o zmianach przypisania przycisków przez gracza. Jeśli chcesz poznać nowe dane wejściowe dla działania w grze, np. wyświetlić w niej elementy sterujące klawiatury, możesz zarejestrować wywołanie zwrotne, aby otrzymywać powiadomienia o zdarzeniach ponownego mapowania.

Gry Google Play na PC przechowują lokalnie zmienione ustawienia sterowania użytkownika, aby zachować je podczas sesji grania. Te ustawienia są przechowywane lokalnie, więc nie wpływają na działanie aplikacji mobilnej i są usuwane po odinstalowaniu Gier Google Play na PC. Ustawienia nie są zachowywane na wielu komputerach.

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

Jeśli chcesz kontrolować ponowne mapowanie danych wejściowych lub funkcja ponownego mapowania jest wyłączona w Twojej grze, wykonaj te czynności:

  • 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 wyłączyć funkcję ponownego mapowania.

Możesz uaktualnić wersję pakietu Input SDK do 1.1.1-beta, aby korzystać z zaawansowanych funkcji ponownego mapowania w Grach 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 wyłączyć funkcję ponownego mapowania dla InputAction, InputGroup lub InputMap.

Podczas przechodzenia na wyższą wersję weź pod uwagę te wyjątki:

Nieobsługiwane konfiguracje

Zmiana mapowania danych wejściowych jest wyłączona, jeśli nie są spełnione te warunki:

  • InputAction, który wykorzystuje wiele klawiszy, musi składać się z klawisza modyfikującego i klawisza niemodyfikującego. Na przykład Shift + A jest prawidłowy, ale A + B, Ctrl + AltShift + A + Tab są nieprawidłowe.

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

Przedstawiamy InputContext

InputContext umożliwia grze używanie tego samego klawisza do różnych działań bez konfliktów. Dzięki temu, jeśli gra używa spacji do skakania podczas rozgrywki i do potwierdzania wyboru w menu, gracze mogą indywidualnie zmienić przypisanie spacji na Enter w menu i spacji na strzałkę w górę podczas rozgrywki.

Ten diagram sekwencji pokazuje, jak interfejs setInputContext() API działa w czasie wykonywania:

Diagram przedstawiający przepływ danych w pakiecie Input SDK podczas ponownego mapowania klawiszy.

Uaktualnij

Gry korzystające z poprzednich implementacji pakietu SDK do obsługi danych wejściowych nadal obsługują podstawowe ponowne mapowanie, chyba że używają nieobsługiwanej konfiguracji. Jeśli Twoja gra korzysta ze starszej wersji pakietu SDK Input, 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:

  • Zmiany kontekstu wyzwalania.
  • Otrzymywanie powiadomień o kluczowych zdarzeniach mapowania
  • Wyłączanie ponownego mapowania dla poszczególnych działań, grup, kontekstów lub map.

Instalacja

Wtyczka Unity w wersji 1.1.1-beta jest dostępna do użytku. Musisz usunąć wszystkie poprzednie wersje pakietu Input SDK zainstalowane w grze i przejść na bieżącą wersję.

Aby dodać do gry pakiet Input SDK w wersji 1.1.1-beta, zapoznaj się z sekcją Dodawanie pakietu SDK.

Definiowanie pól statycznych

W przypadku wersji 1.1.1-beta warto zdefiniować InputActions, InputGroups, InputContextsInputMap jako pola statyczne klasy InputMappingProvider, ponieważ będą one dostępne z innych części aplikacji:

#if PLAY_GAMES_PC
using Java.Lang;
using Java.Util;
using Google.Android.Libraries.Play.Games.Inputmapping;
using Google.Android.Libraries.Play.Games.Inputmapping.Datamodel;

public class InputSDKMappingProvider : InputMappingProviderCallbackHelper
{
    public static readonly string INPUT_MAP_VERSION = "1.0.0";

    private static readonly InputAction driveInputAction =
            InputAction.Create(...);
    private static readonly InputGroup roadInputGroup = InputGroup.Create(...);
    public static readonly InputContext roadControlsContext =
            InputContext.Create(...);
    public static readonly InputMap inputMap = InputMap.Create(...);

    public override InputMap OnProvideInputMap()
    {
        return inputMap;
    }
}
#endif

Aktualizowanie InputActions

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

InputAction w pakiecie Input SDK w wersji 1.0.0-beta

var driveAction = PlayInputAction.Create(
    "Drive",
    (long)InputEventIds.DRIVE,
    PlayInputControls.Create(
        new[] { AndroidKeyCode.KEYCODE_SPACE },
        new List<PlayMouseAction>()
    )
);

InputAction w pakiecie Input SDK w wersji 1.1.1-beta

private static readonly InputAction driveInputAction = InputAction.Create(
    "Drive",
    (long)InputEventIds.DRIVE,
    InputControls.Create(
        new[] { new Integer(AndroidKeyCode.KEYCODE_SPACE) }.ToJavaList(),
        new ArrayList<Integer>()),
    InputEnums.REMAP_OPTION_ENABLED
);

InputAction w pakiecie Input SDK w wersji 1.1.1-beta (z ciągiem tekstowym wersji)

private static readonly InputAction driveInputAction = InputAction.Create(
    "Drive",
    InputControls.Create(
        new[] { new Integer(AndroidKeyCode.KEYCODE_SPACE) }.ToJavaList(),
        new ArrayList<Integer>()),
    InputIdentifier.Create(
        INPUT_MAP_VERSION, (long)InputEventIds.DRIVE),
    InputEnums.REMAP_OPTION_ENABLED
);

Więcej informacji o zarządzaniu wersjami 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 InputAction musi mieć niepowtarzalny identyfikator wśród wszystkich działań w ramach jednego InputContext, InputGroup musi mieć niepowtarzalny identyfikator wśród istniejących grup.

W przykładach w tej sekcji gra ma 2 obiekty InputContext reprezentujące menu główne i rozgrywkę. W tych kontekstach śledzone są odpowiednie identyfikatory dla każdego InputGroup za pomocą tego wyliczenia:

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 w przypadku InputAction, metoda InputGroup.create() pakietu Input SDK1.0.0-beta została wycofana. Musisz zaktualizować InputGroup w grze, podając identyfikator wersji i wartość logiczną wskazującą, czy obiekty InputAction w grupach można ponownie mapować. Grupy utworzone za pomocą wycofanej metody Input SDK 1.0.0-beta create() 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

var gameInputGroup = PlayInputGroup.Create(
    "Road controls",
    new List<PlayInputAction>
    {
        driveAction,
        turboAction,
        openGarageAction,
        openPgsAction,
        openStoreAction
    }
);

InputGroup w pakiecie Input SDK w wersji 1.1.1-beta

private static readonly InputGroup roadInputGroup = InputGroup.Create(
    "Road controls",
    new[]
    {
        driveInputAction,
        turboInputAction,
        openGarageInputAction,
        openPgsInputAction,
        openStoreInputAction,
    }.ToJavaList(),
    (long)InputGroupsIds.ROAD_CONTROLS,
    // All input actions of this group will be remappable unless specified
    // the contrary by the individual input actions.
    InputEnums.REMAP_OPTION_ENABLED
);

InputGroup w pakiecie Input SDK w wersji 1.1.1-beta (z ciągiem tekstowym wersji)

private static readonly InputGroup roadInputGroup = InputGroup.Create(
    "Road controls",
    new[]
    {
        driveInputAction,
        turboInputAction,
        openGarageInputAction,
        openPgsInputAction,
        openStoreInputAction,
    }.ToJavaList(),
    InputIdentifier.Create(
        INPUT_MAP_VERSION, (long)InputGroupsIds.ROAD_CONTROLS),
    // All input actions of this group will be remappable unless specified
    // the contrary by the individual input actions.
    InputEnums.REMAP_OPTION_ENABLED
);

Więcej informacji o zarządzaniu wersjami 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 powinien używać do ponownego mapowania. Każdy InputMapzdefiniowany za pomocą metody Input SDK 1.0.0-beta create() można domyślnie ponownie przypisać, jest identyfikowany za pomocą identyfikatora 0 i nie ma żadnych zarezerwowanych klawiszy.

InputMap w pakiecie Input SDK w wersji 1.0.0-beta

var gameInputMap = PlayInputMap.Create(
    new List<PlayInputGroup>
    {
        gameInputGroup,
        menuInputGroup
    },
    PlayMouseSettings.Create(false, false)
);

InputMap w pakiecie Input SDK w wersji 1.1.1-beta


public static readonly string INPUT_MAP_VERSION = "1.0.0";
public static readonly long INPUT_MAP_ID = 0;

public static readonly InputMap inputMap = InputMap.Create(
    new[] { roadInputGroup, menuInputGroup }.ToJavaList(),
    MouseSettings.Create(false, false),
    InputIdentifier.Create(INPUT_MAP_VERSION, INPUT_MAP_ID),
    // Use ESC as reserved key
    InputEnums.REMAP_OPTION_ENABLED,
    new[]
    {
        InputControls.Create(new[]
        {
            new Integer(AndroidKeyCode.KEYCODE_ESCAPE)
        }.ToJavaList(),
        new ArrayList<Integer>())
    }.ToJavaList()
);

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 najlepszymi praktykami projektowania przypisań klawiszy i weź pod uwagę ograniczenia oraz limity funkcji ponownego mapowania.