อัปเกรดอินพุต SDK สำหรับ Unity เป็นเวอร์ชัน 1.1

คู่มือนี้อธิบายวิธีอัปเกรดเกมจาก Input SDK สำหรับ Unity เวอร์ชัน 1.0 เป็น 1.1 คลิกที่นี่ เพื่อดูวิธีการสำหรับ Java และ Kotlin

บันทึกประจำรุ่น

Google Play Games บน PC รองรับการแมปการควบคุมด้วยแป้นพิมพ์ใหม่ตาม การเชื่อมโยงคีย์ที่เกมของคุณระบุโดยใช้ Input SDK

ผู้ใช้จะเข้าถึงฟีเจอร์นี้ได้โดยเปิดการซ้อนทับ เลือกการควบคุม แล้วคลิกการดำเนินการที่ต้องการรีแมป

Google Play Games บน PC จะแมปอินพุตที่ผู้ใช้รีแมปทั้งหมดกับอินพุตเริ่มต้นของเกม วิธีนี้ช่วยให้เกมไม่ต้องรับรู้ถึงการแมปใหม่ของผู้เล่น หากต้องการทราบอินพุตใหม่สำหรับการกระทำในเกม เช่น การแสดง การควบคุมด้วยคีย์บอร์ดในเกม คุณอาจลงทะเบียนการเรียกกลับเพื่อรับ การแจ้งเตือนสำหรับเหตุการณ์การแมปใหม่ได้ (ไม่บังคับ)

Google Play Games บน PC จะจัดเก็บการควบคุมที่แมปใหม่ของผู้ใช้ไว้ในเครื่องเพื่อคงไว้ ในเซสชันการเล่นเกม เนื่องจากระบบจัดเก็บการตั้งค่าเหล่านี้ไว้ในเครื่อง การตั้งค่าจึงไม่ส่งผลต่อประสบการณ์การใช้งานบนอุปกรณ์เคลื่อนที่ และจะถูกลบออกเมื่อถอนการติดตั้ง Google Play Games บน PC การตั้งค่าจะไม่คงอยู่เมื่อใช้ในอุปกรณ์ PC หลายเครื่อง

คุณไม่จำเป็นต้องอัปเกรด Input SDK เพื่อเปิดใช้การกำหนดปุ่มใหม่ในเกม แต่ระบบจะปิดใช้การกำหนดใหม่สำหรับเกมหากตรวจพบการกำหนดค่าที่ไม่รองรับ

หากต้องการควบคุมประสบการณ์การตั้งค่าปุ่มใหม่หรือหากเกมปิดใช้ฟีเจอร์การตั้งค่าปุ่มใหม่ ให้ทำตามขั้นตอนต่อไปนี้

หากต้องการเลือกไม่ใช้ฟีเจอร์การแมปใหม่สำหรับเกมของคุณในขณะที่ยัง แสดงเวอร์ชันแบบอ่านอย่างเดียวของการเชื่อมโยงคีย์ ให้ทำตามขั้นตอนต่อไปนี้

  • อัปเกรดเป็น Input SDK 1.1.1-beta
  • อัปเดต InputMap เพื่อปิดใช้ฟีเจอร์การแมปใหม่

คุณสามารถอัปเกรด Input SDK เป็นเวอร์ชัน 1.1.1-beta เพื่อใช้ประโยชน์จากฟีเจอร์การแมปใหม่ขั้นสูง ใน Google Play Games บน PC โดยใช้ InputContexts เพื่อกำหนดการควบคุมสำหรับ ฉากต่างๆ ของเกม เพิ่มการเรียกกลับเพื่อฟังเหตุการณ์การแมปใหม่ กำหนดชุดคีย์ที่สงวนไว้ซึ่งผู้ใช้ไม่สามารถแมปใหม่ได้ และปิดใช้ ฟีเจอร์การแมปใหม่ต่อ InputAction, InputGroup หรือ InputMap

เมื่ออัปเกรด โปรดพิจารณาข้อยกเว้นต่อไปนี้

การกำหนดค่าที่ไม่รองรับ

ระบบจะปิดใช้การแมปอินพุตใหม่หากไม่เป็นไปตามเงื่อนไขต่อไปนี้

  • InputAction ที่ใช้หลายแป้นต้องประกอบด้วยแป้นกดร่วม และแป้นที่ไม่ใช่แป้นกดร่วม เช่น Shift + A ใช้ได้ แต่ A + B, Ctrl + Alt และ Shift + A + Tab ใช้ไม่ได้

  • ออบเจ็กต์ InputAction หรือ InputGroup อย่างน้อย 2 รายการจะใช้ รหัสที่ไม่ซ้ำกันเดียวกันไม่ได้

