SDK ورودی برای Unity را به نسخه 1.1 ارتقا دهید

این راهنما نحوه ارتقاء بازی شما از نسخه ۱.۰ به ۱.۱ Input SDK برای Unity را توضیح می‌دهد. برای دستورالعمل‌های جاوا و کاتلین اینجا کلیک کنید .

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

گوگل پلی گیمز روی کامپیوتر از تغییر نقشه کنترل‌های کیبورد بر اساس کلیدهای اتصالی که بازی شما با استفاده از Input SDK ارائه می‌دهد، پشتیبانی می‌کند.

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

بازی‌های گوگل پلی روی کامپیوتر، هر ورودی تغییر یافته توسط کاربر را به ورودی پیش‌فرض بازی شما نگاشت می‌کند. به این ترتیب، بازی شما نیازی به آگاهی از تغییر نگاشت توسط بازیکن ندارد. اگر برای یک اقدام درون بازی، مانند نمایش کنترل‌های صفحه کلید در بازی خود، نیاز به دانستن ورودی جدید دارید، می‌توانید به صورت اختیاری یک فراخوانی ثبت کنید تا از رویدادهای تغییر نگاشت مطلع شوید.

بازی‌های گوگل پلی روی کامپیوتر، کنترل‌های تغییریافته‌ی کاربر را به‌صورت محلی ذخیره می‌کند تا در طول جلسات بازی باقی بماند. از آنجایی که این تنظیمات به‌صورت محلی ذخیره می‌شوند، بر تجربه‌ی موبایل تأثیری ندارند و پس از حذف نصب بازی‌های گوگل پلی روی کامپیوتر حذف می‌شوند. تنظیمات در چندین دستگاه کامپیوتر باقی نمی‌مانند.

برای فعال کردن تغییر کلید در بازی خود، نیازی به ارتقاء Input SDK ندارید، اما اگر پیکربندی پشتیبانی نشده‌ای شناسایی شود، تغییر کلید برای بازی شما غیرفعال خواهد شد.

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

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

  • به Input SDK 1.1.1-beta ارتقا دهید.
  • InputMap خود را به‌روزرسانی کنید تا ویژگی نگاشت مجدد غیرفعال شود.

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

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

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

اگر شرایط زیر برقرار نباشد، نگاشت مجدد ورودی غیرفعال است:

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

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

معرفی InputContext

InputContext به یک بازی اجازه می‌دهد تا از یک کلید برای اقدامات مختلف در بازی شما بدون تداخل استفاده کند. به این ترتیب، اگر یک بازی از فضا برای پریدن در طول گیم‌پلی و برای تأیید انتخاب منو استفاده کند، بازیکنان می‌توانند به صورت جداگانه آن را تغییر دهند. فضا به وارد شوید در منوها و فضا به پیکان رو به بالا در طول گیم‌پلی.

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

نموداری که جریان Input SDK را هنگام تغییر نقشه کلیدها نشان می‌دهد.

ارتقا

بازی‌هایی که از پیاده‌سازی‌های قبلی Input SDK استفاده می‌کنند، همچنان از بازنگاشت اولیه پشتیبانی می‌کنند، مگر اینکه از پیکربندی پشتیبانی‌نشده‌ای استفاده کنند. اگر بازی شما از نسخه قدیمی‌تر Input SDK استفاده می‌کند، راهنمای ارتقاء از 0.0.4 به 1.0.0-beta را مطالعه کنید.

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

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

نصب

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

برای افزودن Input SDK نسخه ۱.۱.۱-بتا به بازی خود، به بخش افزودن SDK مراجعه کنید.

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

برای نسخه ۱.۱.۱-بتا، بهتر است 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

اقدامات ورودی خود را به‌روزرسانی کنید

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

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-beta

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

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

گروه‌های ورودی خود را به‌روزرسانی کنید

در Input SDK 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() از Input SDK 1.0.0-beta منسوخ شده است. شما باید InputGroup خود را در بازی خود با یک شناسه نسخه و مقدار بولی که نشان می‌دهد آیا اشیاء InputAction در گروه‌های شما قابل تغییر هستند یا خیر، به‌روزرسانی کنید. گروه‌هایی که با متد منسوخ شده Input SDK 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 در Input SDK 1.1.1-beta

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

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.create() از Input SDK 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-beta


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 ، ارتقاء خود را به نسخه ۱.۱.۱-بتا ادامه دهید.

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