שדרוג קלט SDK עבור Java ו-Kotlin לגרסה 1.1

במדריך הזה נסביר איך לשדרג את המשחק מ-Input SDK בגרסה 1.0.0-beta ל-Java ול-Kotlin לגרסה 1.1.1-beta. הוראות ספציפיות ל-Unity מפורטות במדריך לשדרוג ב-Unity.

נתוני גרסה

Google Play Games במחשב תומך במיפוי מחדש של אמצעי הבקרה במקלדת על סמך קישורי המקשים שהמשחק מספק באמצעות Input SDK.

המשתמשים ניגשים לתכונה הזו על ידי פתיחת השכבה העליונה, בחירת אמצעי הבקרה ולחיצה על הפעולה שרוצים למפות מחדש.

Google Play Games במחשב ממפה כל קלט שהמשתמש שינה למק"ט ברירת המחדל של המשחק. כך המשחק לא צריך להיות מודע למיפוי מחדש של השחקן. אם אתם צריכים לדעת מהו הקלט החדש של פעולה במשחק, למשל הצגת אמצעי הבקרה של המקלדת במשחק, תוכלו לרשום פונקציית חזרה (callback) כדי לקבל התראה על אירועי מיפוי מחדש.

Google Play Games במחשב מאחסנת את אמצעי הבקרה שמופו מחדש של כל משתמש באופן מקומי, כך שהם קבועים בכל סשנים של גיימינג. מכיוון שהנתונים האלה מאוחסנים באופן מקומי, הם לא משפיעים על חוויית המשתמש בנייד, והם נמחקים כשמסירים את Google Play Games מהמחשב. הגדרות הבקרה לא נשמרות במכשירי PC מרובים.

אין צורך לשדרג את Input SDK כדי להפעיל את מיפוי המפתחות מחדש במשחק, אבל יכול להיות שהמיפוי מחדש יושבת אם מזוהה הגדרה לא נתמכת.

אם אתם רוצים לשלוט בחוויית המיפוי של הקלט, או אם תכונת המיפוי מושבתת במשחק, תוכלו לפעול לפי השלבים הבאים כדי לפתור את הבעיה:

  • משדרגים ל-Input SDK 1.1.1-beta.
  • מעדכנים את קיצורי הדרך כדי להימנע מהגדרות שלא נתמכות.
  • מעדכנים את InputMap כך שתכונת המיפוי מחדש תהיה מופעלת.

אם אתם רוצים לבטל את ההסכמה לשימוש בתכונה של שינוי המיפוי במשחק, ועדיין להציג את הגרסה לקריאה בלבד של קישורי המקשים, עליכם לפעול לפי השלבים הבאים:

  • משדרגים ל-Input SDK 1.1.1-beta.
  • מעדכנים את InputMap כדי להגדיר את תכונת המיפוי מחדש כמושבתת.

אתם יכולים לשדרג את הגרסה של Input SDK ל-1.1.1-beta כדי ליהנות מתכונות מתקדמות של שיוך מחדש ב-Google Play Games במחשב. לשם כך, אתם יכולים להשתמש ב-InputContexts כדי להגדיר אמצעי בקרה לסצנות שונות במשחק, להוסיף פונקציות חזרה (callbacks) כדי להאזין לאירועי שיוך מחדש, להגדיר קבוצה של מפתחות שמורים שהמשתמש לא יכול לשנות להם את השיוך, ולהשבית את תכונת השיוך מחדש לפי InputAction,‏ InputGroup או InputMap.

כשמשדרגים לגרסת ה-SDK החדשה, כדאי להביא בחשבון את החריגים הבאים:

הגדרות לא נתמכות

מיפוי מחדש של קלט מושבת אם התנאים הבאים לא מתקיימים:

  • InputAction שמשתמש במספר מפתחות חייב להיות מורכב ממקש צירוף ומקש שאינו מקש צירוף. לדוגמה, Shift + A תקין, אבל A + B, Ctrl + Alt ו-Shift + A + Tab לא חוקיים.

  • שני אובייקטים או יותר מסוג InputAction או InputGroup לא יכולים לחלוק את אותו מזהה ייחודי.

שדרוג

