«کیت توسعه نرم‌افزار ورودی» را برای Unity به نسخه ۱.۱ ارتقا دهید

این راهنما توضیح می‌دهد که چگونه بازی خود را از نسخه ۱.۰ به نسخه ۱.۱ کیت توسعه نرم‌افزار ورودی برای Unity ارتقا دهید. برای دستورالعمل‌های Java و Kotlin، اینجا کلیک کنید.

یادداشت‌های انتشار

«بازی‌های Google Play در رایانه» از تخصیص مجدد کنترل‌های صفحه‌کلید براساس کلیدهای تخصیص‌یافته‌ای که بازی شما بااستفاده از «کیت توسعه نرم‌افزار ورودی» ارائه می‌دهد پشتیبانی می‌کند.

کاربران با باز کردن روپوش، انتخاب کنترل‌ها، و سپس کلیک کردن روی کنشی که می‌خواهند دوباره نگاشت کنند، به این ویژگی دسترسی پیدا می‌کنند.

«بازی‌های Google Play در رایانه» هر ورودی دوباره تخصیص‌یافته کاربر را به ورودی پیش‌فرض بازی‌تان تخصیص می‌دهد. به این ترتیب، بازی شما نیازی ندارد از تخصیص مجدد بازیکن مطلع باشد. اگر باید ورودی جدید کنش درون‌بازی را بدانید، مثلاً کنترل‌های صفحه‌کلید را در بازی‌تان نمایش دهید، می‌توانید به‌صورت اختیاری یک بازخوان ثبت کنید تا برای رویدادهای تخصیص مجدد مطلع شوید.

«بازی‌های Google Play در رایانه» کنترل‌های دوباره‌نگاشت‌شده کاربر را به‌صورت محلی ذخیره می‌کند تا در جلسات بازی حفظ شوند. ازآنجایی‌که این تنظیمات به‌صورت محلی ذخیره می‌شود، بر تجربه تلفن همراه تأثیر نمی‌گذارد و با حذف نصب «بازی‌های Google Play در رایانه» حذف می‌شود. تنظیمات در چند دستگاه رایانه شخصی حفظ نمی‌شود.

برای فعال کردن تخصیص مجدد کلید در بازی‌تان، نیازی به ارتقا دادن «کیت توسعه نرم‌افزار ورودی» ندارید، اما اگر پیکربندی پشتیبانی‌نشده‌ای شناسایی شود، تخصیص مجدد برای بازی‌تان غیرفعال خواهد شد.

اگر می‌خواهید تجربه تخصیص مجدد ورودی را کنترل کنید یا ویژگی تخصیص مجدد برای بازی شما غیرفعال است، این مراحل را دنبال کنید:

اگر می‌خواهید از ویژگی تخصیص مجدد برای بازی‌تان انصراف دهید و درعین‌حال همچنان نسخه فقط‌خواندنی تخصیص‌های کلید را نمایش دهید، این مراحل را دنبال کنید:

  • به «کیت توسعه نرم‌افزار ورودی» 1.1.1-beta ارتقا دهید.
  • برای تنظیم ویژگی تخصیص مجدد به حالت غیرفعال، InputMap خود را به‌روز کنید.

می‌توانید نسخه «کیت توسعه نرم‌افزار ورودی» را به 1.1.1-beta ارتقا دهید تا بااستفاده از InputContexts برای تعریف کنترل‌های صحنه‌های مختلف بازی‌تان، افزودن کاربردهای برگشتی برای گوش دادن به رویدادهای تخصیص مجدد، تعریف مجموعه‌ای از کلیدهای رزروشده که کاربر نمی‌تواند آن‌ها را مجدداً تخصیص دهد، و غیرفعال کردن ویژگی تخصیص مجدد برای InputAction، InputGroup، یا InputMap، از ویژگی‌های پیشرفته تخصیص مجدد در «بازی‌های Google Play در رایانه» بهره‌مند شوید.

هنگام ارتقا دادن، استثناهای زیر را درنظر بگیرید:

