Darbību kartes dinamiska iestatīšana

Lapa atjaunota :
Lapas izveides datums :

Verifikācijas vide

Windows
  • Operētājsistēmā Windows 11
Vienotības redaktors
  • 2020.3.25f1
Ievades sistēmas pakete
  • 1.2.0

Priekšnoteikumi šim padomam

Tālāk norādītie iestatījumi ir veikti iepriekš kā priekšnoteikums šī padoma aprakstam.

Jums jāzina arī šādi padomi:

Par dinamiskās darbības kartes konfigurāciju

Parasti projektam iepriekš pievieno un nosaka rīcības kartes, Šajā gadījumā kontroliera pogas piešķiršana tiek fiksēta spēles izpildes laikā, un lietotājs to nevar brīvi mainīt spēles laikā. Tas galvenokārt ir paredzēts spēlēm, kurām nepieciešama galvenā konfigurācija.

Šis padoms apraksta, kā skriptā patvaļīgi mainīt darbības kartes galvenos uzdevumus.

Dinamiskās darbības kartes izmaiņu apstrāde

Šoreiz sākotnējo darbības karti nosaka arī skripts, un skriptā tiek veikta arī darbības kartes maiņa vidū. Es domāju, ka šī metode tiek izmantota, ielādējot un iestatot galveno konfigurāciju, kas saglabāta spēles startēšanas laikā.

Parauga saturs ir mainīt darbības kartes galveno uzdevumu, nospiežot pogu, un parādīt darbināto saturu kā tekstu. Pogu izvietojums un displeja teksts ir sakārtoti tā, kā parādīts attēlā, taču tie nav ļoti svarīgi, tāpēc, lūdzu, novietojiet tos brīvi.

Darbību kartes sākotnējās konfigurācijas process

Izveidojiet skriptu. Nosaukums ir patvaļīgs, bet šajā gadījumā InputActionMap tas ir . Šoreiz šeit tiks aprakstīti visi procesi, bet faktiskajā ražošanā, lūdzu, sadaliet tos atbilstoši projekta izveidei.

Skripts izskatās šādi: Vispirms startēšanas laikā izveidojiet noklusējuma darbību karti.

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

Vispirms definējiet klasē tik daudz darbību, cik vēlaties InputAction ieviest laukā. Šeit mēs sagatavosim laukus "Pārvietot" un "Uzbrukt", kas tika izmantoti arī iepriekšējā darbības kartes skaidrojumā. Ja darbību skaits palielinās, jums ir jādeklarē šis skaits, bet, ja to ir List Dictionary daudz, varat tās pārvaldīt ar , , utt. Šeit tas netiek izmantots, bet, ja jums ir sava InputActionMap klase, varat to pārvaldīt tur.

Tiek veikta momentācija un atslēgas piešķiršana AddBinding metodē, ko InputAction sauc par Awake inicializāciju. Jūs varat domāt par to, ko jūs darāt kā programmu, kas pievieno saistījumu darbību kartes iestatījumu ekrānā. AddBinding Metodei u.c. norādītā virkne ir tāda pati kā virkne, kas parādīta darbības kartes iestatījumu ekrānā Ceļš. Lai parādītu rakstzīmju virkni, nospiediet pogu "T" labajā pusē.

Notikumu apstrāde, kas tiek izsaukta, kad tiek darbināta poga, ir tāda pati kā parastās darbības kartes skriptētās versijas apstrāde. Arī atzvanīšanas process tiek novirzīts tāds, kāds tas ir.

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

Iespējot, atspējot ir InputAction vienība, tāpēc aprakstiet tik daudz darbību, cik vēlaties. Ja tas ir apgrūtinoši, varat to List pārvaldīt ar utt.

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

Kad EventSystem skripts ir saglabāts, pievienojiet to parādāmajam teksta objektam un konfigurējiet to.

Palaidiet spēli un pārbaudiet, vai parādās ievades informācija. Rezultātam jābūt tādam pašam kā darbības kartes statiskā procesa skriptētajai versijai.

Darbību kartes dinamisko izmaiņu apstrāde

Tā kā darbības kartes dinamiskā maiņa tiek veikta, nospiežot pogu, definējiet metodi, kas tiks izsaukta, nospiežot pogu. OnClickButton Pagaidām mēs to atstāsim kā .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Iestata pogas klikšķa notikumu.

Darbības kartes pārrakstīšanas process ir šāds:

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

Tā kā katrai darbībai ir paredzēta ApplyBindingOverride metode, atslēgas vai pogas ceļš, kas tika inicializēts uz , path overridePath Uzrakstiet tās atslēgas vai pogas ceļu, kuru vēlaties ignorēt.

Starp citu, tas ir tikai pārrakstīšanas ceļa iestatīšana, tāpēc sākotnējais ceļš paliek tāds, kāds tas ir. Piemēram, darbībā Attack mainiet taustiņu z uz atstarpes taustiņu. Turklāt, ja vēlaties mainīt no atstarpes uz x taustiņu, apraksts tiks pārrakstīts z taustiņam, nevis pamatojoties uz atstarpi, kā norādīts tālāk.

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

Kad esat saglabājis, palaidiet spēli un noklikšķiniet uz pogas, lai redzētu, vai taustiņi vai pogas, ar kurām mijiedarbojaties, mainās.

InputAction Šoreiz mēs mainām rīcības karti tam, kas izveidoja gadījumu , Ir arī InputAction skripts, ko ģenerē GUI darbības kartes iestatījums, tāpēc, lūdzu, ieviesiet to viegli izdarāmā.