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

คู่มือนี้อธิบายวิธีอัปเกรดเกมจาก Input SDK เวอร์ชัน 1.0 เป็น 1.1 สำหรับ Unity คลิกที่นี่เพื่อดูวิธีการสำหรับ 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 ช่วยให้เกมใช้แป้นเดียวกันสำหรับการดำเนินการที่แตกต่างกันในเกมได้โดยไม่เกิดข้อขัดแย้ง วิธีนี้จะทำให้หากเกมใช้พื้นที่สำหรับการข้ามระหว่างการเล่นเกมและเพื่อยืนยันการเลือกเมนู ผู้เล่นแต่ละคนจะรีแมปพื้นที่แต่ละรายการเพื่อเข้ามาในเมนูและเว้นวรรคเป็นลูกศรขึ้นระหว่างเกมเพลย์ได้

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

แผนภาพแสดงขั้นตอนของ Input SDK เมื่อแมปแป้นใหม่

อัปเกรด

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

การอัปเกรดเป็น 1.1.1-เบต้าจะเปิดใช้ฟีเจอร์ใหม่ๆ ต่อไปนี้

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

การติดตั้ง

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

หากต้องการเพิ่ม Input SDK v1.1.1-เบต้าลงในเกม โปรดดูหัวข้อการเพิ่ม 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-เบต้า

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-เบต้า (มีสตริงเวอร์ชัน)

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
}

เช่นเดียวกับ 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-เบต้า

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

InputGroup ใน Input SDK 1.1.1-เบต้า

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-เบต้า (มีสตริงเวอร์ชัน)

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 ที่กําหนดโดยใช้เมธอด 1.0.0-beta create() ของ Input SDK ทั้งหมดจะกำหนดใหม่ได้ โดยค่าเริ่มต้นจะระบุด้วยรหัส 0 และไม่มีคีย์ที่สงวนไว้

InputMap ใน Input SDK 1.0.0-เบต้า

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

ขั้นต่อไปคืออะไร

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

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