Bediening met een Gamepad (Input System Package Version)
Verificatieomgeving
- Ramen
-
- Voor Windows 11
- Unity Editor
-
- 2020.3.25f1
- Input systeem pakket
-
- 1.2.0
Vereisten voor deze tip
De volgende instellingen zijn vooraf gemaakt als uitgangspunt voor de beschrijving van deze tip.
Over XInput en DirectInput
Hoewel het beperkt is tot Windows, zijn er twee verbindingsindelingen voor gamecontrollers: DirectInput en XInput. Hier komt "Gamepad" overeen met "XInput".
Dit Gamepad
programma houdt zich bezig met klassen, maar dit kan alleen controllers verwerken die "XInput" ondersteunen.
Als u een controller wilt gebruiken die DirectInput ondersteunt, moet u een andere Joystick
klasse gebruiken.
"DirectInput" is een oud verbindingsformaat en de definitie van de knop is relatief dubbelzinnig en kan controllers met speciale vormen aan. Onlangs is "XInput" echter mainstream geworden en het aantal controllers dat "DirectInput" niet ondersteunt, neemt toe. "DirectInput" heeft knopdefinities zoals "1", "2" en "3", dus makers van games moeten een knopcorrespondentie maken tussen het spel en de controller, zodat ze op de juiste manier kunnen worden ingesteld.
XInput wordt gedefinieerd als de volgende generatie DirectInput en bevat vooraf gedefinieerde A- en B-knoppen, triggers, sticks, enz. Daarom kan alleen een vaste vorm van de controller worden gebruikt, Omdat de definitie van knoppen goed is gedefinieerd, kunnen gamemakers games maken die bij de controller passen zonder zich zorgen te maken over de plaatsing van knoppen. Recente gamecontrollers die alleen "XInput" ondersteunen, nemen toe.
Bepalen of een knop wordt ingedrukt
U kunt bepalen of een knop wordt ingedrukt of niet, zowel door eigenschappen als xxxxxxxx.isPressed
door toetsenbord en muis.
Hier wil ik het type knop dat ik indruk in de tekst weergeven.
Plaats eerst een weergavetekstobject.
Maak een script voor het vonnis. De bestandsnaam is willekeurig, maar hier GamepadButtons
is het .
Het script ziet er als volgt uit:
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();
}
}
Nadat EventSystem
u het script hebt opgeslagen, koppelt u het aan het weergavetekstobject en configureert u het.
Probeer het spel uit te voeren en kijk of elke knop reageert.
Overigens zijn de volgende knoppen gedefinieerd als dezelfde knop, hoewel er meerdere knoppen zijn voorbereid omdat ze anders worden gelezen, afhankelijk van de spelcomputer. In elk van de bovenstaande programma's is een beoordelingsproces opgenomen, dus wanneer u op de knop drukt, worden drie knoppen weergegeven.
Xbox | PlayStation | en meer |
---|---|---|
bButton | circleButton | knopOost |
aButton | crossButton | knopZuid |
xButton | squareButton | knopWest |
yButton | driehoekButton | knopNoord |
Wat als een knop kan worden beoordeeld, is als volgt.
- Een knop, × knop, omlaagknop
- B-knop, ○-knop, rechterknop
- X-knop, □-knop, linkerknop
- Y-knop, pijl-omlaag, knop omhoog
- Startknop, Menuknop
- Knop Selecteren, Knop Bekijken
- Linkerschouderknop, L1-knop
- Rechterschouderknop, R1-knop
- Linker stick knop
- Rechter stick knop
Bepalen of de knop wordt ingedrukt
Het oordeel op het moment van drukken kan worden bepaald door de eigenschappen zoals bij xxxxxxxx.wasPressedThisFrame
het toetsenbord en de muis.
Berekent de waarde van het moment true
waarop erop wordt gedrukt en retourneert zelfs als false
het daarna wordt ingedrukt en vastgehouden.
Laten we de ingedrukte knop weergeven als tekst als een bedieningscontrole. Plaats een tekstobject voor weergave.
De bestandsnaam van het script kan van alles zijn, maar hier GamepadButtonsOneFrame
is het .
Het script ziet er als volgt uit: Voor de eenvoud worden slechts 4 knoppen beoordeeld.
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";
}
}
Nadat u EventSystem
het script hebt opgeslagen, koppelt u het aan en stelt u een tekstobject in voor weergave.
Probeer het spel uit te voeren en op de knop te drukken. Ik denk dat de knop die je hebt ingedrukt, zal worden toegevoegd. Je kunt ook zien dat het ingedrukt houden van de knop geen tekst toevoegt.
Bepaal of het moment waarop de knop wordt losgelaten
Er is geen voorbeeld, maar u kunt bepalen of dit het moment is wasPressedThisFrame
waarop u het vrijgeeft door een eigenschap te gebruiken in plaats van wasReleasedThisFrame
een eigenschap.
Bepalen wanneer u op de pijltoetsen drukt
Bepaalt de pers van de DPAD. Afhankelijk van de spelcomputer vliegt het met de pijltjestoetsen en de D-pad, maar beide worden als hetzelfde behandeld. De DPAD bepaalt in principe alleen of je in die richting duwt of niet. Er is geen oordeel als "een beetje duwen" als een stok.
Hiermee plaatst u een tekstobject om een beslissing weer te geven, ongeacht of deze wordt ingedrukt of niet, als een bewerkingscontrole.
Maak een script. De bestandsnaam is willekeurig, maar hier GamepadDpad
is het .
Het script ziet er als volgt uit:
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();
}
}
U kunt DPAD-informatie Gamepad.dpad
krijgen op .
DPAD heeft left
up
down
right
eigenschappen voor elke richting en u kunt bepalen of deze wordt ingedrukt of niet door de eigenschap enz. isPressed
DpadControl.ReadValue
U kunt de methode ook gebruiken om de staat Vector2
van de pers in . Als er niets wordt ingedrukt (0, 0), als links wordt ingedrukt (-1, 0), enzovoort.
Nadat u EventSystem
het script hebt opgeslagen, koppelt u het aan en stelt u een tekstobject in voor weergave.
Probeer het spel uit te voeren en interactie te hebben met de DPAD.
Vector2
Is trouwens in een genormaliseerde toestand, dus wanneer u diagonaal drukt, wordt het verkregen als een getal zoals (0,7071, 0,7071) in plaats van (1, 1).
Triggerdrukken bepalen
Xbox-controllers hebben links en rechts knoppen die triggers worden genoemd. Op PlayStation komt het overeen met L2R2. Deze knop is anders dan een normale knop en u kunt de hoeveelheid die u indrukt in 0,0 ~ 1,0 krijgen. Sommige andere controllers zijn uitgerust met andere namen dan triggers, maar in oudere controllers, enz., Kunnen ze eenvoudig als knoppen worden geplaatst, in welk geval het oordeel van het indrukken alleen als 0, 1 wordt behandeld.
Hier wil ik het aantal triggerdrukken controleren. Hiermee plaatst u een tekstobject voor weergave op het canvas.
Maak een script. Omdat het elders zal worden gebruikt, zullen we het hier GamepadReadValue
noemen .
Het script ziet er als volgt uit:
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
Elke leftTrigger
klasse heeft een eigenschap en u kunt het aantal persen rightTrigger
ReadValue
in het bereik van 0,0 ~ 1,0 krijgen door de methode aan te roepen.
Triggers kunnen ook worden behandeld als knoppen, zodat isPressed
u ook kunt beoordelen zoals.
isPressed
true
Trouwens, het aantal wordt ReadValue
gebaseerd op 0,5.
Nadat u het script hebt opgeslagen, koppelt u het aan en stelt u EventSystem
een tekstobject in voor weergave.
Probeer het spel uit te voeren en de trigger te verplaatsen.
Stickinformatie bepalen
De stick kan de informatie van respectievelijk de linkerstick en de rechterstick krijgen en je kunt de hoeveelheid krijgen van hoeveel de stick in welke richting naar beneden wordt geduwd. Natuurlijk, als je geen stick op je controller hebt, kun je deze informatie niet krijgen.
Stickinformatie kan worden opgehaald met Gamepad.rightStick
respectievelijk , .Gamepad.leftStick
Voor het bevestigingsscript van de bewerking zullen we het script dat eerder is gebruikt om de trigger te krijgen, omleiden.
// 省略
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
U kunt de persinformatie krijgen door de Vector2
methode aan te roepen van ReadValue
of .
Vector2
U kunt dus krijgen hoeveel x
y
u op de X-as en Y-as drukt door en eigenschappen,
Als u de richting wilt krijgen die u drukt, kunt u het in de woning krijgen en als u het bedrag wilt krijgen dat u drukt, kunt u magnitude
normalized
het in het pand krijgen.
Probeer het spel daadwerkelijk te verplaatsen en de stick te bedienen.
Gamepad-informatie opvragen
U kunt de ID, naam, enz. Van de aangesloten gamepad krijgen.
Raadpleeg bijvoorbeeld om het type controller te identificeren name
dat is aangesloten, of
U kunt verwijzen naar welke deviceId
gamepad u wilt koppelen wanneer meerdere gamepads zijn aangesloten.
Hier zullen we de informatie in de tekst weergeven om de werking te controleren.
De scriptnaam is willekeurig, maar hier GamepadInfo
is het .
Het script ziet er als volgt uit:
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
U kunt verschillende informatie krijgen van de opgehaalde . Hier zijn enkele fragmenten.
Nadat u het script hebt opgeslagen, koppelt u het aan en stelt u EventSystem
een tekstobject in voor weergave.
Probeer het spel uit te voeren om te zien of de informatie wordt weergegeven.