Dynamiczne konfigurowanie mapy działania

Strona zaktualizowana :
Data utworzenia strony :

Środowisko weryfikacji

Windows
  • Okna 11
Edytor Unity
  • 2020.3.25f1
Pakiet systemu wejściowego
  • 1.2.0

Wymagania wstępne dotyczące tej porady

Poniższe ustawienia zostały wcześniej wprowadzone jako przesłanka do opisu tej wskazówki.

Powinieneś również zapoznać się z następującymi wskazówkami:

Informacje o konfiguracji dynamicznej mapy działań

Powszechne jest dodawanie i ustawianie map działań do projektu z wyprzedzeniem, W takim przypadku przypisania przycisków kontrolera są ustalane podczas wykonywania gry i nie mogą być dowolnie zmieniane przez użytkownika podczas gry. Jest to oczekiwane głównie w przypadku gier, które wymagają konfiguracji klucza.

W tej poradze opisano, jak dowolnie zmieniać przypisania mapy akcji w skrypcie.

Obsługa zmian na dynamicznej mapie działania

Tym razem początkowa mapa akcji jest również ustawiana przez skrypt, a zmiana mapy akcji w środku jest również wykonywana w skrypcie. Myślę, że ta metoda jest używana podczas ładowania i ustawiania konfiguracji klucza zapisanej podczas uruchamiania gry.

Zawartość przykładu ma na celu zmianę przypisania mapy akcji po naciśnięciu przycisku i wyświetlenie obsługiwanej zawartości jako tekstu. Rozmieszczenie przycisków i wyświetlany tekst są ułożone tak, jak pokazano na rysunku, ale nie są one bardzo ważne, więc prosimy o ich swobodne umieszczanie.

Proces wstępnej konfiguracji mapy działania

Utwórz skrypt. Nazwa jest arbitralna, ale w tym przypadku InputActionMap jest . Tym razem wszystkie procesy zostaną opisane tutaj, ale w rzeczywistej produkcji podziel je według stworzenia projektu.

Skrypt wygląda tak: Najpierw utwórz domyślną mapę akcji podczas uruchamiania.

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}";
  }
}

Najpierw zdefiniuj tyle akcji w klasie, ile chcesz InputAction zaimplementować w polu. Tutaj przygotujemy pola dla "Move" i "Attack", które zostały również wykorzystane w poprzednim wyjaśnieniu mapy akcji. Jeśli liczba akcji wzrośnie, musisz zadeklarować tę liczbę, ale jeśli jest List Dictionary ich wiele, możesz nimi zarządzać za pomocą , , itp. Nie jest tutaj używany, ale jeśli masz własną InputActionMap klasę, możesz nią zarządzać.

Wykonywane są wystąpienia i przypisywanie AddBinding kluczy w metodzie wywoływanej Awake InputAction podczas inicjalizacji. Możesz myśleć o tym, co robisz, jako o programie, który dodaje powiązanie na ekranie ustawień mapy akcji. AddBinding Ciąg określony dla metody itp. jest taki sam jak ciąg wyświetlany w polu Ścieżka na ekranie ustawień mapy akcji. Aby wyświetlić ciąg znaków, naciśnij przycisk "T" po prawej stronie.

Obsługa zdarzeń wywoływana podczas działania przycisku jest taka sama jak przetwarzanie skryptowej wersji normalnej mapy akcji. Proces wywołania zwrotnego jest również przekierowywany w obecnej postaci.

// 操作時のイベントを設定
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}";
}

Włącz, Wyłącz jest InputAction jednostką, więc opisz tyle akcji, ile chcesz. Jeśli jest to kłopotliwe, możesz sobie z tym List poradzić itp.

private void OnEnable()
{
  // オブジェクトが有効になったときにアクションマップを有効にする
  MoveAction.Enable();
  AttackAction.Enable();
}

Po EventSystem zapisaniu skryptu dołącz go do obiektu tekstowego i skonfiguruj go do wyświetlania.

Uruchom grę i sprawdź, czy pojawią się informacje wejściowe. Wynik powinien być taki sam, jak w wersji skryptowej statycznego procesu mapy akcji.

Dynamiczne przetwarzanie zmian na mapie akcji

Ponieważ dynamiczna zmiana mapy akcji odbywa się po naciśnięciu przycisku, zdefiniuj metodę, która zostanie wywołana po naciśnięciu przycisku. OnClickButton Na razie zostawimy to jako .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

  /// <summary>
  /// ボタンをクリックしたときに呼ばれる。
  /// </summary>
  public void OnClickButton()
  {
  }
}

Ustawia zdarzenie click dla przycisku.

Proces przepisywania mapy działania jest następujący:

/// <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" });
}

Ponieważ dla ApplyBindingOverride każdej akcji jest dostępna metoda, ścieżka klucza lub przycisku, który został zainicjowany do , path overridePath Napisz ścieżkę lub przycisku, który chcesz zastąpić.

Nawiasem mówiąc, jest to tylko ustawienie ścieżki nadpisywania, więc oryginalna ścieżka pozostaje taka, jaka jest. Na przykład w akcji Atak zmień z na spację. Ponadto, jeśli chcesz zmienić spację na x, opis zostanie nadpisany dla z zamiast na podstawie spacji, w następujący sposób.

AttackAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/z", overridePath = "<Keyboard>/x" });

Po zapisaniu uruchom grę i kliknij przycisk, aby sprawdzić, czy lub przyciski, z którymi wchodzisz w interakcję, zmieniają się.

InputAction Tym razem zmieniamy mapę działania dla tej, która utworzyła instancję , Istnieje również InputAction skrypt generowany przez ustawienie mapy działania GUI, więc zaimplementuj go w tym, który jest łatwy do zrobienia.