גרסת ה-beta 1.1.1 של Input SDK תואמת לאחור לגרסת ה-beta 1.0.0 של Input SDK. משחקים שנעשה בהם שימוש בהטמעות קודמות של קלט SDK עדיין תומכים במיפוי מחדש בסיסי, אלא אם הם משתמשים בהגדרות אישיות שלא נתמכות. אם במשחק שלכם נעשה שימוש בגרסה קודמת של Input SDK, מומלץ לקרוא את מדריך השדרוג מגרסה 0.0.4 לגרסה 1.0.0-beta.

השדרוג לגרסה 1.1.1-beta מאפשר תכונות חדשות, כולל:

תלות בשדרוג

אם אתם משתמשים ב-Gradle כדי לייבא את Input 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;
    }
}

עדכון פעולות הקלט

השיטה InputAction.create() של Input SDK 1.0.0-beta הוצאה משימוש. עכשיו יש למזהה InputAction מזהה גרסה, וניתן לסמן אותו כניתן למיפוי מחדש או לא. אפשר למפות מחדש כברירת מחדל את InputAction שמוגדר באמצעות השיטה create() של SDK הקלט 1.0.0-beta, והוא חסר מידע לגבי ניהול גרסאות:

InputAction ב-Input SDK 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 ב-Input SDK 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 ב-Input SDK 1.1.1-beta (עם מחרוזת גרסה)

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

למידע נוסף על ניהול גרסאות של קישורי המפתחות, תוכלו לקרוא את המאמר מעקב אחר מזהי מפתחות.

עדכון של InputGroups

ב-Input SDK 1.1.1-beta צריך לזהות באופן ייחודי כל InputGroup. כל InputAction שייך ל-InputGroup – אוסף של פעולות קשורות. כך קל יותר לנווט ולמצוא את אמצעי הבקרה במהלך המשחק. באותו אופן שבו ל-InputAction חייב להיות מזהה ייחודי בין כל הפעולות ב-InputContext יחיד, ל-InputGroup חייב להיות מזהה ייחודי בכל הקבוצות הקיימות.

בדוגמאות בקטע הזה, במשחק יש שני אובייקטים מסוג InputContext שמייצגים את התפריט הראשי ואת הגיימפליי. מתבצע מעקב אחר המזהים המתאימים לכל InputGroup בהקשרים האלה לפי הספירה הבאה:

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, השיטה InputGroup.create() של Input SDK‏ 1.0.0-beta הוצאה משימוש. עליכם לעדכן את InputGroup במשחק עם מזהה גרסה ועם ערך בוליאני שמציין אם אפשר למפות מחדש את האובייקטים מסוג InputAction בקבוצות. אפשר למפות מחדש קבוצות שנוצרו באמצעות השיטה 1.0.0-beta create() של Input SDK שהוצאה משימוש. המזהה שלהן הוא 0 ומזהה הגרסה הוא מחרוזת ריקה (""):

InputGroup ב-Input SDK 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 ב-Input SDK 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 ב-Input SDK 1.1.1-beta (עם מחרוזת גרסה)

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

למידע נוסף על ניהול גרסאות של קישורי המפתחות, תוכלו לקרוא את המאמר מעקב אחר מזהי מפתחות.

עדכון של InputMap

השיטה InputMap.create() של Input SDK 1.0.0-beta הוצאה משימוש. מעדכנים את InputMap כדי להקצות מזהה גרסה, לבטל את ההסכמה לשימוש בתכונה של מיפוי מחדש או להקצות רשימה של מפתחות שמורים למשחק, שאתם לא רוצים שהמשתמשים ישתמשו בהם למיפוי מחדש. כל InputMap שמוגדר באמצעות השיטה create() של Input SDK‏ 1.0.0-beta ניתן למיפוי מחדש כברירת מחדל, מזוהה באמצעות המזהה 0 ואין לו מפתחות שמורים.

InputMap ב-Input SDK 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 ב-Input SDK 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()
                )
        )
);

השלב הבא

כדי להמשיך בשדרוג לגרסה 1.1.1-beta, תוכלו להקצות פקדים שונים לסצנות שונות באמצעות InputContexts, או לעדכן את ממשק המשתמש של המשחק באמצעות קבלת התראות על שינוי המיפוי של אירועים באמצעות InputRemappingListeners.

כשמעדכנים את קיצורי הדרך, כדאי לעיין בשיטות המומלצות לעיצוב קיצורי הדרך ולקחת בחשבון את ההגבלות והמגבלות של תכונת המיפוי מחדש.