التشغيل باستخدام عصا التحكم (إصدار نظام الإدخال المعبأ)

تحديث الصفحة :
تاريخ إنشاء الصفحة :

بيئة التحقق

نوافذ
  • ويندوز ١١
محرر الوحدة
  • 2020.3.25f1
حزم نظام الإدخال
  • 1.2.0

المتطلبات الأساسية لهذه النصيحة

يتم تكوين الإعدادات التالية مسبقا كشرط أساسي لشرح هذه النصائح.

حول XInput و DirectInput

على الرغم من أنه يقتصر على Windows ، إلا أن هناك تنسيقين للاتصال لوحدات التحكم في الألعاب: "DirectInput" و "XInput". "عصا التحكم" هنا يتوافق مع "DirectInput".

في Joystick هذا البرنامج ، نتعامل مع فئة ، ولكن يمكنها فقط التعامل مع وحدات التحكم التي تدعم "DirectInput". لاستخدام وحدة تحكم تدعم "XInput" ، تحتاج إلى استخدام فئة مختلفة Gamepad .

"DirectInput" هو تنسيق اتصال قديم ، وتعريف الأزرار غامض نسبيا ، ويمكنه التعامل مع وحدات التحكم ذات الأشكال الخاصة. ومع ذلك ، في الآونة الأخيرة ، أصبح "XInput" سائدا ، ويتزايد عدد وحدات التحكم التي لا تدعم "DirectInput". نظرا لأن "DirectInput" يعرف الأزرار على أنها "1" و "2" و "3" ، يجب على منشئي الألعاب إنشاء نظام يسمح بتعيين مراسلات زر اللعبة ووحدة التحكم بشكل مناسب.

يتم تعريف "XInput" على أنه الجيل التالي من "DirectInput" وقد حدد مسبقا أزرار A و B والمشغلات والعصي وما إلى ذلك. لذلك ، لا يمكن استخدام شكل وحدة التحكم إلا ، وهو ثابت تقريبا. نظرا لأن تعريف الأزرار محدد جيدا ، يمكن لمنشئي الألعاب إنشاء ألعاب تتوافق مع وحدة التحكم دون القلق بشأن وضع الأزرار. عدد متزايد من أجهزة التحكم في الألعاب الحديثة متوافقة فقط مع "XInput".

حول عصا التحكم

كما ذكر أعلاه ، لا يوجد تعريف للزر ، لذلك من أجل استخدامه فعليا ، من الضروري إضافة عمليات مزعجة مثل تعيين عمليات اللعبة أثناء فحص معلومات كل زر. لا أعتقد أنك بحاجة إلى استخدام DirectInput في لعبة جديدة لأنها قديمة ، ولكن ضع في اعتبارك أنه إذا كنت تريد حقا دعمها ، فقد يكون برنامجك معقدا.

تقتصر هذه العينة بشكل أساسي على الحصول على معلومات حول الأزرار المدرجة. name في الواقع ، تحتاج إلى التحقق من العمليات وتعيينها.

عصا التحكم الحصول على المعلومات

ضع كائنا نصيا لعرض معلومات حول كل زر على عصا التحكم.

إنشاء برنامج نصي. الاسم تعسفي ، لكن في هذه الحالة JoystickInfo ، هو .

يبدو البرنامج النصي كما يلي: تختلف المعلومات التي تم الحصول عليها حسب نوع وحدة التحكم. من الصعب جدا البرمجة لكل وحدة تحكم ، لذلك أقوم فقط بتعداد جميع الأزرار والحصول على نوع الزر والضغط على المعلومات.

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

public class JoystickInfo : 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 joystick = Joystick.current;
    if (joystick == null)
    {
      Debug.Log("ジョイスティックがありません。");
      TextObject.text = "";
      return;
    }

    Builder.Clear();

    // ジョイスティックの情報取得
    Builder.AppendLine($"deviceId:{joystick.deviceId}");
    Builder.AppendLine($"name:{joystick.name}");
    Builder.AppendLine($"displayName:{joystick.displayName}");

    // ジョイスティックにはボタンの大部分が定義されていないので
    // 基本的には allControls で列挙して入力の種類と値を確認していく
    foreach (var key in joystick.allControls)
    {
      if (key is StickControl stick)
      {
        if (stick.up.isPressed) Builder.AppendLine($"{key.name} Up");
        if (stick.down.isPressed) Builder.AppendLine($"{key.name} Down");
        if (stick.left.isPressed) Builder.AppendLine($"{key.name} Left");
        if (stick.right.isPressed) Builder.AppendLine($"{key.name} Right");

        var value = stick.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
      }
      else if (key is Vector2Control vec2)
      {
        var value = vec2.ReadValue();
        if (value.magnitude > 0f)
        {
          Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
        }
        if (vec2.x.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.x.ReadValue()}");
        }
        if (vec2.y.ReadValue() != 0f)
        {
          Builder.AppendLine($"{key.name}.x:{vec2.y.ReadValue()}");
        }
      }
      else if (key is ButtonControl button)
      {
        if (button.isPressed) Builder.AppendLine($"{key.name} isPress");
        var value = button.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else if (key is AxisControl axis)
      {
        if (axis.IsPressed()) Builder.AppendLine($"{key.name} isPress");

        var value = axis.ReadValue();
        if (value != 0f)
        {
          Builder.AppendLine($"{key.name}:{value}");
        }
      }
      else
      {
        Builder.AppendLine($"Type={key.GetType()}");
      }
    }

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

يمكنك الحصول على معلومات Joystick.current حول عصا التحكم المتصلة في . Joystick بعد ذلك ، سوف نحصل على كل المعلومات من الفصل.

Joystick كما ترى من الفصل ، هناك تعريفات مثل و ، stick trigger ولكن لا توجد تعريفات مثل الزر A أو زر البدء. لذلك ، يجب عليك استخدام خصائص لتعداد جميع الأزرار والعصيallControls ومعرفة نوع الزر واضغط على المعلومات.

بمجرد حفظ البرنامج النصي ، EventSystem قم بإرفاقه وتعيين كائن نصي لعرض المعلومات.

حاول تشغيل اللعبة باستخدام وحدة تحكم تدعم DirectInput. يمكن استرجاع كل معلومة.

اعتمادا على وحدة التحكم ، قد لا تحصل على القيمة على النحو المنشود عند الضغط على عصا أو مفتاح سهم وما إلى ذلك. نظرا لعدم تعريف الأزرار بهذه الطريقة ، فمن الصعب الحصول على معلومات صحفية دقيقة لكل زر. بالإضافة إلى ذلك ، يمكنك أن ترى أنه من الصعب جدا دعم عصا التحكم بشكل كامل ، مثل اختلاف ترتيب الأزرار اعتمادا على وحدة التحكم.

إذا كانت اللعبة تدعم أذرع التحكم ، فسيكون من المستحسن أن يكون لديك شاشة إعداد مثل تكوين المفتاح بحيث يمكن لكل مستخدم تخصيص تخطيط زر وحدة التحكم التي لديهم.

كيفية الحصول على معلومات لأذرع التحكم المتعددة

يمكن الحصول على معلومات حول Joystick.all جميع أذرع التحكم المتصلة في . ReadOnlyArray يمكن تعدادها foreach في وهلم جرا.

نظرا لأن كل قيمة عبارة Joystick عن فئة ، يمكنك الحصول على معلومات عصا التحكم كما في البرنامج السابق.