Управление с геймпад (версия на пакета за въвеждане на системата)
Среда за проверка
- Уиндоус
-
- Прозорци 11
- Редактор на единство
-
- 2020.3.25ф1
- Пакет на входната система
-
- 1.2.0
Предпоставки за този съвет
Следните настройки са направени предварително като предпоставка за описанието на този съвет.
За XInput и DirectInput
Въпреки че е ограничен до Windows, има два формата за връзка за игрови контролери: DirectInput и XInput. Тук "Геймпад" съответства на "XInput".
Тази Gamepad
програма се занимава с класове, но това може да се справи само с контролери, които поддържат "XInput".
За да използвате контролер, който поддържа DirectInput, трябва да използвате различен Joystick
клас.
"DirectInput" е стар формат на свързване и дефиницията на бутона е сравнително двусмислена и може да обработва контролери със специални форми. Напоследък обаче "XInput" се превърна в мейнстрийм, а броят на контролерите, които не поддържат "DirectInput", се увеличава. "DirectInput" има дефиниции на бутони като "1", "2" и "3", така че създателите на игри трябва да създадат съответствие на бутоните между играта и контролера, така че те да могат да бъдат настроени по подходящ начин.
XInput се определя като следващото поколение DirectInput и включва предварително дефинирани A и B бутони, тригери, пръчки и др. Следователно може да се използва само фиксирана форма на контролера, Тъй като дефиницията на бутоните е добре дефинирана, създателите на игри могат да създават игри, които отговарят на контролера, без да се притесняват за поставянето на бутони. Последните контролери за игри, които поддържат само "XInput", се увеличават.
Определяне дали се натиска бутон
Можете да определите дали даден бутон да бъде натиснат или не по свойства, както xxxxxxxx.isPressed
и по клавиатура и мишка.
Тук бих искал да покажа типа бутон, който натискам в текста.
Първо, поставете показван текстов обект.
Създайте сценарий за присъдата. Името на файла е произволно, но ето GamepadButtons
го .
Сценарият изглежда така:
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();
}
}
След като EventSystem
запишете скрипта, прикачете го към и конфигурирайте обекта на показвания текст.
Опитайте да стартирате играта и вижте дали всеки бутон отговаря.
Между другото, следните бутони се определят като един и същ бутон, въпреки че са подготвени множество бутони, защото се четат по различен начин в зависимост от игровата конзола. Във всяка от горните програми е включен процес на преценка, така че когато натиснете бутона, се показват три бутона.
Xbox | PlayStation | и други |
---|---|---|
бБутон | кръгов бутон | бутонИзток |
aБутон | кръстосан бутон | бутонЮг |
xБутон | квадратен бутон | бутонЗапад |
yБутон | Бутон триъгълник | бутонСевер |
Това, което може да се прецени като бутон, е следното.
- Бутон, бутон ×, бутон надолу
- B бутон, ○ бутон, десен бутон
- Бутон X, бутон □, ляв бутон
- Бутон Y, бутон със стрелка надолу, бутон "Нагоре"
- Бутон "Старт", бутон "Меню"
- Бутон "Избор", бутон "Изглед"
- Бутон на лявото рамо, бутон L1
- Десен бутон на рамото, бутон R1
- Бутон за лява пръчка
- Десен бутон за пръчка
Определете дали бутонът е натиснат
Преценката в момента на натискане може да се определи от свойствата, както при xxxxxxxx.wasPressedThisFrame
клавиатурата и мишката.
Връща стойността на момента true
, в който е натиснат, и се връща дори ако false
е натиснат и задържан след това.
Нека покажем бутона, натиснат като текст като проверка на операцията. Поставяне на текстов обект за показване.
Името на файла на скрипта може да бъде всичко, но тук GamepadButtonsOneFrame
е .
Сценарият изглежда така: За простота се оценяват само 4 бутона.
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";
}
}
След като EventSystem
запишете скрипта, прикачете го към и задайте текстов обект за показване.
Опитайте да стартирате играта и да натиснете бутона. Мисля, че бутонът, който сте натиснали, ще бъде добавен. Можете също така да видите, че задържането на бутона не добавя никакъв текст.
Определете дали моментът, в който бутонът е освободен
Няма извадка, но можете да определите дали това е wasPressedThisFrame
моментът, в който я пускате, като използвате свойство вместо wasReleasedThisFrame
свойство.
Определете кога да натиснете клавишите със стрелки
Определя пресата на DPAD. В зависимост от игровата конзола, тя ще лети с клавишите със стрелки и D-pad, но и двете се третират като еднакви. DPAD основно определя само дали натискате в тази посока или не. Няма преценка като "бутане малко" като пръчка.
Поставя текстов обект, за да покаже решение дали да бъде натиснат, или не като проверка на операция.
Създаване на скрипт. Името на файла е произволно, но ето GamepadDpad
го .
Сценарият изглежда така:
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();
}
}
Можете да получите информация за Gamepad.dpad
DPAD на адрес .
DPAD има left
up
down
right
свойства за всяка посока и можете да определите дали е натиснат или не от имота и т.н. isPressed
DpadControl.ReadValue
Можете също да използвате метода, за да получите състоянието Vector2
на пресата в . Ако нищо не е натиснато (0, 0), ако лявото е натиснато (-1, 0) и т.н.
След като EventSystem
запишете скрипта, прикачете го към и задайте текстов обект за показване.
Опитайте да стартирате играта и да взаимодействате с DPAD.
Vector2
Между другото, е в нормализирано състояние, така че когато натиснете диагонално, се получава като число като (0.7071, 0.7071) вместо (1, 1).
Определяне на преси за задействане
Xbox контролерите имат бутони, наречени тригери отляво и отдясно. На PlayStation тя съответства на L2R2. Този бутон е различен от нормалния бутон и можете да получите сумата, която натискате в 0.0 ~ 1.0. Някои други контролери са оборудвани с имена, различни от тригерите, но при по-старите контролери и т.н., те могат просто да бъдат поставени като бутони, в който случай преценката за натискане се обработва само като 0, 1.
Тук бих искал да проверя количеството на спусъчните преси. Поставя текстов обект за показване върху платното.
Създаване на скрипт. Тъй като ще се използва другаде, ще го наречем тук GamepadReadValue
.
Сценарият изглежда така:
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
Всеки leftTrigger
клас има свойство и rightTrigger
ReadValue
можете да получите количеството преси в диапазона от 0.0 ~ 1.0, като извикате метода.
Тригерите също могат да бъдат третирани като бутони, така че isPressed
можете да прецените и като например.
isPressed
true
Между другото, размерът на става ReadValue
се основава на 0,5.
След като запишете скрипта, EventSystem
прикачете го към и задайте текстов обект за показване.
Опитайте се да стартирате играта и да преместите спусъка.
Определете информацията за пръчката
Пръчката може да получи информацията съответно на лявата пръчка и дясната пръчка и можете да получите количеството колко пръчката е избутана надолу в коя посока. Разбира се, ако нямате пръчка на контролера си, няма да можете да получите тази информация.
Стик информация могат да бъдат извлечени с , Gamepad.rightStick
съответноGamepad.leftStick
.
За скрипта за потвърждение на операцията ще отклоним скрипта, използван по-рано, за да получим спусъка.
// 省略
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
Можете да получите информация за пресата, като се обадите на Vector2
метода от ReadValue
или .
Vector2
Така че можете да получите колко x
y
натискате върху оста X и оста Y от и свойства,
Ако искате да получите посоката, в която натискате, можете да я получите в имота, а ако magnitude
искате да получите сумата, която натискате, normalized
можете да я получите в имота.
Опитайте се действително да преместите играта и да работите с пръчката.
Получаване на информация за геймпада
Можете да получите идентификационния номер, името и т.н. от свързания геймпад.
Например, обърнете се към , за да идентифицирате name
типа контролер, който е свързан, или
Можете да направите справка за това с кой deviceId
геймпад да се свържете, когато са свързани няколко геймпада.
Тук ще покажем информацията в текста, за да проверим операцията.
Името на скрипта е произволно, но ето го .GamepadInfo
Сценарият изглежда така:
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
Можете да получите различна информация от извлечените . Ето някои откъси.
След като запишете скрипта, EventSystem
прикачете го към и задайте текстов обект за показване.
Опитайте да стартирате играта, за да видите дали информацията се появява.