Динамическая настройка карты действий
Среда верификации
- Виндоус
-
- Windows 11
- Редактор Unity
-
- 2020.3.25f1
- Входной системный пакет
-
- 1.2.0
Предпосылки для этого совета
Следующие настройки были сделаны заранее в качестве предпосылки для описания этого совета.
Вы также должны быть знакомы со следующими советами:
О настройке динамической карты действий
Обычно в проект заранее добавляют и устанавливают карты действий, В этом случае назначения кнопок контроллера фиксируются во время выполнения игры и не могут свободно изменяться пользователем во время игры. В основном это ожидается для игр, требующих настройки ключей.
В этом совете описывается, как произвольно изменять назначения клавиш карты действий в скрипте.
Динамическая обработка изменений карты действий
На этот раз начальная карта действий также задается сценарием, и изменение карты действий в середине также выполняется в сценарии. Я думаю, что этот метод используется при загрузке и настройке конфигурации ключа, сохраненной при запуске игры.
Содержимое примера предназначено для изменения назначения клавиш карты действий при нажатии кнопки и отображения обрабатываемого содержимого в виде текста. Расположение кнопок и отображаемый текст расположены так, как показано на рисунке, но они не очень важны, поэтому, пожалуйста, размещайте их свободно.
Процесс начальной настройки карты действий
Создайте сценарий. Название произвольное, но в данном случае InputActionMap
это .
На этот раз все процессы будут описаны здесь, но в фактическом производстве, пожалуйста, разделите их в соответствии с созданием проекта.
Скрипт выглядит следующим образом: Во-первых, создайте карту действий по умолчанию при запуске.
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public class InputActionMap : MonoBehaviour
{
<summary>情報を表示させるテキストオブジェクト。</summary>
[SerializeField] private Text TextObject;
<summary>Move アクション用の定義。</summary>
public InputAction MoveAction { get; set; }
<summary>Attack アクション用の定義。</summary>
public InputAction AttackAction { get; set; }
private void Awake()
{
// Move アクションの作成
MoveAction = new InputAction("Move");
// バインド(キー割り当て)の追加
// 設定する文字列の形式はアクションマップ設定画面の Path に表示される文字列となる
MoveAction.AddBinding("<Gamepad>/leftStick");
// キーボードに上下左右を割り当てるにはコンポジットの 2DVector を設定する
MoveAction.AddCompositeBinding("2DVector")
.With("Up", "<Keyboard>/upArrow")
.With("Down", "<Keyboard>/downArrow")
.With("Left", "<Keyboard>/leftArrow")
.With("Right", "<Keyboard>/rightArrow");
// Attack アクションの作成
AttackAction = new InputAction("Attack");
// バインド(キー割り当て)の追加
AttackAction.AddBinding("<Gamepad>/buttonSouth");
AttackAction.AddBinding("<Keyboard>/z");
// 操作時のイベントを設定
MoveAction.performed += context => OnMove(context);
MoveAction.canceled += context => OnMove(context);
AttackAction.performed += context => OnAttack(context);
AttackAction.canceled += context => OnAttack(context);
}
private void OnEnable()
{
// オブジェクトが有効になったときにアクションマップを有効にする
MoveAction.Enable();
AttackAction.Enable();
}
private void OnDisable()
{
// アクションマップが誤動作しないようにオブジェクト終了時に無効にする
MoveAction.Disable();
AttackAction.Disable();
}
<summary>
Move 操作を行ったときに呼ばれる。
</summary>
<param name="context">コールバック内容。</param>
public void OnMove(InputAction.CallbackContext context)
{
var vec = context.ReadValue<Vector2>();
TextObject.text = $"Move:({vec.x:f2}, {vec.y:f2})\n{TextObject.text}";
}
<summary>
Move 操作を行ったときに呼ばれる。
</summary>
<param name="context">コールバック内容。</param>
public void OnAttack(InputAction.CallbackContext context)
{
var value = context.ReadValueAsButton();
TextObject.text = $"Attack:{value}\n{TextObject.text}";
}
}
Во-первых, определите столько действий в классе, сколько вы InputAction
хотите реализовать в поле.
Здесь мы подготовим поля для «Перемещения» и «Атаки», которые также использовались в предыдущем объяснении карты действий.
Если количество действий увеличивается, вам нужно объявить это число, но если их List
Dictionary
много, вы можете управлять ими с помощью , и т. Д.
Здесь он не используется, но если у вас есть свой InputActionMap
класс, вы можете управлять им там.
Выполняется создание экземпляра и назначение AddBinding
ключей в методе, вызываемом InputAction
Awake
при инициализации.
Вы можете думать о том, что вы делаете, как о программе, которая добавляет привязку к экрану настройки карты действий.
AddBinding
Строка, указанная для параметра Method и т. д., совпадает со строкой, отображаемой в поле Path на экране настройки карты действий.
Чтобы отобразить строку символов, нажмите кнопку «T» справа.
Обработка событий, вызываемых при работе с кнопкой, аналогична обработке скриптовой версии обычной карты действий. Процесс обратного вызова также перенаправлен как есть.
// 操作時のイベントを設定
MoveAction.performed += context => OnMove(context);
MoveAction.canceled += context => OnMove(context);
AttackAction.performed += context => OnAttack(context);
AttackAction.canceled += context => OnAttack(context);
<summary>
Move 操作を行ったときに呼ばれる。
</summary>
<param name="context">コールバック内容。</param>
public void OnMove(InputAction.CallbackContext context)
{
var vec = context.ReadValue<Vector2>();
TextObject.text = $"Move:({vec.x:f2}, {vec.y:f2})\n{TextObject.text}";
}
Включить, отключить — это InputAction
единица, поэтому опишите столько действий, сколько хотите.
Если это хлопотно, вы можете справиться с этим List
с помощью и т. Д.
private void OnEnable()
{
// オブジェクトが有効になったときにアクションマップを有効にする
MoveAction.Enable();
AttackAction.Enable();
}
После EventSystem
сохранения сценария присоедините его к текстовому объекту и настройте его для отображения.
Запустите игру и посмотрите, появится ли входная информация. Результат должен совпадать со сценарной версией статического процесса карты действий.
Динамическая обработка изменений карты действий
Так как динамическое изменение карты действий происходит при нажатии кнопки, определите метод, который будет вызываться при нажатии кнопки.
OnClickButton
На данный момент мы оставим его как .
// 省略
public class InputActionMap : MonoBehaviour
{
// 省略
<summary>
ボタンをクリックしたときに呼ばれる。
</summary>
public void OnClickButton()
{
}
}
Задает событие щелчка для кнопки.
Процесс переписывания карты действий выглядит следующим образом:
<summary>
ボタンをクリックしたときに呼ばれる。
</summary>
public void OnClickButton()
{
TextObject.text = "アクションマップを変更しました。";
// Move アクションのキーを置き換える
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Gamepad>/leftStick", overridePath = "<Gamepad>/dpad" } );
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/upArrow", overridePath = "<Keyboard>/w" });
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/downArrow", overridePath = "<Keyboard>/s" });
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/leftArrow", overridePath = "<Keyboard>/a" });
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/rightArrow", overridePath = "<Keyboard>/d" });
// Attack アクションのキーを置き換える
AttackAction.ApplyBindingOverride(new InputBinding { path = "<Gamepad>/buttonSouth", overridePath = "<Gamepad>/buttonEast" });
AttackAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/z", overridePath = "<Keyboard>/space" });
}
Так как для ApplyBindingOverride
каждого действия предусмотрен метод, путь к ключу или кнопке, инициализированной в , path
overridePath
Напишите путь к клавише или кнопке, которую вы хотите переопределить.
Кстати, это всего лишь установка пути перезаписи, поэтому исходный путь остается как есть. Например, в действии «Атака» измените клавишу z на пробел. Кроме того, если вы хотите перейти с пробела на клавишу x, описание будет перезаписано для клавиши z, а не на основе пробела, как показано ниже.
AttackAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/z", overridePath = "<Keyboard>/x" });
После сохранения запустите игру и нажмите кнопку, чтобы увидеть, изменятся ли клавиши или кнопки, с которыми вы взаимодействуете.
InputAction
На этот раз мы меняем карту действий на ту, которая создала экземпляр ,
Существует также InputAction
сценарий, сгенерированный настройкой карты действий графического интерфейса, поэтому, пожалуйста, реализуйте его в том, что легко сделать.