Dynamické nastavení mapy akcí

Stránky aktualizovány :
Datum vytvoření stránky :

Ověřovací prostředí

Windows
  • Systém Windows 11
Editor jednoty
  • 2020.3.25f1
Vstupní systémový balíček
  • 1.2.0

Předpoklady pro tento tip

Následující nastavení byla provedena předem jako předpoklad pro popis tohoto tipu.

Měli byste se také seznámit s následujícími tipy:

O konfiguraci dynamické mapy akcí

Je běžné přidávat a nastavovat mapy akcí do projektu předem, V tomto případě je přiřazení tlačítek ovladače pevně stanoveno během provádění hry a uživatel je nemůže během hry volně měnit. To se očekává hlavně u her, které vyžadují klíčovou konfiguraci.

Tento tip popisuje, jak libovolně změnit přiřazení kláves mapy akcí ve skriptu.

Dynamické zpracování změn mapy akcí

Tentokrát je počáteční akční mapa také nastavena skriptem a změna mapy akcí uprostřed je také provedena ve skriptu. Myslím, že tato metoda se používá při načítání a nastavování konfigurace klíče uložené při spuštění hry.

Obsahem ukázky je změna přiřazení kláves mapy akcí při stisknutí tlačítka a zobrazení provozovaného obsahu jako textu. Umístění tlačítek a text zobrazení jsou uspořádány tak, jak je znázorněno na obrázku, ale nejsou příliš důležité, proto je prosím umístěte volně.

Proces počáteční konfigurace mapy akcí

Vytvořte skript. Název je libovolný, ale v tomto případě InputActionMap je . Tentokrát zde budou popsány všechny procesy, ale ve skutečné výrobě je prosím rozdělte podle vzniku projektu.

Skript vypadá takto: Nejprve při spuštění vytvořte výchozí mapu akcí.

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

Nejprve definujte tolik akcí ve třídě, kolik InputAction chcete implementovat v poli. Zde připravíme pole pro "Pohyb" a "Útok", která byla také použita v předchozím vysvětlení akční mapy. Pokud se počet akcí zvýší, musíte toto číslo deklarovat, ale pokud je List Dictionary jich mnoho, můžete je spravovat pomocí , atd. Nepoužívá se zde, ale pokud máte vlastní InputActionMap třídu, můžete ji spravovat tam.

Jsou provedeny instance a přiřazení AddBinding klíčů v metodě InputAction volané Awake při inicializaci. To, co děláte, si můžete představit jako program, který přidá vazbu na obrazovku nastavení mapy akcí. AddBinding Řetězec zadaný pro Method, atd. je stejný jako řetězec zobrazený v Path na obrazovce nastavení mapy akcí. Chcete-li zobrazit řetězec znaků, stiskněte tlačítko "T" vpravo.

Zpracování událostí volané při ovládání tlačítka je stejné jako zpracování skriptované verze normální mapy akcí. Proces zpětného volání je také odkloněn tak, jak je.

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

Povolit, Zakázat je InputAction jednotka, takže popište tolik akcí, kolik chcete. Pokud je to nepříjemné, můžete to List zvládnout s atd.

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

Po EventSystem uložení skriptu jej připojte k textovému objektu a nakonfigurujte jej pro zobrazení.

Spusťte hru a zjistěte, zda se zobrazí vstupní informace. Výsledek by měl být stejný jako skriptovaná verze statického procesu mapy akcí.

Dynamické zpracování změn mapy akcí

Vzhledem k tomu, že dynamická změna mapy akcí se provádí při stisknutí tlačítka, definujte metodu, která bude volána při stisknutí tlačítka. OnClickButton Prozatím to necháme jako .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Nastaví událost kliknutí pro tlačítko.

Proces přepsání mapy akcí je následující:

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

Vzhledem k tomu, že pro každou akci je k dispozici ApplyBindingOverride metoda, cesta path klávesy nebo tlačítka, které byly inicializovány na , overridePath Napište cestu ke klíči nebo tlačítku, které chcete přepsat.

Mimochodem, je to jen nastavení přepsání cesty, takže původní cesta zůstane tak, jak je. Například v akci útoku změňte klávesu z na mezerník. Dále, pokud chcete změnit z mezery na klávesu x, popis bude přepsán pro klávesu z namísto založené na prostoru, a to následujícím způsobem.

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

Po uložení spusťte hru a kliknutím na tlačítko zjistěte, zda se klávesy nebo tlačítka, se kterými pracujete, změní.

InputAction Tentokrát měníme mapu akcí pro tu, která vytvořila instanci , K dispozici je také InputAction skript generovaný nastavením mapy akcí GUI, takže jej prosím implementujte do toho, který je snadný.