Uaktualnienie pakietu wejściowego SDK dla Unity do wersji 1.1

Z tego przewodnika dowiesz się, jak uaktualnić grę z wersji 1.0 do pakietu Input SDK 1.1 dla Unity. Kliknij tutaj, aby uzyskać instrukcje dotyczące języków Java i Kotlin.

Informacje o wersji

Gry Google Play na PC umożliwiają przemapowanie elementów sterujących klawiatury na podstawie powiązań klawiszy w grze za pomocą pakietu SDK do wprowadzania danych.

Użytkownicy uzyskują dostęp do tej funkcji, otwierając nakładkę, wybierając sterowanie, a następnie klikając działanie, które chcą przemapować.

Gry Google Play na PC przypisują każde przypisanie przez użytkownika domyślnego wejścia do gry. Dzięki temu gra nie musi pamiętać o mapowaniu graczy. Jeśli potrzebujesz dostępu do nowego urządzenia wejściowego dla działania w grze, na przykład do wyświetlania elementów sterujących na klawiaturze, możesz opcjonalnie zarejestrować wywołanie zwrotne, które będzie otrzymywać powiadomienia o mapowaniu zdarzeń.

Gry Google Play na PC przechowują przypisane przez użytkownika kontrolery lokalnie, aby zachować je na kolejne sesje gry. Ponieważ te ustawienia są przechowywane lokalnie, nie wpływają na korzystanie z aplikacji na urządzeniu mobilnym i są usuwane po odinstalowaniu Gier Google Play na PC. Ustawienia nie są zachowywane na wielu komputerach.

Aby włączyć w grze mapowanie klawiszy, nie musisz aktualizować pakietu Input SDK, ale jeśli wykryjemy nieobsługiwaną konfigurację, mapowanie zostanie wyłączone.

Jeśli chcesz kontrolować przemapowanie wejść lub funkcja przemapowania jest wyłączona w przypadku Twojej gry, wykonaj te czynności:

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

  • Uaktualnij pakiet SDK Input do wersji 1.1.1-beta.
  • Zaktualizuj urządzenie InputMap, aby wyłączyć funkcję ponownego mapowania.

Aby korzystać z zaawansowanych funkcji przemapowania w Google Play Games na PC, możesz uaktualnić pakiet SDK do wprowadzania danych wejściowych do wersji 1.1.1-beta. Aby to zrobić, użyj elementu InputContexts do zdefiniowania elementów sterujących w różnych scenach gry, dodaj wywołania zwrotne do nasłuchiwania zdarzeń przemapowania, zdefiniuj zestaw zablokowanych klawiszy, których użytkownik nie może przemapować, oraz wyłącz funkcję przemapowania za pomocą elementu InputAction, InputGroup lub InputMap.

Podczas aktualizacji weź pod uwagę te wyjątki:

Nieobsługiwane konfiguracje

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

  • InputAction, który używa wielu klawiszy, musi składać się z klawisza modyfikującego i nie modyfikującego. Na przykład Shift + A jest prawidłową kombinacją, 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 elementinputContext

InputContext pozwala grze używać tego samego klawisza do różnych działań w grze bez konfliktów. Jeśli gra używa spacji do skakania podczas rozgrywki i potwierdzania wyboru w menu, gracze mogą indywidualnie przypisać spację do Enter w menu oraz spację do strzałki w górę podczas rozgrywki.

Ten diagram sekwencji pokazuje, jak działa interfejs API setInputContext() 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 przemapowanie, chyba że używają nieobsługiwanej konfiguracji. Jeśli Twoja gra korzysta ze starszej wersji pakietu Input SDK, przeczytaj przewodnik po uaktualnieniu z wersji 0.0.4 do 1.0.0-beta.

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

  • Zmiany kontekstu wywołania.
  • Otrzymywanie powiadomień o kluczowych zdarzeniach mapowania
  • Wyłączanie mapowania na poziomie działania, grupy, kontekstu lub mapy.

Instalacja

Możesz użyć wtyczki Unity w wersji 1.1.1-beta. Musisz usunąć wszystkie wcześniejsze wersje pakietu SDK do obsługi danych wejściowych zainstalowane w grze i zaktualizować go do bieżącej wersji.

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

Definiowanie pól statycznych

W wersji 1.1.1-beta warto zdefiniować pola 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 działań związanych z wpisaniem

Metoda InputAction.create() pakietu Input SDK 1.0.0-beta została wycofana. InputAction ma identyfikator wersji i może być oznaczony jako możliwy do zamapowania lub nie. InputAction zdefiniowany za pomocą pakietu Input SDK 1.0.0-beta create() jest domyślnie przypisany 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>()
    )
);

Wejściowe działanie w pakiecie SDK danych wejściowych 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 1.1.1-beta (z ciągiem 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 obsłudze wersji powiązań kluczy znajdziesz w artykule Identyfikatory kluczy śledzenia.

Aktualizowanie grup wejściowych

W pakiecie SDK danych wejściowych 1.1.1-beta musisz jednoznacznie zidentyfikować każde InputGroup. Każdy element InputAction należy do elementu InputGroup, czyli zbioru powiązanych działań. Dzięki temu poprawia się nawigacja i widoczność 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ć unikalny identyfikator wśród wszystkich istniejących grup.

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

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() pakietu SDK wejściowego 1.0.0-beta została wycofana. Musisz zaktualizować InputGroup w grze za pomocą identyfikatora wersji i wartości logicznej, które wskazują, czy obiekty InputAction w grupach można zmapować. Grupy utworzone za pomocą wycofanej metody pakietu Input SDK 1.0.0-beta create() można ponownie zmapować. Mają one identyfikator 0, a identyfikator wersji to pusty ciąg znaków (""):

InputGroup w Input SDK 1.0.0-beta

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

InputGroup w Input SDK 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 1.1.1-beta (z ciągiem znaków 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 przypisań klawiszy znajdziesz w artykule Śledzenie identyfikatorów kluczy.

Zaktualizuj Twoją mapę wejściową

Metoda InputMap.create() pakietu Input SDK 1.0.0-beta została wycofana. Zaktualizuj plik InputMap, aby przypisać identyfikator wersji, całkowicie zrezygnować z funkcji przemapowania lub przypisać do gry listę zablokowanych kluczy, których użytkownik nie może używać do przemapowania. Każda funkcja InputMapzdefiniowana za pomocą metody pakietu Input SDK 1.0.0-beta create() jest domyślnie możliwa do zamapowania, jest identyfikowana za pomocą identyfikatora 0 i nie ma żadnych zablokowanych klawiszy.

InputMap w Input SDK 1.0.0-beta

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

InputMap w Input SDK 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 aktualizację 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 za pomocą InputRemappingListeners, aby otrzymywać powiadomienia o przemapowaniu zdarzeń.

Podczas aktualizowania przypisania klawiszy zapoznaj się ze sprawdzonymi metodami projektowania przypisania klawiszy i weź pod uwagę ograniczenia oraz ograniczenia funkcji przemapowania.