इस गाइड में, अपने गेम को Java और Kotlin के लिए Input SDK टूल के 1.0.0-beta वर्शन से 1.1.1-beta वर्शन पर अपग्रेड करने का तरीका बताया गया है. Unity के लिए खास निर्देशों के लिए, Unity अपग्रेड गाइड देखें.
रिलीज़ नोट
Google Play Games on PC में, कीबोर्ड के कंट्रोल को फिर से मैप किया जा सकता है. यह, इनपुट SDK टूल का इस्तेमाल करके, आपके गेम में उपलब्ध की बाइंडिंग के आधार पर किया जाता है.
उपयोगकर्ता इस सुविधा को ऐक्सेस करने के लिए, ओवरले खोलते हैं. इसके बाद, वे कंट्रोल चुनते हैं और उस ऐक्शन पर क्लिक करते हैं जिसे उन्हें रीमैप करना है.
Google Play Games on PC, उपयोगकर्ता के मैप किए गए हर इनपुट को आपके गेम के डिफ़ॉल्ट इनपुट पर मैप करता है. इस तरह, आपके गेम को यह जानने की ज़रूरत नहीं होती कि प्लेयर ने बटनों को फिर से मैप किया है. अगर आपको गेम में की गई किसी कार्रवाई के लिए नया इनपुट जानना है, जैसे कि गेम में कीबोर्ड कंट्रोल दिखाना, तो इवेंट को फिर से मैप करने के लिए सूचना पाने के लिए, कॉलबैक रजिस्टर किया जा सकता है. हालांकि, ऐसा करना ज़रूरी नहीं है.
'पीसी के लिए Google Play Games', हर उपयोगकर्ता के रीमैप किए गए कंट्रोल को स्थानीय स्टोरेज में सेव करता है, ताकि वे गेमिंग सेशन के दौरान काम करते रहें. यह डेटा डिवाइस पर सेव होता है. इसलिए, इससे मोबाइल पर गेमिंग के अनुभव पर कोई असर नहीं पड़ता. साथ ही, Google Play Games on PC को अनइंस्टॉल करने पर, यह डेटा मिट जाता है. कंट्रोल सेटिंग, एक से ज़्यादा पीसी डिवाइसों पर सेव नहीं होतीं.
अपने गेम में बटन को फिर से मैप करने की सुविधा चालू करने के लिए, आपको Input SDK टूल को अपग्रेड करने की ज़रूरत नहीं है. हालांकि, अगर ऐसा कॉन्फ़िगरेशन मिलता है जो काम नहीं करता, तो आपके गेम के लिए बटन को फिर से मैप करने की सुविधा बंद की जा सकती है.
अगर आपको इनपुट को फिर से मैप करने की सुविधा को कंट्रोल करना है या आपके गेम के लिए यह सुविधा बंद है, तो इसे ठीक करने के लिए यह तरीका अपनाएं:
- Input SDK
1.1.1-beta
पर अपग्रेड करें. - काम न करने वाले कॉन्फ़िगरेशन से बचने के लिए, सभी कीबोर्ड बटन को अपडेट करें.
InputMap
को अपडेट करके, बटन को फिर से मैप करने की सुविधा को चालू के तौर पर सेट करें.
अगर आपको अपने गेम के लिए, बटन को फिर से मैप करने की सुविधा से ऑप्ट-आउट करना है, लेकिन आपको बटन बाइंडिंग का रीड-ओनली वर्शन दिखाना है, तो यह तरीका अपनाएं:
- Input SDK
1.1.1-beta
पर अपग्रेड करें. InputMap
को अपडेट करके, बटन को फिर से मैप करने की सुविधा को बंद है पर सेट करें.
पीसी पर Google Play Games में, बटन को फिर से मैप करने की बेहतर सुविधाओं का फ़ायदा पाने के लिए, इनपुट SDK टूल के वर्शन को 1.1.1-beta
पर अपग्रेड किया जा सकता है. इसके लिए, InputContexts
का इस्तेमाल करके अपने गेम के अलग-अलग सीन के लिए कंट्रोल तय करें. साथ ही, बटन को फिर से मैप करने के इवेंट को सुनने के लिए कॉलबैक जोड़ें. इसके अलावा, रिज़र्व की गई उन बटन का सेट तय करें जिन्हें उपयोगकर्ता फिर से मैप नहीं कर सकता. साथ ही, InputAction
, InputGroup
या InputMap
के हिसाब से, बटन को फिर से मैप करने की सुविधा बंद करें.
SDK टूल के नए वर्शन पर अपग्रेड करते समय, इन अपवादों का ध्यान रखें:
काम न करने वाले कॉन्फ़िगरेशन
इनपुट को फिर से मैप करने की सुविधा तब बंद हो जाती है, जब ये शर्तें पूरी नहीं होतीं:
एक से ज़्यादा बटन का इस्तेमाल करने वाले
InputAction
में, कार्रवाई बदलने वाली और कार्रवाई न बदलने वाली बटन का इस्तेमाल करना ज़रूरी है. उदाहरण के लिए,Shift + A मान्य है, लेकिनA + B ,Ctrl + Alt , औरShift + A + Tab अमान्य हैं.दो या उससे ज़्यादा
InputAction
याInputGroup
ऑब्जेक्ट एक ही यूनीक आईडी शेयर नहीं कर सकते.
अपग्रेड करें
Input SDK 1.1.1-beta, Input SDK 1.0.0-beta के साथ काम करता है. Input SDK टूल के पिछले वर्शन का इस्तेमाल करने वाले गेम, अब भी बुनियादी रीमैपिंग की सुविधा के साथ काम करते हैं. हालांकि, ऐसा तब तक होता है, जब तक वे काम न करने वाले कॉन्फ़िगरेशन का इस्तेमाल न करते हों. अगर आपका गेम, Input SDK टूल के किसी पुराने वर्शन का इस्तेमाल कर रहा है, तो 0.0.4 से 1.0.0-बीटा पर अपग्रेड करने के लिए गाइड पढ़ें.
1.1.1-बीटा वर्शन पर अपग्रेड करने पर, नई सुविधाएं चालू हो जाती हैं. इनमें ये शामिल हैं:
- सीन कंट्रोल में बदलाव ट्रिगर करना.
- मैपिंग के मुख्य इवेंट की सूचनाएं पाना.
- हर कार्रवाई, ग्रुप, कॉन्टेक्स्ट या मैप के हिसाब से, रीमैपिंग की सुविधा बंद करना.
डिपेंडेंसी को अपग्रेड करना
अगर Input SDK टूल को इंपोर्ट करने के लिए Gradle का इस्तेमाल किया जा रहा है, तो नए वर्शन पर अपग्रेड करें:
// build.gradle
dependencies {
...
implementation 'com.google.android.libraries.play.games:inputmapping:1.1.1-beta'
...
}
स्टैटिक फ़ील्ड तय करना
1.1.1-beta
वर्शन के लिए, अपने InputAction
, InputGroup
, InputContext
, और InputMap
ऑब्जेक्ट को अपनी InputMappingProvider
क्लास के स्टैटिक फ़ील्ड के तौर पर तय करना एक अच्छा तरीका है. ऐसा इसलिए, क्योंकि इन फ़ील्ड को आपके ऐप्लिकेशन के दूसरे हिस्सों से ऐक्सेस किया जा सकता है:
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(...)
}
}
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;
}
}
InputActions को अपडेट करना
इनपुट SDK 1.0.0-beta
का InputAction.create()
तरीका अब काम नहीं करता. InputAction
में अब वर्शन आइडेंटिफ़ायर है और इसे फिर से मैप किया जा सकता है या नहीं, इस आधार पर मार्क किया जा सकता है. इनपुट SDK टूल1.0.0-beta
create()
के तरीके का इस्तेमाल करके तय किया गया InputAction
, डिफ़ॉल्ट रूप से फिर से मैप किया जा सकता है. साथ ही, इसमें वर्शन की जानकारी नहीं होती:
Input SDK 1.0.0-beta में InputAction
val jumpInputAction = InputAction.create(
"Jump",
InputEventIds.JUMP.id,
InputControls.create(
listOf(KeyEvent.KEYCODE_SPACE),
emptyList()
)
)
InputAction moveUpInputAction = InputAction.create(
"Move Up",
InputEventIds.MOVE_UP.ordinal(),
InputControls.create(
Collections.singletonList(KeyEvent.KEYCODE_W),
Collections.emptyList()
)
);
Input SDK 1.1.1-beta में InputAction
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
}
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
);
Input SDK 1.1.1-beta में InputAction (वर्शन स्ट्रिंग के साथ)
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
)
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 अपडेट करना
इनपुट SDK 1.1.1-beta
में, आपको हर InputGroup
की यूनीक पहचान करनी होगी. हर InputAction
, InputGroup
से जुड़ा होता है. यह एक ऐसा कलेक्शन होता है जिसमें मिलती-जुलती कार्रवाइयां होती हैं. इससे गेमप्ले के दौरान, नेविगेशन और कंट्रोल को खोजे जाने की संभावना बढ़ती है. जिस तरह एक ही InputContext
में सभी कार्रवाइयों के बीच InputAction
का यूनीक आइडेंटिफ़ायर होना चाहिए उसी तरह मौजूदा ग्रुप में InputGroup
का यूनीक आईडी होना चाहिए.
इस सेक्शन में दिए गए उदाहरणों के लिए, गेम में दो InputContext
ऑब्जेक्ट होते हैं, जो मुख्य मेन्यू और गेमप्ले को दिखाते हैं. इन कॉन्टेक्स्ट में, हर InputGroup
के लिए सही आईडी ट्रैक किए जाते हैं. इसके लिए, नीचे दिए गए एनोटेशन का इस्तेमाल किया जाता है:
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
}
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
की तरह ही, इनपुट SDK टूल1.0.0-beta
के InputGroup.create()
तरीके को बंद कर दिया गया है. आपको अपने गेम में InputGroup
को वर्शन आइडेंटिफ़ायर और बोलियन के साथ अपडेट करना होगा. इससे यह पता चलता है कि आपके ग्रुप में मौजूद InputAction
ऑब्जेक्ट को फिर से मैप किया जा सकता है या नहीं. अब काम न करने वाले Input SDK टूल 1.0.0-beta
create()
के तरीके से बनाए गए ग्रुप को फिर से मैप किया जा सकता है. इनका आईडी 0 होता है और वर्शन आईडी एक खाली स्ट्रिंग (""
) होती है:
Input SDK 1.0.0-beta में InputGroup
val movementInputGroup = InputGroup.create(
"Basic Movement",
listOf(
moveUpInputAction,
moveLeftInputAction,
moveDownInputAction,
moveRightInputAction,
jumpInputAction,
runInputAction)
)
InputGroup movementInputGroup = InputGroup.create(
"Basic movement",
Arrays.asList(
moveUpInputAction,
moveLeftInputAction,
moveDownInputAction,
moveRightInputAction,
jumpInputAction,
runInputAction
)
);
Input SDK 1.1.1-beta में InputGroup
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
)
}
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
);
Input SDK 1.1.1-beta में InputGroup (वर्शन स्ट्रिंग के साथ)
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
)
}
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 अपडेट करना
इनपुट SDK टूल 1.0.0-beta
का InputMap.create()
तरीका अब काम नहीं करता. वर्शन आइडेंटिफ़ायर असाइन करने के लिए, अपने InputMap
को अपडेट करें. इसके अलावा, रीमैपिंग की सुविधा से पूरी तरह से ऑप्ट आउट करें या अपने गेम के लिए, उन बटन की सूची असाइन करें जिनका इस्तेमाल उपयोगकर्ता रीमैपिंग के लिए न कर सके. इनपुट SDK टूल 1.0.0-beta
create()
के तरीके का इस्तेमाल करके तय किए गए हर InputMap
को डिफ़ॉल्ट रूप से फिर से मैप किया जा सकता है. इसकी पहचान आईडी 0
से की जाती है और इसमें कोई रिज़र्व की गई कुंजी नहीं होती.
Input SDK 1.0.0-beta में InputMap
val gameInputMap = InputMap.create(
listOf(movementInputGroup, mouseMovementInputGroup),
MouseSettings.create(true, false)
)
InputMap gameInputMap = InputMap.create(
Arrays.asList(movementInputGroup, mouseMovementInputGroup),
MouseSettings.create(true, false)
);
Input SDK 1.1.1-beta में InputMap
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()))
)
}
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()
)
)
);
अगला कदम क्या है
InputContexts
का इस्तेमाल करके, अलग-अलग सीन के लिए अलग-अलग कंट्रोल असाइन करें और 1.1.1-बीटा वर्शन पर अपग्रेड करें. इसके अलावा, InputRemappingListeners
का इस्तेमाल करके, इवेंट को फिर से मैप करने पर सूचना पाएं और अपने गेम का यूज़र इंटरफ़ेस (यूआई) अपडेट करें.
बटनों को फिर से सेट करते समय, बटनों को सेट करने के सबसे सही तरीके देखें. साथ ही, बटनों को फिर से सेट करने की सुविधा की पाबंदियों और सीमाओं को ध्यान में रखें.