پیکربندی‌های پشتیبانی‌نشده

اگر شرایط زیر برآورده نشود، تخصیص مجدد ورودی غیرفعال می‌شود:

  • InputAction که از چندین کلید استفاده می‌کند باید از یک کلید اصلاح‌گر و یک کلید غیر اصلاح‌گر تشکیل شده باشد. برای مثال، Shift + A معتبر است اما A + B، Ctrl + Alt، و Shift + A + Tab نامعتبر است.

  • دو یا چند شیء InputAction یا InputGroup نمی‌توانند شناسه یکتای یکسانی داشته باشند.

معرفی InputContext

InputContext به بازی اجازه می‌دهد بدون تداخل از یک کلید برای کنش‌های مختلف در بازی‌تان استفاده کند. به این ترتیب، اگر بازی از کلید فاصله برای پریدن در حین بازی و برای تأیید انتخاب منو استفاده کند، بازیکنان می‌توانند به‌صورت جداگانه کلید فاصله را به کلید Enter در منوها و کلید فاصله را به کلید بالابر در حین بازی بازنگاری کنند.

نمودار توالی زیر نحوه عملکرد setInputContext() API در زمان اجرا را نشان می‌دهد:

نموداری که جریان «کیت توسعه نرم‌افزار ورودی» را هنگام تخصیص مجدد کلیدها نشان می‌دهد.

ارتقا

بازی‌هایی که از پیاده‌سازی‌های قبلی «کیت توسعه نرم‌افزار ورودی» استفاده می‌کنند همچنان از تغییر تخصیص پایه پشتیبانی می‌کنند، مگراینکه از پیکربندی پشتیبانی‌نشده استفاده کنند. اگر بازی شما از نسخه قدیمی‌تر «کیت توسعه نرم‌افزار ورودی» استفاده می‌کند، راهنمای ارتقا از نسخه ۰.۰.۴ به نسخه ۱.۰.۰-بتا را بخوانید.

ارتقا به نسخه 1.1.1-beta ویژگی‌های جدیدی را فعال می‌کند، ازجمله:

  • تغییرات زمینه‌ای را راه‌اندازی می‌کند.
  • دریافت اعلان‌های رویدادهای تخصیص کلید
  • غیرفعال کردن تخصیص مجدد براساس «کنش»، «گروه»، «زمینه»، یا «نقشه».

نصب

افزایه Unity نسخه ۱.۱.۱-بتا برای استفاده شما دردسترس است. باید نسخه‌های قبلی «کیت توسعه نرم‌افزار ورودی» نصب‌شده در بازی‌تان را حذف کنید و به نسخه فعلی ارتقا دهید.

برای افزودن Input SDK v1.1.1-beta به بازی‌تان، به افزودن کیت توسعه نرم‌افزار مراجعه کنید.

تعریف فیلدهای ایستا

برای نسخه 1.1.1-بتا، بهتر است InputActions، InputGroups، InputContexts، و InputMap را به‌عنوان فیلدهای ایستا در کلاس InputMappingProvider تعریف کنید، زیرا این فیلدها از بخش‌های دیگر برنامه شما قابل‌دسترس خواهند بود:

#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

به‌روزرسانی InputActions

روش InputAction.create() از «کیت توسعه نرم‌افزار ورودی» 1.0.0-beta منسوخ شده است. InputAction شناسه نسخه دارد و می‌تواند به‌عنوان قابل‌تغییر یا غیرقابل‌تغییر علامت‌گذاری شود. InputAction تعریف‌شده بااستفاده از روش Input SDK 1.0.0-beta create() به‌طور پیش‌فرض قابل‌تغییر است و اطلاعات نسخه ندارد:

‫InputAction در Input SDK نسخه 1.0.0-beta

var driveAction = PlayInputAction.Create(
    "Drive",
    (long)InputEventIds.DRIVE,
    PlayInputControls.Create(
        new[] { AndroidKeyCode.KEYCODE_SPACE },
        new List<PlayMouseAction>()
    )
);

