การทํางานด้วยจอยสติ๊ก (Input System packaged version)

ปรับปรุงหน้า :
วันที่สร้างเพจ :

สภาพแวดล้อมการตรวจสอบ

หน้าต่าง
  • หน้าต่าง 11
บรรณาธิการ Unity
  • ปี 2020.3.25f1
แพ็คเกจระบบอินพุต
  • 1.2.0

ข้อกําหนดเบื้องต้นสําหรับเคล็ดลับนี้

การตั้งค่าต่อไปนี้ถูกกําหนดค่าไว้ล่วงหน้าเป็นข้อกําหนดเบื้องต้นสําหรับคําอธิบายของเคล็ดลับเหล่านี้

เกี่ยวกับ XInput และ DirectInput

แม้ว่าจะ จํากัด เฉพาะ Windows แต่ก็มีรูปแบบการเชื่อมต่อสองรูปแบบสําหรับตัวควบคุมเกม: "DirectInput" และ "XInput" "จอยสติ๊ก" ที่นี่สอดคล้องกับ "DirectInput"

ในJoystickโปรแกรมนี้เรากําลังจัดการกับคลาส แต่สามารถจัดการคอนโทรลเลอร์ที่รองรับ "DirectInput" เท่านั้น ในการใช้คอนโทรลเลอร์ที่รองรับ "XInput" คุณต้องใช้คลาสอื่นGamepad

"DirectInput" เป็นรูปแบบการเชื่อมต่อแบบเก่าและคําจํากัดความของปุ่มค่อนข้างคลุมเครือและสามารถจัดการคอนโทรลเลอร์ที่มีรูปร่างพิเศษได้ อย่างไรก็ตามเมื่อเร็ว ๆ นี้ "XInput" ได้กลายเป็นกระแสหลักและจํานวนคอนโทรลเลอร์ที่ไม่รองรับ "DirectInput" กําลังเพิ่มขึ้น เนื่องจาก "DirectInput" กําหนดปุ่มเป็น "1", "2" และ "3" ผู้สร้างเกมจึงต้องสร้างระบบที่อนุญาตให้ตั้งค่าการโต้ตอบของปุ่มเกมและคอนโทรลเลอร์ได้อย่างเหมาะสม

"XInput" ถูกกําหนดให้เป็น "DirectInput" รุ่นต่อไปและมีการกําหนดปุ่ม A และ B ทริกเกอร์แท่ง ฯลฯ ไว้ล่วงหน้า ดังนั้นรูปร่างของคอนโทรลเลอร์จึงสามารถใช้งานได้เท่านั้นซึ่งเกือบจะได้รับการแก้ไขแล้ว เนื่องจากคําจํากัดความของปุ่มได้รับการกําหนดไว้อย่างดีผู้สร้างเกมจึงสามารถสร้างเกมที่ตรงกับคอนโทรลเลอร์ได้โดยไม่ต้องกังวลกับตําแหน่งของปุ่ม จํานวนตัวควบคุมเกมล่าสุดที่เพิ่มขึ้นเข้ากันได้กับ "XInput" เท่านั้น

เกี่ยวกับจอยสติ๊ก

ดังที่ได้กล่าวไว้ข้างต้นไม่มีคําจํากัดความของปุ่มดังนั้นเพื่อใช้งานจริงจําเป็นต้องเพิ่มกระบวนการที่ยุ่งยากเช่นการกําหนดการทํางานของเกมในขณะที่ตรวจสอบข้อมูลของแต่ละปุ่ม ฉันไม่คิดว่าคุณต้องใช้ DirectInput ในเกมใหม่เพราะมันเก่า แต่โปรดจําไว้ว่าหากคุณต้องการสนับสนุนจริงๆโปรแกรมของคุณอาจซับซ้อน

ตัวอย่างนี้โดยทั่วไป จํากัด เฉพาะการรับข้อมูลบนปุ่มที่ระบุไว้ name ในความเป็นจริงคุณต้องตรวจสอบและกําหนดการดําเนินการ

การได้มาซึ่งข้อมูลจอยสติ๊ก

วางวัตถุข้อความเพื่อแสดงข้อมูลเกี่ยวกับแต่ละปุ่มบนจอยสติ๊ก

สร้างสคริปต์ ชื่อเป็นโดยพลการ แต่ในกรณีนี้ JoystickInfo คือ .

สคริปต์มีลักษณะดังนี้: ข้อมูลที่ได้รับจะแตกต่างกันไปขึ้นอยู่กับประเภทของคอนโทรลเลอร์ มันยากมากที่จะตั้งโปรแกรมสําหรับคอนโทรลเลอร์แต่ละตัวดังนั้นฉันจึงแจกแจงปุ่มทั้งหมดและรับประเภทปุ่มและกดข้อมูล

