Dynamické nastavenie mapy akcií

Stránka aktualizovaná :
Dátum vytvorenia strany :

Prostredie overovania

Windows
  • Windows 11
Editor jednoty
  • 2020.3.25f1
Vstupný systémový balík
  • 1.2.0

Predpoklady pre tento tip

Nasledujúce nastavenia boli vykonané vopred ako predpoklad pre popis tohto tipu.

Mali by ste byť tiež oboznámení s nasledujúcimi tipmi:

Konfigurácia dynamickej mapy akcií

Je bežné vopred pridávať a nastavovať akčné mapy do projektu, V tomto prípade sú priradenia tlačidiel ovládača pevne stanovené počas vykonávania hry a používateľ ich nemôže počas hry voľne meniť. Očakáva sa to hlavne pri hrách, ktoré vyžadujú konfiguráciu kľúča.

Tento tip popisuje, ako ľubovoľne zmeniť kľúčové priradenia mapy akcií v skripte.

Manipulácia so zmenami dynamickej akčnej mapy

Tentoraz je počiatočná akčná mapa tiež nastavená skriptom a zmena mapy akcií v strede sa tiež vykonáva v skripte. Myslím, že táto metóda sa používa pri načítaní a nastavení konfigurácie kľúča uloženej pri spustení hry.

Obsahom ukážky je zmena priradenia klávesov mapy akcií po stlačení tlačidla a zobrazenie ovládaného obsahu ako textu. Umiestnenie tlačidiel a zobrazený text sú usporiadané tak, ako je to znázornené na obrázku, ale nie sú veľmi dôležité, preto ich voľne umiestňujte.

Proces počiatočnej konfigurácie mapy akcií

Vytvorte skript. Názov je ľubovoľný, ale v tomto prípade InputActionMap je to . Tentokrát tu budú popísané všetky procesy, ale v samotnej výrobe ich prosím rozdeľte podľa tvorby projektu.

Skript vyzerá takto: Najprv pri spustení vytvorte predvolenú mapu akcií.

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

Najprv definujte toľko akcií v triede, koľko InputAction chcete implementovať v teréne. Tu pripravíme polia pre "Move" a "Attack", ktoré boli použité aj vo vysvetlení predchádzajúcej akčnej mapy. Ak sa počet akcií zvýši, musíte tento počet deklarovať, ale ak ich je List Dictionary veľa, môžete ich spravovať pomocou , , atď. Nepoužíva sa tu, ale ak máte vlastnú InputActionMap triedu, môžete ju tam spravovať.

Vykoná sa inštancia a priradenie AddBinding kľúča metódou nazývanou InputAction Awake pri inicializácii. To, čo robíte, si môžete predstaviť ako program, ktorý pridáva väzbu na obrazovku nastavenia mapy akcií. AddBinding Reťazec zadaný pre metódu atď. je rovnaký ako reťazec zobrazený v časti Cesta na obrazovke nastavenia mapy akcií. Ak chcete zobraziť reťazec znakov, stlačte tlačidlo "T" vpravo.

Spracovanie udalostí vyvolaných pri stlačení tlačidla je rovnaké ako spracovanie skriptovanej verzie normálnej akčnej mapy. Proces spätného volania je tiež odklonený tak, ako 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}";
}

Povoliť, Zakázať je InputAction jednotka, takže popíšte toľko akcií, koľko chcete. Ak je to nepríjemné, môžete to List zvládnuť s atď.

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

Po EventSystem uložení skriptu ho priložte a nakonfigurujte textový objekt na zobrazenie.

Spustite hru a skontrolujte, či sa zobrazia vstupné informácie. Výsledok by mal byť rovnaký ako skriptovaná verzia statického procesu mapy akcií.

Spracovanie dynamických zmien mapy akcií

Keďže dynamická zmena mapy akcií sa vykonáva po stlačení tlačidla, definujte metódu, ktorá sa vyvolá po stlačení tlačidla. OnClickButton Zatiaľ to necháme ako .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Nastaví udalosť kliknutia na tlačidlo.

Proces prepisovania akčnej mapy je nasledujúci:

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

Keďže pre ApplyBindingOverride každú akciu je k dispozícii metóda, cesta path klávesu alebo tlačidla, ktoré bolo inicializované na , overridePath Napíšte cestu ku klávesu alebo tlačidlu, ktoré chcete prepísať.

Mimochodom, toto je len nastavenie cesty prepísania, takže pôvodná cesta zostáva taká, aká je. Napríklad v akcii Útok zmeňte kláves z na medzerník. Okrem toho, ak chcete zmeniť medzeru na x kľúč, popis bude prepísaný pre kláves z namiesto medzery nasledovne.

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

Po uložení spustite hru a kliknutím na tlačidlo skontrolujte, či sa klávesy alebo tlačidlá, s ktorými pracujete, zmenia.

InputAction Tentokrát meníme akčnú mapu pre tú, ktorá vytvorila inštanciu , K dispozícii je tiež InputAction skript generovaný nastavením akčnej mapy grafického používateľského rozhrania, takže ho implementujte do toho, ktorý je ľahko vykonateľný.