এই নির্দেশিকাটি ব্যাখ্যা করে কিভাবে আপনার গেমটিকে Java এবং Kotlin-এর জন্য 1.0.0-beta Input SDK থেকে 1.1.1-beta-তে আপগ্রেড করবেন। Unity-এর নির্দিষ্ট নির্দেশাবলীর জন্য Unity আপগ্রেড নির্দেশিকা দেখুন।
রিলিজ নোট
পিসিতে গুগল প্লে গেমস, ইনপুট এসডিকে ব্যবহার করে আপনার গেমের দেওয়া কী বাইন্ডিং অনুসারে কিবোর্ড কন্ট্রোল রিম্যাপ করা সমর্থন করে।
ব্যবহারকারীরা ওভারলে খুলে, কন্ট্রোলগুলো নির্বাচন করে এবং তারপরে যে অ্যাকশনটি রিম্যাপ করতে চান সেটিতে ক্লিক করে এই ফিচারটি অ্যাক্সেস করতে পারেন।
পিসিতে গুগল প্লে গেমস ব্যবহারকারীর রিম্যাপ করা প্রতিটি ইনপুটকে আপনার গেমের ডিফল্ট ইনপুটে ম্যাপ করে দেয়। এর ফলে, প্লেয়ারের এই রিম্যাপিং সম্পর্কে আপনার গেমকে জানতে হয় না। যদি গেমের ভেতরের কোনো কাজের জন্য, যেমন আপনার গেমে কিবোর্ড কন্ট্রোল দেখানোর জন্য, নতুন ইনপুটটি জানার প্রয়োজন হয়, তবে রিম্যাপিং ইভেন্টের নোটিফিকেশন পাওয়ার জন্য আপনি ঐচ্ছিকভাবে একটি কলব্যাক রেজিস্টার করতে পারেন।
পিসিতে গুগল প্লে গেমস প্রতিটি ব্যবহারকারীর রিম্যাপ করা কন্ট্রোলগুলো স্থানীয়ভাবে সংরক্ষণ করে, ফলে সেগুলো একাধিক গেমিং সেশনেও অপরিবর্তিত থাকে। যেহেতু এটি স্থানীয়ভাবে সংরক্ষিত থাকে, তাই এটি মোবাইলের অভিজ্ঞতাকে প্রভাবিত করে না এবং পিসিতে গুগল প্লে গেমস আনইনস্টল করলে মুছে যায়। কন্ট্রোল সেটিংস একাধিক পিসি ডিভাইসে সংরক্ষিত থাকে না।
আপনার গেমে কী রিম্যাপিং চালু করার জন্য ইনপুট এসডিকে আপগ্রেড করার প্রয়োজন নেই, তবে কোনো অসমর্থিত কনফিগারেশন শনাক্ত হলে আপনার গেমের জন্য রিম্যাপিং নিষ্ক্রিয় করা যেতে পারে।
আপনি যদি ইনপুট রিম্যাপিং অভিজ্ঞতা নিয়ন্ত্রণ করতে চান, অথবা আপনার গেমের জন্য রিম্যাপিং বৈশিষ্ট্যটি নিষ্ক্রিয় করা থাকে, তবে সমাধান করতে নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করুন:
- ইনপুট এসডিকে
1.1.1-betaসংস্করণে আপগ্রেড করুন। - অসমর্থিত কনফিগারেশনগুলো এড়াতে যেকোনো কী-বাইন্ডিং আপডেট করুন।
- রিম্যাপিং বৈশিষ্ট্যটি সক্রিয় করতে আপনার
InputMapআপডেট করুন।
আপনি যদি আপনার গেমের রিম্যাপিং ফিচারটি নিষ্ক্রিয় রাখতে চান এবং একই সাথে আপনার কী বাইন্ডিং-এর রিড-অনলি সংস্করণটি প্রদর্শন করতে চান, তাহলে এই ধাপগুলো অনুসরণ করুন:
- ইনপুট এসডিকে
1.1.1-betaসংস্করণে আপগ্রেড করুন। - রিম্যাপিং বৈশিষ্ট্যটি নিষ্ক্রিয় করতে আপনার
InputMapআপডেট করুন।
আপনি আপনার ইনপুট এসডিকে (Input SDK)-এর সংস্করণটি 1.1.1-beta তে আপগ্রেড করে পিসিতে গুগল প্লে গেমসের উন্নত রিম্যাপিং বৈশিষ্ট্যগুলির সুবিধা নিতে পারেন। এর মাধ্যমে আপনি InputContexts ব্যবহার করে আপনার গেমের বিভিন্ন দৃশ্যের জন্য কন্ট্রোল নির্ধারণ করতে, রিম্যাপিং ইভেন্ট শোনার জন্য কলব্যাক যোগ করতে, এমন কিছু সংরক্ষিত কী (reserved keys) নির্ধারণ করতে পারেন যেগুলিতে ব্যবহারকারী রিম্যাপ করতে পারবে না, এবং প্রতিটি InputAction , InputGroup বা InputMap -এর জন্য রিম্যাপিং বৈশিষ্ট্যটি নিষ্ক্রিয় করতে পারবেন।
নতুন SDK সংস্করণে আপগ্রেড করার সময় নিম্নলিখিত ব্যতিক্রমগুলি বিবেচনা করুন:
অসমর্থিত কনফিগারেশন
নিম্নলিখিত শর্তগুলো পূরণ না হলে ইনপুট রিম্যাপিং নিষ্ক্রিয় থাকে:
একাধিক কী ব্যবহারকারী একটি
InputActionঅবশ্যই একটি মডিফায়ার এবং একটি নন-মডিফায়ার কী দ্বারা গঠিত হতে হবে। উদাহরণস্বরূপ,শিফট + এ বৈধ কিন্তুএ + বি ,Ctrl + Alt এবংShift + A + Tab নয়।দুই বা ততোধিক
InputActionবাInputGroupঅবজেক্ট একই অনন্য আইডি ব্যবহার করতে পারে না।
আপগ্রেড
ইনপুট এসডিকে ১.১.১-বিটা, ইনপুট এসডিকে ১.০.০-বিটা-এর সাথে ব্যাকওয়ার্ড কম্প্যাটিবল। যে গেমগুলো ইনপুট এসডিকে-এর পূর্ববর্তী সংস্করণ ব্যবহার করে, সেগুলো এখনও বেসিক রিম্যাপিং সমর্থন করে, যদি না তারা কোনো অসমর্থিত কনফিগারেশন ব্যবহার করে। যদি আপনার গেমটি ইনপুট এসডিকে-এর কোনো পূর্ববর্তী সংস্করণ ব্যবহার করে থাকে, তবে ০.০.৪ থেকে ১.০.০-বিটা-তে আপগ্রেড করার নির্দেশিকাটি পড়ে দেখতে পারেন।
1.1.1-বিটা সংস্করণে আপগ্রেড করলে নিম্নলিখিত নতুন বৈশিষ্ট্যগুলি সক্ষম হবে:
- দৃশ্য নিয়ন্ত্রণ পরিবর্তন চালু করা ।
- গুরুত্বপূর্ণ ম্যাপিং ইভেন্টগুলির বিজ্ঞপ্তি গ্রহণ করা হচ্ছে ।
- প্রতিটি অ্যাকশন, গ্রুপ, কনটেক্সট বা ম্যাপের জন্য রিম্যাপিং নিষ্ক্রিয় করা।
নির্ভরতা আপগ্রেড করুন
আপনি যদি ইনপুট এসডিকে ইম্পোর্ট করার জন্য গ্রেডল ব্যবহার করে থাকেন, তাহলে সর্বশেষ সংস্করণে আপগ্রেড করুন:
// 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;
}
}
আপনার ইনপুট অ্যাকশনগুলি আপডেট করুন
Input SDK 1.0.0-beta এর InputAction.create() মেথডটি এখন আর ব্যবহার করা হয় না। একটি InputAction এখন একটি ভার্সন আইডেন্টিফায়ার থাকে এবং এটিকে রিম্যাপেবল হিসেবে চিহ্নিত করা যায় বা নাও করা যায়। Input SDK 1.0.0-beta create() মেথড ব্যবহার করে সংজ্ঞায়িত একটি 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()
)
);
ইনপুট এসডিকে ১.১.১-বিটা-তে ইনপুটঅ্যাকশন
কোটলিন
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
);
ইনপুট এসডিকে ১.১.১-বিটা (সংস্করণ স্ট্রিং সহ) এর ইনপুটঅ্যাকশন
কোটলিন
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
);
আপনার কী বাইন্ডিংগুলির ভার্সনিং সম্পর্কে আরও তথ্যের জন্য, ‘কী আইডি ট্র্যাকিং’ দেখুন।
আপনার ইনপুটগ্রুপগুলি আপডেট করুন
ইনপুট এসডিকে 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 মতো, Input SDK 1.0.0-beta এর InputGroup.create() মেথডটিও ডেপ্রিকেটেড (deprecated) করা হয়েছে। আপনাকে অবশ্যই আপনার গেমে থাকা InputGroup একটি ভার্সন আইডেন্টিফায়ার এবং একটি বুলিয়ান ভ্যালু দিয়ে আপডেট করতে হবে, যা নির্দেশ করবে যে আপনার গ্রুপের InputAction অবজেক্টগুলো রিম্যাপেবল (remappable) কিনা। ডেপ্রিকেটেড Input SDK 1.0.0-beta create() মেথড দিয়ে তৈরি করা গ্রুপগুলো রিম্যাপেবল হয়, সেগুলোর আইডি (ID) হয় 0, এবং ভার্সন আইডি একটি খালি স্ট্রিং ( "" ) হয়:
ইনপুট এসডিকে ১.০.০-বিটা-তে ইনপুটগ্রুপ
কোটলিন
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
)
);
ইনপুট এসডিকে ১.১.১-বিটা-তে ইনপুটগ্রুপ
কোটলিন
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
);
ইনপুট এসডিকে ১.১.১-বিটা (সংস্করণ স্ট্রিং সহ) এর ইনপুটগ্রুপ
কোটলিন
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
);
আপনার কী বাইন্ডিংগুলির ভার্সনিং সম্পর্কে আরও তথ্যের জন্য, ‘কী আইডি ট্র্যাকিং’ দেখুন।
আপনার ইনপুটম্যাপ আপডেট করুন
Input SDK 1.0.0-beta এর InputMap.create() মেথডটি এখন আর ব্যবহার করা হয় না। আপনার InputMap আপডেট করে একটি ভার্সন আইডেন্টিফায়ার নির্ধারণ করুন, রিম্যাপিং ফিচারটি থেকে সম্পূর্ণভাবে বেরিয়ে আসুন অথবা আপনার গেমের জন্য সংরক্ষিত কী-গুলোর একটি তালিকা নির্ধারণ করুন, যেগুলো আপনি ব্যবহারকারীকে রিম্যাপিংয়ের জন্য ব্যবহার করতে দিতে চান না। Input SDK 1.0.0-beta create() মেথড ব্যবহার করে সংজ্ঞায়িত প্রতিটি InputMap ডিফল্টরূপে রিম্যাপযোগ্য, ID 0 দ্বারা চিহ্নিত এবং এতে কোনো সংরক্ষিত কী নেই।
ইনপুট এসডিকে ১.০.০-বিটা-তে ইনপুটম্যাপ
কোটলিন
val gameInputMap = InputMap.create(
listOf(movementInputGroup, mouseMovementInputGroup),
MouseSettings.create(true, false)
)
জাভা
InputMap gameInputMap = InputMap.create(
Arrays.asList(movementInputGroup, mouseMovementInputGroup),
MouseSettings.create(true, false)
);
ইনপুট এসডিকে ১.১.১-বিটা-তে ইনপুটম্যাপ
কোটলিন
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 ব্যবহার করে বিভিন্ন দৃশ্যের জন্য আলাদা আলাদা কন্ট্রোল নির্ধারণ করে অথবা InputRemappingListeners ব্যবহার করে রিম্যাপিং ইভেন্টের নোটিফিকেশন পেয়ে আপনার গেমের UI আপডেট করার মাধ্যমে 1.1.1-beta-তে আপনার আপগ্রেড চালিয়ে যান।
আপনার কী-বাইন্ডিং আপডেট করার সময় , কী-বাইন্ডিং ডিজাইন করার সর্বোত্তম পদ্ধতিগুলো দেখে নিন এবং রিম্যাপিং ফিচারের সীমাবদ্ধতাগুলো বিবেচনা করুন।