using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.UI;

public class JoystickInfo : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  StringBuilder Builder = new StringBuilder();

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    if (TextObject == null)
    {
      Debug.Log($"{nameof(TextObject)} が null です。");
      return;
    }

    // 1つ目のジョイスティックの情報を取得
    var joystick = Joystick.current;
    if (joystick == null)
    {
      Debug.Log("ジョイスティックがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ジョイスティックの情報取得
    Builder.AppendLine($"deviceId:{joystick.deviceId}");
    Builder.AppendLine($"name:{joystick.name}");
    Builder.AppendLine($"displayName:{joystick.displayName}");

    // ジョイスティックにはボタンの大部分が定義されていないので
    // 基本的には allControls で列挙して入力の種類と値を確認していく
    foreach (var key in joystick.allControls)
    {
      if (key is StickControl stick)
      {
        if (stick.up.isPressed) Builder.AppendLine($"{key.name} Up");
        if (stick.down.isPressed) Builder.AppendLine($"{key.name} Down");
        if (stick.left.isPressed) Builder.AppendLine($"{key.name} Left");
        if (stick.right.isPressed) Builder.AppendLine($"{key.name} Right");

        var value = stick.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
      }
      else if (key is Vector2Control vec2)
      {
        var value = vec2.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
        if (vec2.x.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.x.ReadValue()}");
        }
        if (vec2.y.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.y.ReadValue()}");
        }
      }
      else if (key is ButtonControl button)
      {
        if (button.isPressed) Builder.AppendLine($"{key.name} isPress");
        var value = button.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else if (key is AxisControl axis)
      {
        if (axis.IsPressed()) Builder.AppendLine($"{key.name} isPress");

        var value = axis.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else
      {
        Builder.AppendLine($"Type={key.GetType()}");
      }
    }

    // 押しているボタン一覧をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

คุณสามารถรับข้อมูลเกี่ยวกับ Joystick.current จอยสติ๊กที่เชื่อมต่อได้ใน . Joystick หลังจากนั้นเราจะได้รับข้อมูลแต่ละอย่างจากชั้นเรียน

Joystick ดังที่คุณเห็นจากชั้นเรียน stick trigger มีคําจํากัดความเช่นและ แต่ไม่มีคําจํากัดความเช่นปุ่ม A หรือปุ่มเริ่ม ดังนั้นคุณควรใช้คุณสมบัติเพื่อระบุปุ่มแท่งallControls ทั้งหมดและค้นหาประเภทปุ่มและกดข้อมูล

เมื่อบันทึกสคริปต์แล้ว ให้ EventSystem แนบสคริปต์และตั้งค่าวัตถุข้อความสําหรับแสดงข้อมูล

ลองรันเกมด้วยคอนโทรลเลอร์ที่รองรับ DirectInput ข้อมูลแต่ละชิ้นสามารถเรียกดูได้

ขึ้นอยู่กับคอนโทรลเลอร์คุณอาจไม่ได้รับค่าตามที่ตั้งใจไว้เมื่อคุณกดแท่งปุ่มลูกศร ฯลฯ เนื่องจากปุ่มไม่ได้กําหนดไว้ด้วยวิธีนี้จึงเป็นเรื่องยากที่จะได้รับข้อมูลการกดที่ถูกต้องสําหรับแต่ละปุ่ม นอกจากนี้คุณจะเห็นว่ามันค่อนข้างยากที่จะรองรับจอยสติ๊กอย่างเต็มที่เช่นการจัดเรียงปุ่มแตกต่างกันไปขึ้นอยู่กับคอนโทรลเลอร์

หากเกมรองรับจอยสติ๊กจะเป็นที่พึงปรารถนาที่จะมีหน้าจอการตั้งค่าเช่นการกําหนดค่าคีย์เพื่อให้ผู้ใช้แต่ละคนสามารถปรับแต่งรูปแบบปุ่มของคอนโทรลเลอร์ที่มีได้

วิธีรับข้อมูลสําหรับจอยสติ๊กหลายตัว

ข้อมูลเกี่ยวกับ Joystick.all จอยสติ๊กที่เชื่อมต่อทั้งหมดสามารถรับได้ใน . ReadOnlyArray สามารถ foreach แจกแจงและอื่น ๆ

เนื่องจากแต่ละค่าเป็น Joystick คลาสคุณจึงสามารถรับข้อมูลจอยสติ๊กได้เช่นเดียวกับในโปรแกรมก่อนหน้า