ขอแนะนำ InputContext

InputContext ช่วยให้เกมใช้แป้นเดียวกันสำหรับการดำเนินการต่างๆ ในเกมได้โดยไม่เกิดข้อขัดแย้ง ด้วยวิธีนี้ หากเกมใช้ Space สำหรับการกระโดด ระหว่างการเล่นเกมและสำหรับการยืนยันการเลือกเมนู ผู้เล่นจะสามารถ แมป Space ใหม่เป็น Enter ในเมนูและ Space เป็นลูกศรขึ้นระหว่างการเล่นเกมได้

แผนภาพลำดับต่อไปนี้แสดงวิธีการทำงานของ setInputContext() API ในเวลา รันไทม์

แผนภาพแสดงโฟลว์ของ Input SDK เมื่อทำการแมปแป้นใหม่

อัปเกรด

เกมที่ใช้การติดตั้งใช้งาน Input SDK ก่อนหน้าจะยังคงรองรับ การแมปใหม่ขั้นพื้นฐาน เว้นแต่จะใช้การกำหนดค่าที่ไม่รองรับ หากเกมของคุณใช้ Input SDK เวอร์ชันเก่า โปรดอ่านคู่มือการอัปเกรดจาก 0.0.4 เป็น 1.0.0-beta

การอัปเกรดเป็น 1.1.1-beta จะเปิดใช้ฟีเจอร์ใหม่ๆ ซึ่งรวมถึง

  • การทริกเกอร์การเปลี่ยนแปลงบริบท
  • รับการแจ้งเตือนเหตุการณ์การแมปคีย์
  • การปิดใช้การแมปใหม่ต่อการดำเนินการ กลุ่ม บริบท หรือแผนที่

การติดตั้ง

ปลั๊กอิน Unity v1.1.1-beta พร้อมให้คุณใช้งานแล้ว คุณต้องลบ Input SDK เวอร์ชันก่อนหน้าทั้งหมดที่ติดตั้งในเกมและ อัปเกรดเป็นเวอร์ชันปัจจุบัน

หากต้องการเพิ่ม Input SDK v1.1.1-beta ลงในเกม โปรดดู การเพิ่ม SDK

กำหนดฟิลด์แบบคงที่

สำหรับเวอร์ชัน 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() ของ Input SDK 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-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
);

ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดเวอร์ชันการเชื่อมโยงคีย์ได้ที่ การติดตามรหัสคีย์

อัปเดต InputGroups

ใน Input SDK 1.1.1-beta คุณต้องระบุ InputGroup แต่ละรายการโดยไม่ซ้ำกัน InputActionแต่ละรายการเป็นของ InputGroup ซึ่งเป็นชุดของการดำเนินการที่เกี่ยวข้อง ซึ่งจะช่วยปรับปรุงการนำทางและการค้นพบ การควบคุมระหว่างการเล่นเกม เช่นเดียวกับที่ InputAction ต้องมีตัวระบุที่ไม่ซ้ำกัน ในบรรดาการดำเนินการทั้งหมดใน InputContext เดียว InputGroup ต้องมีรหัสที่ไม่ซ้ำกันในกลุ่มที่มีอยู่

สำหรับตัวอย่างในส่วนนี้ เกมมีInputContextออบเจ็กต์ 2 รายการที่แสดงถึงเมนูหลักและการเล่นเกม ระบบจะติดตามรหัสที่เหมาะสมสำหรับแต่ละ 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
}

เราเลิกใช้งานเมธอด InputGroup.create() ของ Input SDK 1.0.0-beta แล้วเช่นเดียวกับ InputAction คุณต้องอัปเดต 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

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

ขั้นตอนถัดไป

อัปเกรดเป็น 1.1.1-beta ต่อไปโดย กำหนดการควบคุมที่แตกต่างกันสำหรับฉากต่างๆ โดยใช้ InputContexts หรืออัปเดต UI ของเกมโดย รับการแจ้งเตือนเกี่ยวกับเหตุการณ์การแมปใหม่โดยใช้ InputRemappingListeners

เมื่ออัปเดตการผูกคีย์ โปรดดูแนวทางปฏิบัติแนะนำในการออกแบบการผูกคีย์ และพิจารณาข้อจำกัดและ ข้อจำกัดของฟีเจอร์การแมปใหม่