Toimintokartan määrittäminen dynaamisesti

Sivu päivitetty :
Sivun luontipäivämäärä :

Varmennusympäristö

Windows
  • Windows 11
Unity-editori
  • 2020.3.25F1
Syöttöjärjestelmän paketti
  • 1.2.0

Tämän vinkin edellytykset

Seuraavat asetukset on tehty etukäteen tämän vinkin kuvauksen lähtökohtana.

Sinun tulisi myös tuntea seuraavat vinkit:

Tietoja dynaamisen toimintokartan määrityksestä

On tavallista lisätä ja asettaa toimenpidekarttoja projektiin etukäteen, Tässä tapauksessa ohjaimen painikkeiden määritykset vahvistetaan pelin suorittamisen aikana, eikä käyttäjä voi muuttaa niitä vapaasti pelin aikana. Tätä odotetaan pääasiassa peleissä, jotka vaativat avainkokoonpanoa.

Tässä vihjeessä kuvataan, miten komentosarjan toimintokartan keskeisiä määrityksiä muutetaan mielivaltaisesti.

Dynaaminen toimintakartta Muutosten käsittely

Tällä kertaa käsikirjoitus asettaa myös alustavan toimintakartan, ja keskellä oleva toimintakartan muutos tehdään myös käsikirjoituksessa. Mielestäni tätä menetelmää käytetään ladattaessa ja asetettaessa pelin käynnistyksen yhteydessä tallennettua avaimen kokoonpanoa.

Näytteen sisällön tarkoituksena on muuttaa toimintokartan näppäinmääritystä, kun painat painiketta, ja näyttää käytetty sisältö tekstinä. Painikkeiden sijoittelu ja näyttöteksti on järjestetty kuvan osoittamalla tavalla, mutta ne eivät ole kovin tärkeitä, joten sijoita ne vapaasti.

Toimintakartan alkumääritysprosessi

Luo komentosarja. Nimi on mielivaltainen, mutta tässä tapauksessa InputActionMap se on . Tällä kertaa kaikki prosessit kuvataan tässä, mutta varsinaisessa tuotannossa jaa ne projektin luomisen mukaan.

Skripti näyttää tältä: Luo ensin oletustoimintokartta käynnistyksen yhteydessä.

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

Määritä ensin luokalle niin monta toimintoa kuin InputAction haluat toteuttaa kentällä. Tässä valmistelemme kentät "Siirrä" ja "Hyökkäys", joita käytettiin myös edellisessä toimintakartan selityksessä. Jos toimintojen määrä kasvaa, sinun on ilmoitettava tämä numero, mutta jos niitä on List Dictionary paljon, voit hallita niitä , jne. Sitä ei käytetä täällä, mutta jos sinulla on oma InputActionMap luokka, voit hallita sitä siellä.

Instantiation ja avaimen määritys AddBinding alustuksen yhteydessä kutsutussa InputAction Awake menetelmässä suoritetaan. Voit ajatella, mitä olet tekemässä, ohjelmana, joka lisää sidonnan toimintakartan asetusnäyttöön. AddBinding Metodille jne. määritetty merkkijono on sama kuin toimintokartan asetusnäytössä Polku-kohdassa näkyvä merkkijono. Voit näyttää merkkijonon painamalla oikealla olevaa T-painiketta.

Painikkeen käytön yhteydessä kutsuttu tapahtumien käsittely on sama kuin normaalin toimintokartan komentosarjaversion käsittely. Myös takaisinsoittoprosessi ohjataan sellaisenaan.

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

Ota käyttöön, poista käytöstä on InputAction yksikkö, joten kuvaile niin monta toimintoa kuin haluat. Jos se on hankala, voit hallita sitä List jne.

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

Kun EventSystem olet tallentanut komentosarjan, liitä se tekstiobjektiin ja määritä se näytettäväksi.

Suorita peli ja katso, näkyvätkö syöttötiedot. Tuloksen on oltava sama kuin toimintakartan staattisen prosessin komentosarjaversio.

Toimintakartan dynaaminen muutoskäsittely

Koska toimintakartan dynaaminen muutos tapahtuu, kun painiketta painetaan, määritä menetelmä, jota kutsutaan, kun painiketta painetaan. OnClickButton Toistaiseksi jätämme sen .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Määrittää painikkeen klikkaustapahtuman.

Toimintakartan uudelleenkirjoitusprosessi on seuraava:

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

Koska jokaiselle toiminnolle ApplyBindingOverride on annettu menetelmä, sen avaimen tai painikkeen path polku, joka alustettiin arvoon , overridePath Kirjoita ohitettavan avaimen tai painikkeen polku.

Muuten, tämä on vain korvauspolun asettaminen, joten alkuperäinen polku pysyy sellaisenaan. Vaihda esimerkiksi hyökkäystoiminnossa z-näppäin välilyöntiin. Lisäksi, jos haluat vaihtaa välilyönnistä x-näppäimeen, kuvaus korvataan z-näppäimelle välilyönnin sijaan seuraavasti.

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

Kun olet tallentanut, suorita peli ja napsauta painiketta nähdäksesi, muuttuvatko käyttämäsi näppäimet tai painikkeet.

InputAction Tällä kertaa muutamme toimintakarttaa sille, joka loi esiintymän , Graafisen käyttöliittymän toimintakartta-asetuksella luodaan myös InputAction komentosarja, joten ota se käyttöön helposti tehtävässä.