Gamepad ile Kontrol Etme (Giriş Sistemi Paketi Sürümü)

Sayfa güncel :
Sayfa oluşturma tarihi :

Doğrulama ortamı

Windows
  • Pencereler 11
Birlik Editörü
  • 2020.3.25f1
Giriş Sistemi Paketi
  • 1.2.0

Bu ipucu için önkoşullar

Aşağıdaki ayarlar, bu ipucunun açıklaması için bir öncül olarak önceden yapılmıştır.

XInput ve DirectInput hakkında

Windows ile sınırlı olsa da, oyun denetleyicileri için iki bağlantı biçimi vardır: DirectInput ve XInput. Burada, "Gamepad" "XInput" a karşılık gelir.

Bu Gamepad program sınıflarla ilgilenir, ancak bu yalnızca "XInput" u destekleyen denetleyicileri işleyebilir. DirectInput'u destekleyen bir denetleyici kullanmak için farklı Joystick bir sınıf kullanmanız gerekir.

"DirectInput" eski bir bağlantı formatıdır ve düğmenin 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", "1", "2" ve "3" gibi düğme tanımlarına sahiptir, bu nedenle oyun yaratıcılarının uygun şekilde ayarlanabilmeleri için oyun ve oyun kumandası arasında bir düğme yazışması oluşturmaları gerekir.

XInput, yeni nesil DirectInput olarak tanımlanır ve önceden tanımlanmış A ve B düğmeleri, tetikleyiciler, çubuklar vb. İçerir. Bu nedenle, kontrolörün sadece sabit bir şekli kullanılabilir, Düğmelerin tanımı iyi tanımlandığından, oyun yaratıcıları düğmelerin yerleştirilmesi konusunda endişelenmeden denetleyiciye uygun oyunlar oluşturabilir. Yalnızca "XInput" u destekleyen son oyun denetleyicileri artıyor.

Bir düğmeye basılıp basılmadığını belirleme

Bir düğmeye basılıp basılmayacağını özelliklerin yanı sıra xxxxxxxx.isPressed klavye ve fareyle de belirleyebilirsiniz. Burada, metinde bastığım düğme türünü görüntülemek istiyorum.

İlk olarak, bir görüntüleme metni nesnesi yerleştirin.

Karar için bir komut dosyası oluşturun. Dosya adı keyfidir, ancak işte burada GamepadButtons .

Komut dosyası şöyle görünür:

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

Komut dosyasını kaydettikten sonra EventSystem , görüntüleme metni nesnesine ekleyin ve yapılandırın.

Oyunu çalıştırmayı deneyin ve her düğmenin yanıt verip vermediğine bakın.

Bu arada, aşağıdaki düğmeler aynı düğme olarak tanımlanır, ancak oyun konsoluna bağlı olarak farklı okundukları için birden fazla düğme hazırlanır. Yukarıdaki programların her birinde, bir yargılama süreci dahil edilmiştir, bu nedenle düğmeye bastığınızda üç düğme görüntülenir.

Xbox, PlayStation ve daha fazlası
bDüğme circleButton buttonDoğu
aDüğme çapraz Düğme buttonGüney
xDüğmesi kareDüğme buttonBatı
yDüğme üçgenDüğme düğmesiKuzey

Bir düğme olarak değerlendirilebilecek olan şey aşağıdaki gibidir.

  • Bir düğme, × düğme, aşağı düğmesi
  • B düğmesi, ○ düğmesi, sağ düğme
  • X Düğmesi, □ Düğmesi, Sol Düğme
  • Y düğmesi, Aşağı Ok düğmesi, Yukarı düğmesi
  • Başlat düğmesi, Menü düğmesi
  • Seç düğmesi, Görüntüle düğmesi
  • Sol omuz düğmesi, L1 düğmesi
  • Sağ omuz düğmesi, R1 düğmesi
  • Sol çubuk düğmesi
  • Sağ çubuk düğmesi

Düğmeye basılıp basılmadığını belirleme

Basın anındaki karar, klavye ve farede olduğu gibi özelliklerle xxxxxxxx.wasPressedThisFrame belirlenebilir. Basıldığı anın true değerini döndürür ve daha sonra basılıp tutulsa false bile geri döner.

Basılan butonu operasyon kontrolü olarak metin olarak görüntüleyelim. Görüntülenmek üzere bir metin nesnesi yerleştirin.

Komut dosyasının dosya adı herhangi bir şey olabilir, ama işte burada GamepadButtonsOneFrame .

Komut dosyası şöyle görünür: Basitlik için, sadece 4 düğme değerlendirilir.

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";
  }
}

Komut dosyasını kaydettikten sonra EventSystem , görüntülemek üzere bir metin nesnesine ekleyin ve ayarlayın.

Oyunu çalıştırmayı ve düğmeye basmayı deneyin. Bastığınız butonun ekleneceğini düşünüyorum. Düğmeyi basılı tutmanın herhangi bir metin eklemediğini de görebilirsiniz.

Düğmenin serbest bırakıldığı anın olup olmadığını belirleme

Örnek yoktur, ancak özellik yerine wasReleasedThisFrame bir özellik kullanarak serbest bıraktığınız an olup olmadığını wasPressedThisFrame belirleyebilirsiniz.