‫InputAction در Input SDK نسخه 1.1.1-بتا

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 در Input SDK نسخه 1.1.1-beta (با رشته نسخه)

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

برای اطلاعات بیشتر درباره نسخه‌بندی کلیدهای تخصیص‌یافته، به ردیابی شناسه‌های کلید مراجعه کنید.

به‌روزرسانی InputGroups

در «کیت توسعه نرم‌افزار ورودی» 1.1.1-beta باید هر InputGroup را به‌صورت یکتا شناسایی کنید. هر InputAction متعلق به یک InputGroup است -- مجموعه‌ای از کنش‌های مرتبط. این کار پیمایش و قابلیت شناسایی کنترل‌ها را درطول بازی بهبود می‌بخشد. همان‌طور که یک InputAction باید در میان همه کنش‌های یک InputContext واحد، شناسه یکتا داشته باشد، InputGroup باید در میان گروه‌های موجود شناسه یکتا داشته باشد.

برای مثال‌های این بخش، یک بازی دو InputContext شیء دارد که منو اصلی و گیم‌پلی را نشان می‌دهند. شناسه‌های مناسب برای هر InputGroup در این زمینه‌ها بااستفاده از شمارش زیر پیگیری می‌شوند:

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() در «کیت توسعه نرم‌افزار ورودی» 1.0.0-beta منسوخ شده است. باید InputGroup را در بازی‌تان با یک شناسه نسخه و مقدار بولی که نشان می‌دهد آیا InputAction اشیاء در گروه‌هایتان قابل‌تغییر هستند یا نه به‌روز کنید. گروه‌های ایجادشده با روش منسوخ‌شده «کیت توسعه نرم‌افزار ورودی» 1.0.0-beta create() قابل تخصیص مجدد هستند، شناسه 0 دارند، و شناسه نسخه رشته‌ای خالی است (""):

‫InputGroup در Input SDK نسخه 1.0.0-beta

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

‫InputGroup در «کیت توسعه نرم‌افزار ورودی» نسخه ۱.۱.۱-بتا

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 در «کیت توسعه نرم‌افزار ورودی» نسخه ۱.۱.۱-بتا (با رشته نسخه)

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

برای اطلاعات بیشتر درباره نسخه‌بندی کلیدهای تخصیص‌یافته، به ردیابی شناسه‌های کلید مراجعه کنید.

به‌روزرسانی InputMap

روش InputMap.create() از «کیت توسعه نرم‌افزار ورودی» 1.0.0-beta منسوخ شده است. برای اختصاص دادن شناسه نسخه، انصراف کامل از ویژگی تغییر کلید، یا اختصاص دادن فهرستی از کلیدهای رزروشده برای بازی‌تان که نمی‌خواهید کاربر از آن‌ها برای تغییر کلید استفاده کند، InputMap را به‌روز کنید. هر InputMap تعریف‌شده بااستفاده از روش Input SDK 1.0.0-beta create() به‌طور پیش‌فرض قابل‌تغییر است، با شناسه 0 شناسایی می‌شود، و هیچ کلید رزروشده‌ای ندارد.

‫InputMap در Input SDK نسخه 1.0.0-beta

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

‫InputMap در Input SDK نسخه 1.1.1-بتا


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

قدم بعدی چیست

با اختصاص دادن کنترل‌های مختلف برای صحنه‌های مختلف بااستفاده از InputContexts یا به‌روزرسانی واسط کاربر بازی‌تان با دریافت اعلان درباره رویدادهای تخصیص مجدد بااستفاده از InputRemappingListeners، ارتقا به نسخه 1.1.1-beta را ادامه دهید.

هنگام به‌روزرسانی کلیدهای اختصاصی، به روال‌های مطلوب برای طراحی کلیدهای اختصاصی نگاهی بیندازید و محدودیت‌ها و محدودیت‌های ویژگی تخصیص مجدد را درنظر بگیرید.