שליטה באמצעות 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, צרף אותו לאובייקט טקסט התצוגה וקבע את תצורתו.

נסה להפעיל את המשחק ובדוק אם כל לחצן מגיב.

אגב, הלחצנים הבאים מוגדרים כאותו כפתור, אם כי לחצנים מרובים מוכנים מכיוון שהם נקראים באופן שונה בהתאם לקונסולת המשחקים. בכל אחת מהתוכניות הנ"ל נכלל תהליך שיפוט, כך שכאשר אתה לוחץ על הכפתור, מוצגים שלושה כפתורים.

XboxPlayStation ועוד
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 יש leftupdown 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();
  }
}

leftStickrightStick אתה יכול לקבל את המידע על העיתונות על ידי קורא את 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 צרף אותו לאובייקט טקסט והגדר אותו לתצוגה.

נסה להפעיל את המשחק כדי לראות אם המידע מופיע.