Điều khiển bằng Gamepad (Phiên bản gói hệ thống đầu vào)

Trang Cập Nhật :
Ngày tạo trang :

Môi trường xác minh

Windows
  • cửa sổ 11
Biên tập viên Unity
  • 2020.3.25f1
Gói hệ thống đầu vào
  • 1.2.0

Điều kiện tiên quyết cho mẹo này

Các cài đặt sau đây đã được thực hiện trước làm tiền đề cho mô tả về mẹo này.

Giới thiệu về XInput và DirectInput

Mặc dù nó bị giới hạn ở Windows, nhưng có hai định dạng kết nối cho bộ điều khiển trò chơi: DirectInput và XInput. Ở đây, "Gamepad" tương ứng với "XInput".

Chương trình này xử lý các lớp, nhưng điều này Gamepad chỉ có thể xử lý các bộ điều khiển hỗ trợ "XInput". Để sử dụng bộ điều khiển hỗ trợ DirectInput, bạn cần sử dụng một lớp khác Joystick .

"DirectInput" là một định dạng kết nối cũ và định nghĩa của nút tương đối mơ hồ và nó có thể xử lý các bộ điều khiển có hình dạng đặc biệt. Tuy nhiên, gần đây, "XInput" đã trở thành xu hướng chủ đạo và số lượng bộ điều khiển không hỗ trợ "DirectInput" ngày càng tăng. "DirectInput" có các định nghĩa nút như "1", "2" và "3", vì vậy người tạo trò chơi phải tạo nút tương ứng giữa trò chơi và bộ điều khiển để chúng có thể được đặt phù hợp.

XInput được định nghĩa là thế hệ tiếp theo của DirectInput và bao gồm các nút A và B được xác định trước, trình kích hoạt, gậy, v.v. Do đó, chỉ có thể sử dụng một hình dạng cố định của bộ điều khiển, Vì định nghĩa của các nút được xác định rõ, người tạo trò chơi có thể tạo ra các trò chơi phù hợp với bộ điều khiển mà không phải lo lắng về vị trí của các nút. Bộ điều khiển trò chơi gần đây chỉ hỗ trợ "XInput" đang gia tăng.

Xác định xem nút có đang được nhấn không

Bạn có thể xác định xem một nút có được nhấn hay không bởi các thuộc tính cũng như xxxxxxxx.isPressed bàn phím và chuột. Ở đây, tôi muốn hiển thị loại nút tôi đang nhấn trong văn bản.

Đầu tiên, đặt một đối tượng văn bản hiển thị.

Tạo một kịch bản cho bản án. Tên tệp là tùy ý, nhưng đây GamepadButtons là .

Kịch bản trông như thế này:

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

public class GamepadButtons : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ボタンを押している間は xxxxxxxx.isPressed が true を返します

    // B ボタンや East ボタン、○ボタンは読み方が違うだけで同じボタンです
    // これは PlayStation や Xbox, Switch などでボタンの読み方が違うためです
    if (gamepad.aButton.isPressed) Builder.AppendLine($"A");
    if (gamepad.bButton.isPressed) Builder.AppendLine($"B");
    if (gamepad.xButton.isPressed) Builder.AppendLine($"X");
    if (gamepad.yButton.isPressed) Builder.AppendLine($"Y");

    if (gamepad.buttonEast.isPressed) Builder.AppendLine($"East");
    if (gamepad.buttonWest.isPressed) Builder.AppendLine($"West");
    if (gamepad.buttonNorth.isPressed) Builder.AppendLine($"North");
    if (gamepad.buttonSouth.isPressed) Builder.AppendLine($"South");

    if (gamepad.circleButton.isPressed) Builder.AppendLine($"Circle");
    if (gamepad.crossButton.isPressed) Builder.AppendLine($"Cross");
    if (gamepad.triangleButton.isPressed) Builder.AppendLine($"Triangle");
    if (gamepad.squareButton.isPressed) Builder.AppendLine($"Square");

    // コントローラーの中央にあるスタートボタン、セレクトボタン、メニューボタン、ビューボタンなどに該当します。
    if (gamepad.startButton.isPressed) Builder.AppendLine($"Start");
    if (gamepad.selectButton.isPressed) Builder.AppendLine($"Select");

    // 左と右のスティックをまっすぐ押し込んだかどうかを判定します
    if (gamepad.leftStickButton.isPressed) Builder.AppendLine($"LeftStickButton");
    if (gamepad.rightStickButton.isPressed) Builder.AppendLine($"RightStickButton");

    // 左上と右上にあるボタン。PlayStation だと L1 や R1 に該当します
    if (gamepad.leftShoulder.isPressed) Builder.AppendLine($"LeftShoulder");
    if (gamepad.rightShoulder.isPressed) Builder.AppendLine($"RightShoulder");

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

