Oprette et handlingskort dynamisk

Side opdateret :
Dato for oprettelse af side :

Miljø til bekræftelse

Windows
  • Windows 11
Enhedslistens redaktør
  • 2020.3.25f1
Input System Pakke
  • 1.2.0

Forudsætninger for dette tip

Følgende indstillinger er foretaget på forhånd som en forudsætning for beskrivelsen af dette tip.

Du bør også være bekendt med følgende tips:

Om konfiguration af dynamisk handlingskort

Det er almindeligt at tilføje og indstille handlingskort til projektet på forhånd, I dette tilfælde er controllerknaptildelingerne rettet under spiludførelse og kan ikke frit ændres af brugeren under spillet. Dette forventes hovedsageligt for spil, der kræver nøglekonfiguration.

Dette tip beskriver, hvordan du vilkårligt ændrer nøgletildelingerne for et handlingskort i et script.

Håndtering af ændringer i dynamisk handlingskort

Denne gang indstilles det indledende handlingskort også af scriptet, og ændringen af handlingskortet i midten udføres også i scriptet. Jeg tror, at denne metode bruges, når du indlæser og indstiller nøglekonfigurationen, der er gemt ved spilstart.

Indholdet af eksemplet er at ændre nøgletildelingen af handlingstilknytningen, når du trykker på knappen, og at få vist det betjente indhold som tekst. Knapplaceringen og displayteksten er arrangeret som vist på figuren, men de er ikke særlig vigtige, så placer dem frit.

Indledende konfigurationsproces for handlingsoversigt

Opret et script. Navnet er vilkårligt, men i dette tilfælde InputActionMap er det . Denne gang vil alle processerne blive beskrevet her, men i selve produktionen skal du opdele dem efter oprettelsen af projektet.

Scriptet ser sådan ud: Opret først et standardhandlingskort ved opstart.

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

Først skal du definere så mange handlinger i klassen, som du InputAction vil implementere i marken. Her vil vi forberede felterne til "Flyt" og "Angreb", som også blev brugt i den forrige handlingskortforklaring. Hvis antallet af handlinger stiger, skal du erklære dette antal, men hvis der er List Dictionary mange, kan du administrere dem med , osv. Det bruges ikke her, men hvis du har din egen InputActionMap klasse, kan du styre det der.

Instantiering og nøgletildeling AddBinding i metoden InputAction kaldet Awake ved initialisering udføres. Du kan tænke på, hvad du laver som et program, der tilføjer en binding på handlingskortindstillingsskærmen. AddBinding Den streng, der er angivet for Metode osv., er den samme som den streng, der vises i Sti på indstillingsskærmen for handlingsoversigten. For at få vist en tegnstreng skal du trykke på knappen "T" til højre.

Den hændelseshåndtering, der kaldes, når en knap betjenes, er den samme som behandlingen af den scriptede version af et normalt handlingskort. Tilbagekaldsprocessen omdirigeres også, som den er.

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

Aktiver, Deaktiver er InputAction en enhed, så beskriv så mange handlinger, som du vil. Hvis det er besværligt, kan du klare det List med osv.

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

Når EventSystem du har gemt scriptet, skal du vedhæfte det til og konfigurere et tekstobjekt til visning.

Kør spillet og se om inputoplysningerne vises. Resultatet skal være det samme som den scriptede version af den statiske handlingsproces.

Action Map Dynamisk forandringsbehandling

Da den dynamiske ændring af handlingskortet udføres, når der trykkes på knappen, skal du definere den metode, der kaldes, når der trykkes på knappen. OnClickButton Indtil videre lader vi det være som .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Indstiller klikhændelsen for knappen.

Omskrivningsprocessen for handlingsoversigten er som følger:

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

Da der findes en metode til hver handling, er path stien til den tast eller knap, der blev initialiseret til ApplyBindingOverride , overridePath Skriv stien til den tast eller knap, du vil tilsidesætte.

Forresten er dette bare at indstille overskrivningsstien, så den oprindelige sti forbliver som den er. I en angrebshandling skal du f.eks. ændre z-tasten til mellemrumstasten. Desuden, hvis du vil skifte fra mellemrum til x-tast, overskrives beskrivelsen for z-tasten i stedet for baseret på mellemrum som følger.

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

Når du er gemt, skal du køre spillet og klikke på knappen for at se, om de taster eller knapper, du interagerer med, ændres.

InputAction Denne gang ændrer vi handlingskortet for det, der oprettede en forekomst af , Der er også InputAction et script genereret af handlingskortindstillingen for GUI, så implementer det venligst i det, der er let at gøre.