במדריך הזה נסביר איך לשדרג את המשחק מ-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
.
כשמעדכנים את קיצורי הדרך, כדאי לעיין בשיטות המומלצות לעיצוב קיצורי הדרך ולקחת בחשבון את ההגבלות והמגבלות של תכונת המיפוי מחדש.