Sau khi EventSystem bạn lưu tập lệnh, đính kèm nó vào và cấu hình đối tượng văn bản hiển thị.

Hãy thử chạy trò chơi và xem mỗi nút có phản hồi không.

Nhân tiện, các nút sau được định nghĩa là cùng một nút, mặc dù nhiều nút được chuẩn bị vì chúng được đọc khác nhau tùy thuộc vào bảng điều khiển trò chơi. Trong mỗi chương trình trên, một quy trình phán xét được bao gồm, vì vậy khi bạn nhấn nút, ba nút sẽ được hiển thị.

XboxPlayStation và hơn thế nữa
bNút vòng trònNút nútĐông
aNút nút chéo nútNam.
xNút nút vuông Cái nútTâyTây
yNút tam giácNút nútBắc

Những gì có thể được đánh giá là một nút như sau.

  • Nút, nút ×, nút xuống
  • Nút B, ○ nút, nút bên phải
  • Nút X, nút □, nút trái
  • Nút Y, nút Mũi tên Xuống, nút Lên
  • Nút Bắt đầu, nút Menu
  • Chọn nút, nút xem
  • Nút vai trái, nút L1
  • Nút vai phải, nút R1
  • Nút thanh bên trái
  • Nút thanh bên phải

Xác định xem nút có được nhấn không

Phán quyết tại thời điểm nhấn có thể được xác định bởi các thuộc tính như với xxxxxxxx.wasPressedThisFrame bàn phím và chuột. Trả về giá trị của thời điểm true nó được nhấn và trả về ngay cả khi false nó được nhấn và giữ sau đó.

Hãy hiển thị nút được nhấn dưới dạng văn bản như một kiểm tra hoạt động. Đặt một đối tượng văn bản để hiển thị.

Tên tệp của tập lệnh có thể là bất cứ thứ gì, nhưng đây GamepadButtonsOneFrame là .

Kịch bản trông như thế này: Để đơn giản, chỉ có 4 nút được đánh giá.

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

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

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

    // 1つ目のゲームパッドの情報を取得
    var gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    // ボタンが押された瞬間かどうかを判定
    if (gamepad.aButton.wasPressedThisFrame) TextObject.text += "A";
    if (gamepad.bButton.wasPressedThisFrame) TextObject.text += "B";
    if (gamepad.xButton.wasPressedThisFrame) TextObject.text += "X";
    if (gamepad.yButton.wasPressedThisFrame) TextObject.text += "Y";
  }
}

Sau khi EventSystem lưu tập lệnh, hãy đính kèm nó và đặt một đối tượng văn bản để hiển thị.

Hãy thử chạy trò chơi và nhấn nút. Tôi nghĩ rằng nút bạn nhấn sẽ được thêm vào. Bạn cũng có thể thấy rằng việc giữ nút không thêm bất kỳ văn bản nào.

Xác định xem thời điểm nút được nhả ra không

Không có mẫu, nhưng bạn có thể xác định xem đó có phải là wasPressedThisFrame thời điểm bạn phát hành mẫu hay không bằng cách sử dụng thuộc tính thay vì wasReleasedThisFrame thuộc tính.

