Tegevuskaardi dünaamiline seadistamine

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kontrollimise keskkond

Windows
  • Windows 11
Ühtsuse toimetaja
  • 2020.3.25f1
Sisendsüsteemi pakett
  • 1.2.0

Selle näpunäite eeltingimused

Selle vihje kirjeldamise eelduseks on eelnevalt tehtud järgmised sätted.

Samuti peaksite olema tuttav järgmiste nõuandetega:

Teave dünaamilise tegevuskaardi konfiguratsiooni kohta

On tavaline, et projektile lisatakse ja seatakse tegevuskaardid ette, Sellisel juhul fikseeritakse kontrolleri nupu määramised mängu täitmise ajal ja kasutaja ei saa neid mängu ajal vabalt muuta. Seda oodatakse peamiselt mängude puhul, mis nõuavad võtme konfigureerimist.

Selles näpunäites kirjeldatakse, kuidas skriptis tegevuskaardi põhiülesandeid meelevaldselt muuta.

Dünaamiline tegevuskaardi muudatuste käsitlemine

Seekord määrab skript ka esialgse tegevuskaardi ja tegevuskaardi muutmine keskel toimub ka skriptis. Ma arvan, et seda meetodit kasutatakse mängu käivitamisel salvestatud võtmekonfiguratsiooni laadimisel ja seadistamisel.

Näidise sisu on muuta toimingukaardi põhimäärangut nupu vajutamisel ja kuvada kasutatav sisu tekstina. Nuppude paigutus ja kuvatekst on paigutatud nii, nagu joonisel näidatud, kuid need pole eriti olulised, nii et palun asetage need vabalt.

Tegevuskaardi esialgne konfiguratsiooniprotsess

Skripti loomine. Nimi on meelevaldne, kuid sel juhul InputActionMap on see . Seekord kirjeldatakse siin kõiki protsesse, kuid tegelikus tootmises jagage need vastavalt projekti loomisele.

Skript näeb välja selline: Esmalt looge käivitamisel vaiketoimingute kaart.

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

Esiteks määratlege klassis nii palju toiminguid, kui soovite InputAction põllul rakendada. Siin valmistame ette väljad "Liigu" ja "Rünnak", mida kasutati ka eelmises tegevuskaardi selgituses. Kui toimingute arv suureneb, peate selle arvu deklareerima, kuid kui neid on List Dictionary palju, saate neid hallata , jne. Seda siin ei kasutata, kuid kui teil on oma InputActionMap klass, saate seda seal hallata.

Initsialiseerimisel kutsutud Awake meetodis InputAction viiakse läbi instantiatsioon ja võtme määramine AddBinding . Võite mõelda, mida teete programmina, mis lisab tegevuskaardi seadistusekraanile köite. AddBinding Meetodi jne jaoks määratud string on sama, mis toimingukaardi seadistuskuval Path kuvatav string. Märgistringi kuvamiseks vajutage paremal asuvat nuppu "T".

Nupu kasutamisel kutsutav sündmusekäsitlus on sama, mis tavalise toimingukaardi skriptitud versiooni töötlemine. Tagasihelistamisprotsess suunatakse samuti ümber sellisena, nagu see on.

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

Luba, Keela on InputAction üksus, seega kirjeldage nii palju toiminguid kui soovite. Kui see on tülikas, saate sellega List hakkama jne.

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

Pärast EventSystem skripti salvestamist manustage see tekstiobjektile ja konfigureerige see kuvamiseks.

Käivitage mäng ja vaadake, kas sisendteave ilmub. Tulemus peaks olema sama, mis tegevuskaardi staatilise protsessi skriptitud versioon.

Tegevuskaart Dünaamiliste muudatuste töötlemine

Kuna tegevuskaardi dünaamiline muutmine toimub nupu vajutamisel, määratlege meetod, mida nupu vajutamisel kutsutakse. OnClickButton Praegu jätame selle nii.

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Määrab nupule klõpsamissündmuse.

Tegevuskaardi ümberkirjutamise protsess on järgmine:

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

Kuna iga toimingu jaoks ApplyBindingOverride on ette nähtud meetod, siis võtme või nupu tee, path mis initsialiseeriti , overridePath Kirjutage selle klahvi või nupu tee, mille soovite alistada.

Muide, see on lihtsalt ülekirjutamise tee seadmine, nii et algne tee jääb selliseks, nagu see on. Näiteks muutke rünnakutoimingus tühikuklahvi z. Lisaks, kui soovite vahetada tühikult x-klahvile, kirjutatakse kirjeldus z-klahvi jaoks üle, mitte tühiku põhjal, järgmiselt.

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

Pärast salvestamist käivitage mäng ja klõpsake nuppu, et näha, kas klahvid või nupud, millega suhtlete, muutuvad.

InputAction Seekord muudame tegevuskaarti selle jaoks, mis lõi eksemplari , Samuti InputAction on olemas skript, mis on loodud GUI tegevuskaardi seadistusega, nii et palun rakendage seda selles, mida on lihtne teha.