کنترل با یک گیم پد (ورودی سیستم بسته بندی نسخه)

صفحه به روز شده :
تاریخ ایجاد صفحه :

محیط تایید

ویندوز
  • ویندوز 11
ویرایشگر یونیتی
  • دانلود: 2020.3.25f1
بسته سیستم ورودی
  • 1.2.0

پیشنیازهای این نکته

تنظیمات زیر از قبل به عنوان یک فرض برای توصیف این نکته ساخته شده است.

درباره XInput و DirectInput

اگر چه محدود به ویندوز است، دو فرمت اتصال برای کنترل کننده های بازی وجود دارد: DirectInput و XInput. در اینجا، "Gamepad" مربوط به "XInput" است.

این Gamepad برنامه با کلاس ها سروکار دارد، اما این تنها می تواند کنترل کننده هایی را که از "XInput" پشتیبانی می کنند، اداره کند. برای استفاده از یک کنترلر که از DirectInput پشتیبانی می کند، باید از یک کلاس دیگر Joystick استفاده کنید.

"DirectInput" یک فرمت اتصال قدیمی است و تعریف دکمه نسبتا مبهم است و می تواند کنترل کننده ها را با اشکال خاص اداره کند. با این حال، اخیرا ، "XInput" به جریان اصلی تبدیل شده است و تعداد کنترل کننده هایی که از "DirectInput" پشتیبانی نمی کنند در حال افزایش است. "DirectInput" دارای تعاریف دکمه ای مانند "1"، "2" و "3" است، بنابراین سازندگان بازی باید یک مکاتبات دکمه ای بین بازی و کنترل کننده ایجاد کنند تا بتوانند به طور مناسب تنظیم شوند.

XInput به عنوان نسل بعدی DirectInput تعریف شده است و شامل دکمه های A و B از پیش تعریف شده، محرک ها، چوب ها و غیره است. بنابراین، تنها یک شکل ثابت از کنترل کننده می تواند مورد استفاده قرار گیرد، از انجا که تعریف دکمه ها به خوبی تعریف شده است، سازندگان بازی می توانند بازی هایی را ایجاد کنند که با توجه به کنترل کننده بدون نگرانی در مورد قرار دادن دکمه ها باشد. کنترل کننده های بازی های اخیر که فقط از "XInput" پشتیبانی می کنند در حال افزایش هستند.

تعیین اینکه ایا یک دکمه فشار داده می شود

شما می توانید تعیین کنید که ایا یک دکمه توسط ویژگی ها و همچنین xxxxxxxx.isPressed صفحه کلید و ماوس فشار داده می شود یا خیر. در اینجا، من می خواهم نوع دکمه ای را که در متن فشار می دهم نمایش دهم.

ابتدا یک شیء متنی نمایش داده شده قرار دهید.

یک فیلمنامه برای حکم ایجاد کنید. نام فایل خودسرانه است، اما در اینجا 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 ذخیره اسکریپت، ان را به شیء متن نمایش متصل و پیکربندی کنید.

سعی کنید بازی را اجرا کنید و ببینید ایا هر دکمه پاسخ می دهد.

به هر حال، دکمه های زیر به عنوان یک دکمه تعریف می شوند، اگرچه چندین دکمه اماده شده اند زیرا بسته به کنسول بازی متفاوت خوانده می شوند. در هر یک از برنامه های فوق، یک فرایند قضاوت گنجانده شده است، بنابراین هنگامی که دکمه را فشار می دهید، سه دکمه نمایش داده می شود.

XboxPlayStation و بیشتر
بیبوتن دکمه دایره ای دکمهاست
باتون کراس باتون دکمهای به جلو
ایکس باتون دکمه مربعی دکمهWest
yButton می باشد مثلث دکمه دکمهNorth

انچه که می تواند به عنوان یک دکمه قضاوت شود به شرح زیر است.

  • 13،3،× 3،3،3،3،3،3،3،3،3،3،
  • دکمه B، دکمه ○، دکمه راست
  • بسته به حال حاضر در حال حاضر در □ حال حاضر در
  • دکمه 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 یک ملک منتشر می کنید.

تعیین زمانی که شما کلید های arrow را فشار دهید

مطبوعات DPAD را تعیین می کند. بسته به کنسول بازی، ان را با کلید های arrow و D-پد پرواز، اما هر دو به عنوان همان درمان می شود. DPAD اساسا فقط تعیین می کند که ایا شما در این جهت حرکت می کنید یا خیر. هیچ قضاوتی مانند "فشار دادن کمی" مانند یک چوب وجود ندارد.

یک شیء متنی را برای نمایش یک تصمیم قرار می دهد که ایا ان را به عنوان یک بررسی عملیات فشار داده یا نه.

یک اسکریپت ایجاد کنید. نام فایل خودسرانه است، اما در اینجا 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 دکمه هایی به نام triggers در سمت چپ و راست دارند. در PlayStation، مربوط به L2R2 است. این دکمه با یک دکمه معمولی متفاوت است و شما می توانید مبلغی را که فشار می دهید در 0.0 ~ 1.0 دریافت کنید. برخی از کنترل کننده های دیگر با نام های غیر از ماشه مجهز شده اند، اما در کنترل کننده های قدیمی تر و غیره، انها ممکن است به سادگی به عنوان دکمه قرار بگیرند، در این صورت قضاوت فشار دادن تنها به عنوان 0، 1 انجام می شود.

در اینجا، من می خواهم برای بررسی مقدار فشار ماشه. یک شیء متنی برای نمایش روی بوم قرار می دهد.

یک اسکریپت ایجاد کنید. از انجا که در جای دیگری استفاده خواهد شد، ما ان را در اینجا 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.

سعی کنید در واقع حرکت بازی و عمل چوب.

دریافت اطلاعات گیم پد

شما می توانید شناسه، نام و غیره را از گیم پد متصل دریافت کنید. به عنوان مثال، برای شناسایی name نوع کنترل کننده ای که متصل است، یا شما می توانید به کدام گیم پد برای ارتباط با زمانی که deviceId چندین گیم پد متصل هستند مراجعه کنید.

در اینجا، ما اطلاعات را در متن نمایش می دهیم تا عملیات را بررسی کنیم.

نام فیلمنامه خودسرانه است، اما در اینجا 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 شما می توانید اطلاعات مختلف را از بازیابی دریافت کنید. در اینجا برخی از گزیده ها.

پس از ذخیره اسکریپت، EventSystem ان را ضمیمه کنید و یک شیء متنی را برای نمایش تنظیم کنید.

سعی کنید بازی را اجرا کنید تا ببینید ایا اطلاعات ظاهر می شود.