Ok tuşlarına ne zaman basacağınızı belirleme

DPAD'nin baskısını belirler. Oyun konsoluna bağlı olarak, ok tuşları ve yön düğmesi ile uçar, ancak her ikisi de aynı şekilde kabul edilir. DPAD temel olarak yalnızca bu yönde itip itmediğinizi belirler. Bir sopa gibi "biraz itmek" gibi bir yargı yoktur.

İşlem denetimi olarak basılıp basılmadığına dair bir kararı görüntülemek için bir metin nesnesi yerleştirir.

Bir komut dosyası oluşturun. Dosya adı keyfidir, ancak işte burada GamepadDpad .

Komut dosyası şöyle görünür:

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

DPAD bilgilerine Gamepad.dpad şuradan ulaşabilirsiniz: .

DPAD'nin her yön için özellikleri vardır leftupdown rightve özellik vb. tarafından basılıp basılmadığını belirleyebilirsiniz. isPressed

DpadControl.ReadValue Yöntemi, basının durumunu Vector2 almak için de kullanabilirsiniz. Hiçbir şeye basılmazsa (0, 0), sola basılırsa (-1, 0) vb.

Komut dosyasını kaydettikten sonra EventSystem , görüntülemek üzere bir metin nesnesine ekleyin ve ayarlayın.

Oyunu çalıştırmayı ve DPAD ile etkileşimde bulunmayı deneyin.

Vector2 Bu arada, normalleştirilmiş bir durumda, bu nedenle çapraz olarak bastığınızda, (1, 1) yerine (0.7071, 0.7071) gibi bir sayı olarak elde edilir.

Tetik basmalarını belirleme

Xbox oyun kumandalarının solunda ve sağında tetikleyici adı verilen düğmeler bulunur. PlayStation'da L2R2'ye karşılık gelir. Bu düğme normal bir düğmeden farklıdır ve bastığınız miktarı 0.0 ~ 1.0 olarak alabilirsiniz. Diğer bazı denetleyiciler tetikleyiciler dışındaki isimlerle donatılmıştır, ancak eski denetleyicilerde, vb., Sadece düğmeler olarak yerleştirilebilirler, bu durumda basma kararı yalnızca 0, 1 olarak ele alınır.

Burada, tetik basma miktarını kontrol etmek istiyorum. Kanvasta görüntülenmek üzere bir metin nesnesi yerleştirir.

Bir komut dosyası oluşturun. Başka bir yerde kullanılacağından, burada GamepadReadValue adlandıracağız .

Komut dosyası şöyle görünür:

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 Her leftTriggersınıfın bir özelliği vardır ve rightTrigger ReadValue yöntemi çağırarak 0.0 ~ 1.0 aralığındaki baskı miktarını alabilirsiniz. Tetikleyiciler düğmeler olarak da değerlendirilebilir, böylece isPressed böyle bir yargıda bulunabilirsiniz. isPressed true Bu arada, olma ReadValue miktarı 0.5'e dayanmaktadır.

Komut dosyasını kaydettikten sonra, EventSystem görüntülemek üzere bir metin nesnesine ekleyin ve ayarlayın.

Oyunu çalıştırmayı ve tetiği hareket ettirmeyi deneyin.

Çubuk bilgilerini belirleme

Çubuk sırasıyla sol çubuğun ve sağ çubuğun bilgilerini alabilir ve çubuğun hangi yönde ne kadar aşağı itildiğinin miktarını alabilirsiniz. Elbette, oyun kumandanızda bir çubuk yoksa bu bilgileri alamazsınız.

Çubuk bilgileri sırasıyla Gamepad.leftStick , Gamepad.rightStick ile alınabilir.

İşlem onay komut dosyası için, tetikleyiciyi almak için daha önce kullanılan komut dosyasını yönlendireceğiz.

// 省略

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 Basın bilgilerini yöntemi çağırarak Vector2 veya .ReadValue Vector2 Böylece X eksenine ve Y eksenine ne x y kadar bastığınızı ve özelliklerini elde edebilirsiniz, Bastığınız yönü almak istiyorsanız mülkte, bastığınız normalized miktarı almak istiyorsanız magnitude mülkte alabilirsiniz.

Oyunu gerçekten hareket ettirmeye ve çubuğu çalıştırmaya çalışın.

Gamepad bilgilerini alma

Kimliği, adı vb. Bağlı gamepad'den alabilirsiniz. Örneğin, bağlı olan denetleyicinin türünü tanımlamak name için bkz. veya Birden fazla gamepad bağlandığında hangi deviceId gamepad ile ilişkilendirileceğine başvurabilirsiniz.

Burada, işlemi kontrol etmek için metindeki bilgileri görüntüleyeceğiz.

Komut dosyası adı keyfidir, ancak işte burada GamepadInfo .

Komut dosyası şöyle görünür:

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 Alınan 'dan çeşitli bilgiler alabilirsiniz. İşte bazı alıntılar.

Komut dosyasını kaydettikten sonra, EventSystem görüntülemek üzere bir metin nesnesine ekleyin ve ayarlayın.

Bilgilerin görünüp görünmediğini görmek için oyunu çalıştırmayı deneyin.