Управление с помощью геймпада (версия пакета системы ввода)
Среда верификации
- Виндоус
-
- Windows 11
- Редактор Unity
-
- 2020.3.25f1
- Входной системный пакет
-
- 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 | и многое другое |
---|---|---|
bКнопка | circleButton | buttonEast |
Кнопка | crossButton | кнопкаЮг |
xКнопка | squareButton | buttonWest |
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. В зависимости от игровой консоли, он будет летать с клавишами со стрелками и крестовиной, но оба рассматриваются как одно и то же. 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
прикрепите его к текстовому объекту и установите его для отображения.
Попробуйте запустить игру, чтобы увидеть, появится ли информация.