Joystick ile çalıştırma (Giriş Sistemi paketlenmiş versiyonu)

Sayfa güncel :
Sayfa oluşturma tarihi :

Doğrulama ortamı

Windows
  • pencereler 11
Unity Düzenleyicisi
  • 2020.3.25f1
Giriş Sistemi Paketleri
  • 1.2.0

Bu ipucu için önkoşullar

Aşağıdaki ayarlar, bu ipuçlarının açıklanması için bir önkoşul olarak önceden yapılandırılmıştır.

XInput ve DirectInput hakkında

Windows ile sınırlı olmasına rağmen, oyun denetleyicileri için iki bağlantı biçimi vardır: "DirectInput" ve "XInput". Buradaki "Joystick", "DirectInput" a karşılık gelir.

Bu programda Joystick bir sınıfla uğraşıyoruz, ancak yalnızca "DirectInput" destekleyen denetleyicileri işleyebilir. "XInput"u destekleyen bir denetleyici kullanmak için farklı Gamepad bir sınıf kullanmanız gerekir.

"DirectInput" eski bir bağlantı biçimidir ve düğmelerin tanımı nispeten belirsizdir ve özel şekillere sahip denetleyicileri işleyebilir. Ancak son zamanlarda "XInput" ana akım haline geldi ve "DirectInput"u desteklemeyen denetleyicilerin sayısı artıyor. "DirectInput", düğmeleri "1", "2" ve "3" olarak tanımladığından, oyun yaratıcıları, oyun ve denetleyici düğmesi yazışmalarının uygun şekilde ayarlanmasına izin veren bir sistem oluşturmalıdır.

"XInput", yeni nesil "DirectInput" olarak tanımlanır ve önceden tanımlanmış A ve B düğmelerine, tetikleyicilere, çubuklara vb. sahiptir. Bu nedenle, kontrolörün şekli yalnızca neredeyse sabit olan kullanılabilir. Düğmelerin tanımı iyi tanımlandığından, oyun yaratıcıları, düğmelerin yerleşimi konusunda endişelenmeden denetleyiciyle eşleşen oyunlar oluşturabilir. Giderek artan sayıda yeni oyun kumandası yalnızca "XInput" ile uyumludur.

Joystick'ler Hakkında

Yukarıda da bahsedildiği gibi butonun bir tanımı yok, bu yüzden gerçekten kullanabilmek için her bir butonun bilgilerini incelerken oyun işlemlerini atamak gibi zahmetli işlemleri de eklemek gerekiyor. Eski olduğu için yeni bir oyunda DirectInput kullanmanız gerektiğini düşünmüyorum, ancak gerçekten desteklemek istiyorsanız programınızın karmaşık olabileceğini unutmayın.

Bu örnek temel olarak listelenen düğmeler hakkında bilgi edinmekle sınırlıdır. name Aslında, işlemleri kontrol etmeniz ve atamanız gerekir.

Joystick Bilgi Edinme

Oyun çubuğundaki her düğme hakkında bilgi görüntülemek için bir metin nesnesi yerleştirin.

Bir komut dosyası oluşturun. İsim keyfidir, ancak bu durumda JoystickInfo .

Komut dosyası şuna benzer: Elde edilen bilgiler, denetleyicinin türüne bağlı olarak değişir. Her denetleyici için programlamak çok zordur, bu yüzden sadece tüm düğmeleri numaralandırıyorum ve düğme tipini alıyorum ve bilgilere basıyorum.

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();
  }
}

Bağlı joystick hakkında bilgi Joystick.current alabilirsiniz. Joystick Bundan sonra, her bilgiyi sınıftan alacağız.

Joystick Sınıftan stick trigger da görebileceğiniz gibi ve gibi tanımlar var ancak A butonu ya da start butonu gibi tanımları yok. Bu nedenle, tüm düğmeleri, çubuklarıallControls numaralandırmak ve düğme türünü bulmak ve bilgileri basmak için Özellikler'i kullanmalısınız.

Komut dosyası kaydedildikten sonra, EventSystem bilgileri görüntülemek için bir metin nesnesine ekleyin ve ayarlayın.

Oyunu DirectInput'u destekleyen bir oyun kumandasıyla çalıştırmayı deneyin. Her bilgi parçası alınabilir.

Denetleyiciye bağlı olarak, bir çubuğa, ok tuşuna vb. bastığınızda değeri amaçlandığı gibi alamayabilirsiniz. Düğmeler bu şekilde tanımlanmadığından, her düğme için doğru basma bilgisi elde etmek zordur. Ek olarak, joystick'i tam olarak desteklemenin oldukça zor olduğunu görebilirsiniz, örneğin düğmelerin düzeni denetleyiciye bağlı olarak değişir.

Oyun joystick'leri destekleyecekse, her kullanıcının sahip olduğu denetleyicinin düğme düzenini özelleştirebilmesi için anahtar yapılandırması gibi bir ayar ekranına sahip olmak arzu edilir.

Birden fazla joystick için nasıl bilgi alınır

Bağlı tüm oyun çubukları hakkında Joystick.all bilgi şuradan edinilebilir: . ReadOnlyArray İçinde foreach numaralandırılabilir ve bu böyle devam eder.

Her değer bir sınıf olduğu Joystick için bir önceki programdaki gibi joystick bilgisi alabilirsiniz.