Динамично настройване на карта на действия

Страницата се актуализира :
Дата на създаване на страница :

Среда за проверка

Уиндоус
  • Прозорци 11
Редактор на единство
  • 2020.3.25ф1
Пакет на входната система
  • 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 Низът, зададен за Метод и т.н., е същият като низа, показан в Път на екрана за настройка на картата на действията. За да покажете низ от знаци, натиснете бутона "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 скрипт, генериран от настройката на картата на действие на графичния интерфейс, така че моля, внедрете го в този, който е лесен за изпълнение.