Xác định thời điểm bạn nhấn các phím mũi tên

Xác định báo chí của DPAD. Tùy thuộc vào bảng điều khiển trò chơi, nó sẽ bay với các phím mũi tên và D-pad, nhưng cả hai đều được coi là như nhau. DPAD về cơ bản chỉ xác định xem bạn có đang đẩy theo hướng đó hay không. Không có sự phán xét nào giống như "đẩy một chút" như một cây gậy.

Đặt một đối tượng văn bản để hiển thị quyết định cho dù nó có được nhấn hay không dưới dạng kiểm tra thao tác.

Tạo tập lệnh. Tên tệp là tùy ý, nhưng đây GamepadDpad là .

Kịch bản trông như thế này:

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

public class GamepadDpad : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // Dpad の押下情報を Vector2 として取得するパターン
    var value = gamepad.dpad.ReadValue();
    Builder.Append($"(x:{value.x}, y:{value.y})");

    // Dpad の各方向のボタンを押しているかどうかの判定
    if (gamepad.dpad.left.isPressed) Builder.Append(" left");
    if (gamepad.dpad.right.isPressed) Builder.Append(" right");
    if (gamepad.dpad.up.isPressed) Builder.Append(" up");
    if (gamepad.dpad.down.isPressed) Builder.Append(" down");

    // Dpad の情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Bạn có thể lấy thông tin Gamepad.dpad DPAD tại .

DPAD có các thuộc tính cho từng hướng và bạn có thể xác định xem nó có leftupdown rightđược nhấn hay không bởi thuộc tính, v.v. isPressed

DpadControl.ReadValue Bạn cũng có thể sử dụng phương pháp để có được trạng thái Vector2 của báo chí trong . Nếu không có gì được nhấn (0, 0), nếu bên trái được nhấn (-1, 0), v.v.

Sau khi EventSystem lưu tập lệnh, hãy đính kèm nó và đặt một đối tượng văn bản để hiển thị.

Hãy thử chạy trò chơi và tương tác với DPAD.

Vector2 Nhân tiện, ở trạng thái chuẩn hóa, vì vậy khi bạn nhấn theo đường chéo, nó thu được dưới dạng một số như (0, 7071, 0, 7071) thay vì (1, 1).

Xác định máy ép kích hoạt

Bộ điều khiển Xbox có các nút được gọi là trình kích hoạt ở bên trái và bên phải. Trên PlayStation, nó tương ứng với L2R2. Nút này khác với nút bình thường và bạn có thể nhận được số tiền bạn đang nhấn trong 0,0 ~ 1,0. Một số bộ điều khiển khác được trang bị tên khác ngoài trình kích hoạt, nhưng trong các bộ điều khiển cũ hơn, v.v., chúng có thể được đặt đơn giản dưới dạng các nút, trong trường hợp đó, phán đoán nhấn chỉ được xử lý là 0, 1.

Ở đây, tôi muốn kiểm tra lượng máy ép cò súng. Đặt một đối tượng văn bản để hiển thị trên Canvas.

Tạo tập lệnh. Vì nó sẽ được sử dụng ở nơi khác, chúng tôi sẽ đặt tên nó ở đây GamepadReadValue .

Kịch bản trông như thế này:

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

