Configurarea dinamică a unei hărți de acțiuni

Pagina actualizată :
Data creării paginii :

Mediul de verificare

Windows
  • Ferestre 11
Unity Editor
  • 2020.3.25F1
Pachet sistem de intrare
  • 1.2.0

Cerințe preliminare pentru acest sfat

Următoarele setări au fost făcute în avans ca premisă pentru descrierea acestui sfat.

De asemenea, trebuie să cunoașteți următoarele sfaturi:

Despre configurarea hărții de acțiuni dinamice

Este obișnuit să adăugați și să setați hărți de acțiune la proiect în avans, În acest caz, alocările butoanelor controlerului sunt fixate în timpul executării jocului și nu pot fi modificate în mod liber de către utilizator în timpul jocului. Acest lucru este de așteptat în principal pentru jocurile care necesită configurare cheie.

Acest sfat descrie modul de modificare arbitrară a atribuirilor cheie ale unei hărți de acțiuni într-un script.

Gestionarea modificărilor hărții dinamice de acțiune

De data aceasta, harta de acțiune inițială este, de asemenea, setată de script, iar modificarea hărții de acțiune din mijloc se face și în script. Cred că această metodă este utilizată la încărcarea și setarea configurației cheii salvate la pornirea jocului.

Conținutul eșantionului trebuie să modifice atribuirea tastelor hărții de acțiuni atunci când apăsați butonul și să afișeze conținutul operat ca text. Plasarea butoanelor și textul afișat sunt aranjate așa cum se arată în figură, dar nu sunt foarte importante, așa că vă rugăm să le plasați liber.

Procesul inițial de configurare a hărții de acțiune

Creați un script. Numele este arbitrar, dar în acest caz InputActionMap este . De data aceasta, toate procesele vor fi descrise aici, dar în producția efectivă, vă rugăm să le împărțiți în funcție de crearea proiectului.

Scenariul arată astfel: Mai întâi, creați o hartă de acțiune implicită la pornire.

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

În primul rând, definiți câte acțiuni din clasă doriți să implementați InputAction pe teren. Aici, vom pregăti câmpurile pentru "Mutare" și "Atac", care au fost folosite și în explicația anterioară a hărții de acțiune. Dacă numărul de acțiuni crește, trebuie să declarați acel număr, dar dacă sunt List Dictionary multe, le puteți gestiona cu , , etc. Nu este folosit aici, dar dacă aveți propria InputActionMap clasă, o puteți gestiona acolo.

Se efectuează instanțierea și atribuirea AddBinding cheilor în InputAction metoda numită Awake inițializare. Vă puteți gândi la ceea ce faceți ca la un program care adaugă o legătură pe ecranul de setare a hărții de acțiuni. AddBinding Șirul specificat pentru Metodă etc. este același cu șirul afișat în Cale pe ecranul de setare a hărții de acțiune. Pentru a afișa un șir de caractere, apăsați butonul "T" din dreapta.

Gestionarea evenimentelor apelată atunci când este operat un buton este aceeași cu procesarea versiunii scriptate a unei hărți de acțiune normale. Procesul de apelare inversă este, de asemenea, deviat așa cum este.

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

Activare, Dezactivare este InputAction o unitate, deci descrieți câte acțiuni doriți. Dacă este supărător, îl List puteți gestiona cu etc.

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

După ce EventSystem salvați scriptul, atașați-l și configurați un obiect text pentru afișare.

Rulați jocul și vedeți dacă apar informațiile de intrare. Rezultatul ar trebui să fie același cu versiunea scriptată a procesului static al hărții de acțiune.

Harta de acțiune Procesarea dinamică a schimbărilor

Deoarece modificarea dinamică a hărții de acțiune se face atunci când este apăsat butonul, definiți metoda care va fi apelată la apăsarea butonului. OnClickButton Deocamdată, o vom lăsa ca .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Setează evenimentul de clic pentru buton.

Procesul de rescriere a hărții de acțiune este următorul:

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

Deoarece este prevăzută o metodă pentru ApplyBindingOverride fiecare acțiune, calea tastei sau a butonului care a fost inițializată în , path overridePath Scrieți calea tastei sau a butonului pe care doriți să îl înlocuiți.

Apropo, aceasta este doar setarea căii de suprascriere, astfel încât calea originală rămâne așa cum este. De exemplu, într-o acțiune Atac, schimbați tasta z pe bara de spațiu. În plus, dacă doriți să treceți de la tasta spațiu la tasta x, descrierea va fi suprascrisă pentru tasta z în loc să se bazeze pe spațiu, după cum urmează.

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

Odată salvat, rulați jocul și faceți clic pe buton pentru a vedea dacă tastele sau butoanele cu care interacționați se schimbă.

InputAction De data aceasta, schimbăm harta de acțiune pentru cea care a creat o instanță de , Există, de asemenea, InputAction un script generat de setarea hărții de acțiune a interfeței grafice, așa că vă rugăm să îl implementați într-unul ușor de făcut.