Dinamično nastavitev akcijskega zemljevida

Stran posodobljena :
Datum ustvarjanja strani :

Okolje za preverjanje

Windows
  • Windows 11
Urejevalnik enotnosti
  • 2020.3.25f1
Paket vhodnega sistema
  • 1.2.0

Predpogoji za to konico

Naslednje nastavitve so bile vnaprej narejene kot predpostavka za opis tega namiga.

Seznaniti se morate tudi z naslednjimi nasveti:

O konfiguraciji dinamičnega zemljevida dejanj

V projekt je običajno vnaprej dodajati in nastaviti akcijske zemljevide, V tem primeru so dodelitve gumbov krmilnika določene med igro in jih uporabnik med igro ne more prosto spremeniti. To se pričakuje predvsem za igre, ki zahtevajo konfiguracijo ključa.

Ta namig opisuje, kako poljubno spremeniti ključne dodelitve akcijskega zemljevida v skriptu.

Dinamično ravnanje z zemljevidom dejanj

Tokrat je začetni akcijski zemljevid nastavljen tudi po skriptu, sprememba akcijskega zemljevida na sredini pa je narejena tudi v skriptu. Mislim, da se ta metoda uporablja pri nalaganju in nastavitvi konfiguracije ključa, shranjene ob zagonu igre.

Vsebina vzorca je, da spremenite dodelitev ključa na akcijski zemljevid, ko pritisnete gumb in prikažete upravljano vsebino kot besedilo. Namestitev gumba in besedilo prikaza sta urejena, kot je prikazano na sliki, vendar nista zelo pomembna, zato jih prosimo, da jih prosto postavite.

Postopek začetne konfiguracije akcijskega zemljevida

Ustvarite skript. Ime je samovoljno, v tem primeru InputActionMap pa je . Tokrat bodo tukaj opisani vsi postopki, vendar jih v dejanski proizvodnji razdelite glede na oblikovanje projekta.

Scenarij izgleda takole: Najprej ustvarite privzeti akcijski zemljevid ob zagonu.

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

Najprej določite toliko dejanj v InputAction razredu, kot jih želite izvajati v polju. Tukaj bomo pripravili polja za "Move" in "Attack", ki so bila uporabljena tudi v prejšnji razlagi akcijskega zemljevida. Če se število dejanj poveča, morate to številko prijaviti, List Dictionary če pa jih je veliko, jih lahko upravljate z , itd. Tu ga ne uporabljate, InputActionMap če pa imate svoj razred, ga lahko tam upravljate.

Izvede se vnašanja AddBinding in InputAction Awake dodelitev ključa v načinu, imenovanem ob inicializaciji. To, kar počnete, lahko pomislite kot na program, ki doda vezavo na zaslonu nastavitve akcijskega zemljevida. AddBinding Niz, določen za Metodo itd., je enak nizu, prikazanem v poti na zaslonu nastavitve akcijskega zemljevida. Če želite prikazati niz znakov, pritisnite gumb "T" na desni strani.

Ravnanje z dogodki, poklicano ob uporabi gumba, je enako obdelavi skriptne različice običajnega akcijskega zemljevida. Tudi postopek povratnega klica je preusmeren.

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

Omogoči, Onemogoči je enota InputAction , zato opišite toliko dejanj, kot želite. Če je težavno, ga lahko upravljate List z itd.

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

Ko skript EventSystem shranite, ga priložite in konfigurirajte besedilni predmet za prikaz.

Zaženite igro in preverite, ali se prikažejo vhodni podatki. Rezultat mora biti enak skriptni različici statičnih procesov akcijskega zemljevida.

Obdelava dinamičnih sprememb na zemljevidu dejanja

Ker se dinamična sprememba akcijskega zemljevida opravi, ko pritisnete gumb, določite način, ki se bo imenoval, ko pritisnete gumb. OnClickButton Za zdaj ga bomo pustili kot.

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Nastavitev dogodka klika za gumb.

Postopek prepisovanja akcijskega zemljevida je naslednji:

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

Ker je določena metoda ApplyBindingOverride za vsako dejanje, path je pot ključa ali gumba, ki je bil inicializiran na , overridePath Napišite pot ključa ali gumba, ki ga želite preglasiti.

Mimogrede, to je samo nastavitev poti prepisovanja, tako da prvotna pot ostane taka, kot je. V dejanju Napad na primer spremenite tipko z v preslednico. Poleg tega, če želite spremeniti iz prostora v x ključ, bo opis prepisano za tipko z namesto na podlagi prostora, kot sledi.

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

Ko shranite, zaženite igro in kliknite gumb, da preverite, ali tipke ali gumbi, ki jih interakcijo s spremembo.

InputAction Tokrat spreminjamo akcijski zemljevid za tisti, ki je ustvaril primerek , Obstaja tudi skript, InputAction ki ga ustvari nastavitev akcijskega zemljevida GUI, zato ga prosimo, da ga izvajate v tisti, ki je enostaven za narediti.