Gamepad ile Kontrol Etme (Giriş Sistemi Paketi Sürümü)
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 left
up
down
right
ve ö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 leftTrigger
sı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();
}
}
leftStick
rightStick
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.