public class GamepadReadValue : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // トリガーの押下量を取得
    Builder.AppendLine($"LeftTrigger:{gamepad.leftTrigger.ReadValue()}");
    Builder.AppendLine($"RightTrigger:{gamepad.rightTrigger.ReadValue()}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Gamepad Mỗi leftTriggerlớp có một thuộc tính và rightTrigger ReadValue bạn có thể nhận được số lần nhấn trong phạm vi 0,0 ~ 1,0 bằng cách gọi phương thức. Trình kích hoạt cũng có thể được coi là các nút, vì vậy isPressed bạn cũng có thể đánh giá như. isPressed true Nhân tiện, số lượng trở thành ReadValue dựa trên 0, 5.

Sau khi lưu tập lệnh, EventSystem hãy đính kèm nó và đặt một đối tượng văn bản để hiển thị.

Hãy thử chạy trò chơi và di chuyển cò súng.

Xác định thông tin cây gậy

Cây gậy có thể lấy thông tin của thanh bên trái và thanh bên phải tương ứng, và bạn có thể nhận được số lượng bao nhiêu cây gậy được đẩy xuống theo hướng nào. Tất nhiên, nếu bạn không có một thanh trên bộ điều khiển của bạn, bạn sẽ không thể có được thông tin này.

Thông tin thanh có thể được truy xuất với , Gamepad.rightStick tương ứngGamepad.leftStick.

Đối với tập lệnh xác nhận hoạt động, chúng tôi sẽ chuyển hướng tập lệnh được sử dụng trước đó để lấy trình kích hoạt.

// 省略

public class GamepadReadValue : MonoBehaviour
{
  // 省略

  // 更新はフレームごとに1回呼び出されます
  void Update()
  {
    // 省略

    // トリガーの押下量を取得
    Builder.AppendLine($"LeftTrigger:{gamepad.leftTrigger.ReadValue()}");
    Builder.AppendLine($"RightTrigger:{gamepad.rightTrigger.ReadValue()}");

    // スティックの入力を取得
    var leftStickValue = gamepad.leftStick.ReadValue();
    Builder.AppendLine($"LeftStick:{leftStickValue.normalized * leftStickValue.magnitude}");
    var rightStickValue = gamepad.rightStick.ReadValue();
    Builder.AppendLine($"RightStick:{rightStickValue.normalized * rightStickValue.magnitude}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

leftStickrightStick Bạn có thể lấy thông tin báo chí bằng cách gọi phương Vector2 thức từ ReadValue hoặc . Vector2 Vì vậy, bạn có thể nhận được bao nhiêu x y bạn đang nhấn vào trục X và trục Y bằng và thuộc tính, Nếu bạn muốn có được hướng bạn đang nhấn, bạn có thể lấy nó trong tài sản, và nếu bạn muốn có được số tiền bạn đang nhấn, bạn magnitude normalized có thể lấy nó trong tài sản.

Cố gắng thực sự di chuyển trò chơi và vận hành cây gậy.

Nhận thông tin gamepad

Bạn có thể lấy ID, tên, v.v. từ gamepad được kết nối. Ví dụ: tham khảo để xác định name loại bộ điều khiển được kết nối hoặc Bạn có thể tham khảo gamepad nào deviceId để liên kết khi nhiều gamepad được kết nối.

Ở đây, chúng tôi sẽ hiển thị thông tin trong văn bản để kiểm tra thao tác.

Tên kịch bản là tùy ý, nhưng đây GamepadInfo là .

Kịch bản trông như thế này:

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

public class GamepadInfo : 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 gamepad = Gamepad.current;
    if (gamepad == null)
    {
      Debug.Log("ゲームパッドがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ゲームパッドの各情報を取得
    Builder.AppendLine($"deviceId:{gamepad.deviceId}");
    Builder.AppendLine($"name:{gamepad.name}");
    Builder.AppendLine($"displayName:{gamepad.displayName}");
    Builder.AppendLine($"shortDisplayName:{gamepad.shortDisplayName}");
    Builder.AppendLine($"path:{gamepad.path}");
    Builder.AppendLine($"layout:{gamepad.layout}");

    // 情報をテキストで表示
    TextObject.text = Builder.ToString();
  }
}

Gamepad Bạn có thể nhận được nhiều thông tin khác nhau từ tệp . Dưới đây là một số trích đoạn.

Sau khi lưu tập lệnh, EventSystem hãy đính kèm nó và đặt một đối tượng văn bản để hiển thị.

Hãy thử chạy trò chơi để xem thông tin có xuất hiện không.