Dinamiškas veiksmų žemėlapio nustatymas

Puslapis atnaujintas :
Puslapio sukūrimo data :

Tikrinimo aplinka

Windows
  • Langai 11
"Unity" redaktorius
  • 2020.3.25f1
Įvesties sistemos paketas
  • 1.2.0

Būtinos šio patarimo sąlygos

Šie nustatymai buvo atlikti iš anksto kaip šio patarimo aprašymo prielaida.

Taip pat turėtumėte būti susipažinę su šiais patarimais:

Apie dinaminių veiksmų žemėlapio konfigūraciją

Įprasta iš anksto pridėti ir nustatyti projekto veiksmų žemėlapius, Tokiu atveju valdiklio mygtukų priskyrimai yra fiksuoti žaidimo vykdymo metu ir vartotojas negali jų laisvai keisti žaidimo metu. To daugiausia tikimasi žaidimams, kuriems reikalinga rakto konfigūracija.

Šiame patarime aprašoma, kaip savavališkai pakeisti pagrindinius veiksmų schemos priskyrimus scenarijuje.

Dinaminis veiksmų žemėlapio keitimų valdymas

Šį kartą pradinis veiksmų žemėlapis taip pat nustatomas pagal scenarijų, o veiksmų žemėlapio pakeitimas viduryje taip pat atliekamas scenarijuje. Manau, kad šis metodas naudojamas įkeliant ir nustatant pagrindinę konfigūraciją, išsaugotą žaidimo paleidimo metu.

Pavyzdžio turinys turi pakeisti veiksmų schemos klavišų priskyrimą, kai paspaudžiate mygtuką, ir rodyti valdomą turinį kaip tekstą. Mygtukų išdėstymas ir rodymo tekstas yra išdėstyti taip, kaip parodyta paveikslėlyje, tačiau jie nėra labai svarbūs, todėl padėkite juos laisvai.

Veiksmų žemėlapio pradinis konfigūravimo procesas

Sukurkite scenarijų. Pavadinimas yra savavališkas, tačiau šiuo atveju InputActionMap jis yra . Šį kartą visi procesai bus aprašyti čia, tačiau faktinėje gamyboje prašome juos padalyti pagal projekto sukūrimą.

Scenarijus atrodo taip: Pirmiausia paleidžiant sukurkite numatytąjį veiksmų žemėlapį.

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

Pirmiausia klasėje apibrėžkite tiek veiksmų, kiek InputAction norite įgyvendinti lauke. Čia mes paruošime laukus "Perkelti" ir "Ataka", kurie taip pat buvo naudojami ankstesniame veiksmų žemėlapio paaiškinime. Jei veiksmų skaičius didėja, turite deklaruoti tą skaičių, bet jei jų yra List Dictionary daug, galite juos valdyti naudodami , ir pan. Čia jis nenaudojamas, bet jei turite savo InputActionMap klasę, galite ją valdyti ten.

Atliekamas momentinis ir raktų priskyrimas AddBinding metodu, InputAction vadinamu Awake inicijavimu. Galite galvoti apie tai, ką darote, kaip apie programą, kuri veiksmų žemėlapio nustatymų ekrane prideda įrišimą. AddBinding Eilutė, nurodyta metodui ir kt., yra tokia pati kaip eilutė, rodoma Kelias veiksmų žemėlapio nustatymų ekrane. Norėdami rodyti simbolių eilutę, paspauskite dešinėje esantį mygtuką "T".

Įvykių tvarkymas, vadinamas mygtuko įjungimu, yra toks pat, kaip įprasto veiksmų žemėlapio scenarijaus versijos apdorojimas. Atgalinio skambinimo procesas taip pat nukreipiamas taip, kaip yra.

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

Įjungti, išjungti yra InputAction vienetas, todėl aprašykite tiek veiksmų, kiek norite. Jei tai vargina, galite tai List valdyti naudodami ir pan.

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

Įrašę EventSystem scenarijų, pridėkite jį prie teksto objekto ir sukonfigūruokite jį rodyti.

Paleiskite žaidimą ir pažiūrėkite, ar rodoma įvesties informacija. Rezultatas turėtų būti toks pat, kaip ir veiksmų schemos statinio proceso scenarijaus versija.

Veiksmų žemėlapio dinaminis keitimų apdorojimas

Kadangi dinaminis veiksmų žemėlapio keitimas atliekamas paspaudus mygtuką, apibrėžkite metodą, kuris bus iškviestas paspaudus mygtuką. OnClickButton Kol kas paliksime jį kaip .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Nustato mygtuko paspaudimo įvykį.

Veiksmų schemos perrašymo procesas yra toks:

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

Kadangi kiekvienam veiksmui ApplyBindingOverride yra numatytas metodas, rakto arba mygtuko, kuris buvo inicijuotas į , path kelias overridePath Parašykite rakto ar mygtuko, kurį norite nepaisyti, kelią.

Beje, tai tik perrašymo kelio nustatymas, todėl pradinis kelias lieka toks, koks yra. Pavyzdžiui, atlikdami veiksmą "Attack", pakeiskite klavišą z į tarpo klavišą. Be to, jei norite pakeisti tarpą į x klavišą, aprašymas bus perrašytas z klavišui, o ne pagal tarpą, kaip nurodyta toliau.

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

Išsaugoję paleiskite žaidimą ir spustelėkite mygtuką, kad pamatytumėte, ar klavišai ar mygtukai, su kuriais bendraujate, pasikeičia.

InputAction Šį kartą keičiame veiksmų žemėlapį tam, kuris sukūrė egzempliorių , Taip pat InputAction yra scenarijus, sugeneruotas pagal GUI veiksmų žemėlapio nustatymą, todėl įdiekite jį tame, kurį lengva padaryti.