שליטה באמצעות Gamepad (גרסת חבילת מערכת קלט)
סביבת אימות
- חלונות
-
- חלונות 11
- עורך Unity
-
- 2020.3.25F1
- חבילת מערכת קלט
-
- 1.2.0
תנאים מוקדמים לטיפ זה
ההגדרות הבאות נקבעו מראש כהנחת יסוד לתיאור עצה זו.
אודות XInput ו- DirectInput
למרות שהוא מוגבל ל- Windows, קיימות שתי תבניות חיבור עבור בקרי משחק: DirectInput ו- XInput. הנה, "Gamepad" מתאים "XInput".
תוכנית זו Gamepad
עוסקת שיעורים, אבל זה יכול רק להתמודד עם בקרים התומכים "XInput".
כדי להשתמש בבקר התומך ב- DirectInput, עליך להשתמש במחלקה אחרת Joystick
.
"DirectInput" הוא פורמט חיבור ישן והגדרת הכפתור מעורפלת יחסית, והוא יכול להתמודד עם בקרים עם צורות מיוחדות. עם זאת, לאחרונה, "XInput" הפך המיינסטרים, ואת מספר הבקרים שאינם תומכים "DirectInput" גדל. "DirectInput" כולל הגדרות לחצנים כגון "1", "2" ו- "3", כך שיוצרי משחקים חייבים ליצור התאמת לחצנים בין המשחק לבקר כדי שניתן יהיה להגדיר אותם בהתאם.
XInput מוגדר כדור הבא של DirectInput וכולל כפתורי A ו-B מוגדרים מראש, טריגרים, מקלות וכו'. לכן, רק צורה קבועה של הבקר ניתן להשתמש, מכיוון שהגדרת הכפתורים מוגדרת היטב, יוצרי משחקים יכולים ליצור משחקים המתאימים לבקר מבלי לדאוג למיקום הכפתורים. בקרי משחק אחרונים התומכים רק ב- "XInput" הולכים וגדלים.
קביעה אם לוחצים על לחצן
באפשרותך לקבוע אם לחצן נלחץ או לא על-ידי מאפיינים וכן xxxxxxxx.isPressed
על-ידי מקלדת ועכבר.
כאן, ברצוני להציג את סוג הלחצן שאני לוחץ עליו בטקסט.
תחילה, מקם אובייקט טקסט תצוגה.
צור קובץ Script עבור פסק הדין. שם הקובץ שרירותי, אבל הנה GamepadButtons
הוא .
הסקריפט נראה כך:
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();
}
}
לאחר EventSystem
שמירת קובץ ה- Script, צרף אותו לאובייקט טקסט התצוגה וקבע את תצורתו.
נסה להפעיל את המשחק ובדוק אם כל לחצן מגיב.
אגב, הלחצנים הבאים מוגדרים כאותו כפתור, אם כי לחצנים מרובים מוכנים מכיוון שהם נקראים באופן שונה בהתאם לקונסולת המשחקים. בכל אחת מהתוכניות הנ"ל נכלל תהליך שיפוט, כך שכאשר אתה לוחץ על הכפתור, מוצגים שלושה כפתורים.
Xbox | PlayStation | ועוד |
---|---|---|
bButton | לחצן circleButton | כפתורמזרח |
aButton | לחצן מוצלב | כפתורדרום |
xButton | לחצן ריבוע | כפתורמערב |
yButton | משולשכפתור | כפתורצפון |
מה שניתן לשפוט ככפתור הוא כדלקמן.
- לחצן, לחצן ×, לחצן למטה
- כפתור B, ○ כפתור, כפתור ימני
- לחצן X, לחצן □, לחצן שמאלי
- לחצן Y, לחצן חץ למטה, לחצן למעלה
- לחצן 'התחל', לחצן 'תפריט'
- בחר לחצן, לחצן תצוגה
- לחצן כתף שמאל, לחצן L1
- לחצן כתף ימין, לחצן R1
- לחצן מוט שמאלי
- לחצן מוט ימני
קביעה אם לוחצים על הלחצן
השיפוט ברגע הלחיצה יכול להיקבע על ידי המאפיינים כמו עם xxxxxxxx.wasPressedThisFrame
המקלדת והעכבר.
פונקציה זו מחזירה את הערך של רגע true
ההקשה והמחזירה גם אם false
לוחצים עליה ומוחזקים לאחר מכן.
בוא נציג את הלחצן שנלחץ כטקסט כבדיקת פעולה. מקם אובייקט טקסט לתצוגה.
שם הקובץ של הסקריפט יכול להיות כל דבר, אבל הנה GamepadButtonsOneFrame
זה .
הסקריפט נראה כך: לשם הפשטות, רק 4 כפתורים נשפטים.
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";
}
}
לאחר EventSystem
שמירת הסקריפט, צרף אותו לאובייקט טקסט והגדר אותו לתצוגה.
נסה להפעיל את המשחק וללחוץ על הכפתור. אני חושב שהכפתור שלחצת עליו יתווסף. באפשרותך גם לראות שהחזקת הלחצן לחוץ אינה מוסיפה טקסט.
קבע אם ברגע שחרור הלחצן
אין מדגם, אך באפשרותך לקבוע אם זה wasPressedThisFrame
הרגע שבו אתה משחרר אותו באמצעות מאפיין במקום wasReleasedThisFrame
מאפיין.
קביעה מתי תקיש על מקשי החצים
קובע את מכונת ההקשה של ה- DPAD. בהתאם לקונסולת המשחקים, הוא יטוס עם מקשי החצים ואת D-pad, אבל שניהם מטופלים כמו אותו דבר. ה- DPAD בעצם קובע רק אם אתה דוחף בכיוון זה או לא. אין שיפוט כמו "לדחוף קצת" כמו מקל.
ממקם אובייקט טקסט כדי להציג החלטה אם הוא נלחץ או לא כבדיקת פעולה.
צור קובץ Script. שם הקובץ שרירותי, אבל הנה GamepadDpad
הוא .
הסקריפט נראה כך:
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();
}
}
ניתן לקבל מידע Gamepad.dpad
על DPAD בכתובת .
ל- DPAD יש left
up
down
right
מאפיינים לכל כיוון, ואתה יכול לקבוע אם הוא נלחץ או לא על ידי הנכס וכו '. isPressed
DpadControl.ReadValue
אתה יכול גם להשתמש בשיטה כדי לקבל את מצב Vector2
העיתונות ב- . אם לא לוחצים על שום דבר (0, 0), אם לחוץ על שמאל (-1, 0) וכן הלאה.
לאחר EventSystem
שמירת הסקריפט, צרף אותו לאובייקט טקסט והגדר אותו לתצוגה.
נסה להפעיל את המשחק ולקיים אינטראקציה עם ה- DPAD.
Vector2
אגב, הוא במצב מנורמל, ולכן כאשר אתה לוחץ באלכסון, הוא מתקבל כמספר כגון (0.7071, 0.7071) במקום (1, 1).
קביעת לחיצות על גורמים מפעילים
לבקרי Xbox יש לחצנים הנקראים גורמים מפעילים משמאל ומימין. בפלייסטיישן, זה מתאים L2R2. כפתור זה שונה מכפתור רגיל, ואתה יכול לקבל את הסכום שאתה לוחץ עליו ב- 0.0~1.0. חלק מהבקרים האחרים מצוידים בשמות שאינם טריגרים, אך בבקרים ישנים יותר וכו ', הם עשויים פשוט להיות ממוקמים ככפתורים, ובמקרה זה שיקול הדעת של לחיצה מטופל רק כמו 0, 1.
כאן, אני רוצה לבדוק את כמות לחיצות ההדק. ממקם אובייקט טקסט לתצוגה על בד הציור.
צור קובץ Script. מכיוון שהוא ישמש במקום אחר, נקרא לו כאן GamepadReadValue
.
הסקריפט נראה כך:
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
לכל leftTrigger
מחלקה יש מאפיין ואתה rightTrigger
ReadValue
יכול לקבל את כמות הלחיצות בטווח של 0.0 ~ 1.0 על ידי קריאה לשיטה.
טריגרים יכולים גם להיות מטופלים כמו כפתורים, אז isPressed
אתה יכול גם לשפוט כגון.
isPressed
true
אגב, כמות הופך מבוסס ReadValue
על 0.5.
לאחר שמירת הסקריפט, EventSystem
צרף אותו לאובייקט טקסט והגדר אותו לתצוגה.
נסה להפעיל את המשחק ולהזיז את ההדק.
קביעת מידע על מקל
המקל יכול לקבל את המידע של המקל השמאלי והמקל הימני בהתאמה, ואתה יכול לקבל את כמות המקל שנדחף למטה לאיזה כיוון. כמובן, אם אין לך מקל על הבקר שלך, לא תוכל לקבל את המידע הזה.
ניתן לאחזר מידע מקל עם , Gamepad.rightStick
בהתאמהGamepad.leftStick
.
עבור סקריפט אישור הפעולה, אנו נסיט את הסקריפט ששימש קודם לכן כדי לקבל את ההדק.
// 省略
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
אתה יכול לקבל את המידע על העיתונות על ידי קורא את Vector2
השיטה מ ReadValue
או .
Vector2
אז אתה יכול לקבל כמה x
y
אתה לוחץ על ציר X וציר Y על ידי ומאפיינים,
אם אתה רוצה לקבל את הכיוון שאתה לוחץ, אתה יכול לקבל את זה בנכס, ואם אתה רוצה לקבל את הסכום שאתה לוחץ, אתה magnitude
normalized
יכול לקבל את זה בנכס.
נסו ממש להזיז את המשחק ולהפעיל את המקל.
קבל מידע gamepad
אתה יכול לקבל את המזהה, שם, וכו 'מן gamepad מחובר.
לדוגמה, עיין במאמר כדי לזהות name
את סוג הבקר המחובר, או
אתה יכול להתייחס עבור איזה deviceId
gamepad לשייך כאשר gamepads מרובים מחוברים.
כאן, נציג את המידע בטקסט כדי לבדוק את הפעולה.
שם התסריט שרירותי, אבל הנה GamepadInfo
הוא .
הסקריפט נראה כך:
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
אתה יכול לקבל מידע שונים מן retrieved . הנה כמה קטעים.
לאחר שמירת הסקריפט, EventSystem
צרף אותו לאובייקט טקסט והגדר אותו לתצוגה.
נסה להפעיל את המשחק כדי לראות אם המידע מופיע.