Управление с помощью джойстика (комплектная версия Input System)
Проверочная среда
- Виндоус
-
- Windows 11
- Редактор Unity
-
- 2020.3.25f1
- Системные пакеты ввода
-
- 1.2.0
Необходимые условия для получения этого совета
Следующие параметры предварительно настроены в качестве предварительного условия для объяснения этих советов.
Сведения о XInput и DirectInput
Несмотря на то, что он ограничен Windows, существует два формата подключения игровых контроллеров: «DirectInput» и «XInput». "Джойстик" здесь соответствует "DirectInput".
В Joystick
этой программе мы имеем дело с классом, но он может работать только с контроллерами, поддерживающими "DirectInput".
Чтобы использовать контроллер, поддерживающий "XInput", необходимо использовать другой Gamepad
класс.
"DirectInput" - это старый формат подключения, и определение кнопок относительно неоднозначно, и он может работать с контроллерами со специальными формами. Однако в последнее время "XInput" стал мейнстримом, и количество контроллеров, не поддерживающих "DirectInput", увеличивается. Поскольку "DirectInput" определяет кнопки как "1", "2" и "3", создатели игр должны создать систему, которая позволяет соответствующим образом установить соответствие кнопок игры и контроллера.
"XInput" определяется как следующее поколение "DirectInput" и имеет предопределенные кнопки A и B, триггеры, джойстики и т.д. Поэтому можно использовать только форму контроллера, которая практически фиксирована. Поскольку определение кнопок четко определено, создатели игр могут создавать игры, соответствующие контроллеру, не беспокоясь о размещении кнопок. Все большее число современных игровых контроллеров совместимы только с "XInput".
О джойстиках
Как уже было сказано выше, определения кнопки нет, поэтому для того, чтобы реально ею пользоваться, необходимо добавить хлопотные процессы, такие как назначение игровых операций при изучении информации каждой кнопки. Я не думаю, что вам нужно использовать DirectInput в новой игре, потому что он старый, но имейте в виду, что если вы действительно хотите его поддерживать, ваша программа может быть сложной.
Этот пример в основном ограничивается получением информации по перечисленным кнопкам.
name
По сути, нужно проверять и назначать операции.
Сбор информации с помощью джойстика
Разместите текстовый объект для отображения информации о каждой кнопке на джойстике.
Создайте сценарий. Название произвольное, но в данном случае JoystickInfo
это .
Скрипт выглядит следующим образом: Получаемая информация зависит от типа контроллера. Очень сложно запрограммировать для каждого контроллера, поэтому я просто перечисляю все кнопки и получаю информацию о типе кнопки и нажатии.
using System.Text;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.UI;
public class JoystickInfo : 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 joystick = Joystick.current;
if (joystick == null)
{
Debug.Log("ジョイスティックがありません。");
TextObject.text = "";
return;
}
Builder.Clear();
// ジョイスティックの情報取得
Builder.AppendLine($"deviceId:{joystick.deviceId}");
Builder.AppendLine($"name:{joystick.name}");
Builder.AppendLine($"displayName:{joystick.displayName}");
// ジョイスティックにはボタンの大部分が定義されていないので
// 基本的には allControls で列挙して入力の種類と値を確認していく
foreach (var key in joystick.allControls)
{
if (key is StickControl stick)
{
if (stick.up.isPressed) Builder.AppendLine($"{key.name} Up");
if (stick.down.isPressed) Builder.AppendLine($"{key.name} Down");
if (stick.left.isPressed) Builder.AppendLine($"{key.name} Left");
if (stick.right.isPressed) Builder.AppendLine($"{key.name} Right");
var value = stick.ReadValue();
if (value.magnitude > 0f)
{
Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
}
}
else if (key is Vector2Control vec2)
{
var value = vec2.ReadValue();
if (value.magnitude > 0f)
{
Builder.AppendLine($"{key.name}:{value.normalized * value.magnitude}");
}
if (vec2.x.ReadValue() != 0f)
{
Builder.AppendLine($"{key.name}.x:{vec2.x.ReadValue()}");
}
if (vec2.y.ReadValue() != 0f)
{
Builder.AppendLine($"{key.name}.x:{vec2.y.ReadValue()}");
}
}
else if (key is ButtonControl button)
{
if (button.isPressed) Builder.AppendLine($"{key.name} isPress");
var value = button.ReadValue();
if (value != 0f)
{
Builder.AppendLine($"{key.name}:{value}");
}
}
else if (key is AxisControl axis)
{
if (axis.IsPressed()) Builder.AppendLine($"{key.name} isPress");
var value = axis.ReadValue();
if (value != 0f)
{
Builder.AppendLine($"{key.name}:{value}");
}
}
else
{
Builder.AppendLine($"Type={key.GetType()}");
}
}
// 押しているボタン一覧をテキストで表示
TextObject.text = Builder.ToString();
}
}
Получить информацию Joystick.current
о подключенном джойстике можно в формате .
Joystick
После этого мы получим каждую информацию из класса.
Joystick
Как видно из класса, есть определения, такие как и , но нет определений, stick
trigger
таких как кнопка A или кнопка запуска.
Поэтому следует использовать Свойства, чтобы перечислить все кнопки, стики,allControls
а также узнать тип кнопки и информацию о нажатии.
После того, как скрипт будет сохранен, EventSystem
прикрепите его и установите текстовый объект для отображения информации.
Попробуйте запустить игру с помощью контроллера, поддерживающего DirectInput. Каждый фрагмент информации может быть извлечен.
В зависимости от контроллера, вы можете получить не нужное значение при нажатии джойстика, клавиши со стрелкой и т. д. Поскольку кнопки не определены таким образом, трудно получить точную информацию о нажатии для каждой кнопки. Кроме того, видно, что полноценно поддерживать джойстик довольно сложно, например, расположение кнопок отличается в зависимости от контроллера.
Если игра будет поддерживать джойстики, было бы желательно иметь экран настроек, похожий на конфигурацию клавиш, чтобы каждый пользователь мог настроить расположение кнопок имеющегося у него контроллера.
Как получить информацию для нескольких джойстиков
Информацию обо Joystick.all
всех подключенных джойстиках можно получить в формате .
ReadOnlyArray
Его foreach
можно перечислить и так далее.
Так как каждое значение является Joystick
классом, вы можете получить информацию о джойстике, как и в предыдущей программе.