Điều khiển bằng Gamepad (Phiên bản gói hệ thống đầu vào)
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ị.
Xbox | PlayStation | 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ó left
up
down
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 leftTrigger
lớ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();
}
}
leftStick
rightStick
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.