Konfigurera en åtgärdskarta dynamiskt

Sidan uppdaterad :
Datum för skapande av sida :

Verifiering miljö

Windows
  • Fönster 11
Unity-redaktör
  • 2020.3.25F1
Paket för inmatningssystem
  • 1.2.0

Förutsättningar för det här tipset

Följande inställningar har gjorts i förväg som en förutsättning för beskrivningen av detta tips.

Du bör också känna till följande tips:

Om konfiguration av dynamisk åtgärdskarta

Det är vanligt att lägga till och ställa in åtgärdskartor till projektet i förväg, I det här fallet är kontrollknapptilldelningarna fasta under spelets körning och kan inte ändras fritt av användaren under spelet. Detta förväntas främst för spel som kräver nyckelkonfiguration.

Det här tipset beskriver hur du godtyckligt ändrar nyckeltilldelningarna för en åtgärdskarta i ett skript.

Dynamisk hantering av ändringar i åtgärdskarta

Den här gången ställs den ursprungliga åtgärdskartan också in av skriptet, och åtgärdskartans ändring i mitten görs också i skriptet. Jag tror att den här metoden används när du laddar och ställer in nyckelkonfigurationen som sparats vid spelstart.

Innehållet i exemplet är att ändra nyckeltilldelningen för åtgärdskartan när du trycker på knappen och att visa det använda innehållet som text. Knappplaceringen och visningstexten är ordnade som visas i figuren, men de är inte särskilt viktiga, så placera dem fritt.

Inledande konfigurationsprocess för åtgärdskarta

Skapa ett skript. Namnet är godtyckligt, men i det här fallet InputActionMap är det . Den här gången kommer alla processer att beskrivas här, men i själva produktionen, vänligen dela upp dem enligt projektets skapande.

Skriptet ser ut så här: Skapa först en standardåtgärdskarta vid start.

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

Börja med att definiera så många åtgärder i klassen som du InputAction vill implementera i fältet. Här kommer vi att förbereda fälten för "Move" och "Attack", som också användes i den tidigare förklaringen av åtgärdskartan. Om antalet åtgärder ökar måste du deklarera det antalet, men om det finns List Dictionary många kan du hantera dem med , , etc. Det används inte här, men om du har din egen InputActionMap klass kan du hantera det där.

Instansiering och nyckeltilldelning AddBinding i metoden som anropas Awake InputAction vid initiering utförs. Du kan tänka på det du gör som ett program som lägger till en bindning på inställningsskärmen för åtgärdskartan. AddBinding Strängen som anges för Metod osv. är densamma som strängen som visas i Sökväg på inställningsskärmen för åtgärdskartan. För att visa en teckensträng, tryck på "T" -knappen till höger.

Händelsehanteringen som anropas när en knapp används är densamma som bearbetningen av den skriptade versionen av en normal åtgärdskarta. Återuppringningsprocessen omdirigeras också som den är.

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

Aktivera, inaktivera är InputAction en enhet, så beskriv så många åtgärder du vill. Om det är besvärligt kan du hantera det List med etc.

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

När du har EventSystem sparat skriptet kopplar du det till och konfigurerar ett textobjekt för visning.

Kör spelet och se om inmatningsinformationen visas. Resultatet ska vara detsamma som den skriptade versionen av den statiska processen för åtgärdskartan.

Åtgärdskarta Dynamisk ändringsbearbetning

Eftersom den dynamiska ändringen av åtgärdskartan görs när knappen trycks in, definiera metoden som ska anropas när knappen trycks in. OnClickButton För tillfället lämnar vi det som .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Anger klickhändelsen för knappen.

Omskrivningsprocessen för åtgärdskartan är som följer:

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

Eftersom en metod tillhandahålls för ApplyBindingOverride varje åtgärd visas path sökvägen till nyckeln eller knappen som initierades till , overridePath Skriv sökvägen till nyckeln eller knappen som du vill åsidosätta.

Förresten, det här ställer bara in överskrivningsvägen, så den ursprungliga sökvägen förblir som den är. I en attackåtgärd ändrar du till exempel z-tangenten till mellanslagstangenten. Dessutom, om du vill ändra från mellanslag till x-tangent, kommer beskrivningen att skrivas över för z-tangenten istället för baserat på mellanslag, enligt följande.

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

När du har sparat kör du spelet och klickar på knappen för att se om tangenterna eller knapparna du interagerar med ändras.

InputAction Den här gången ändrar vi åtgärdskartan för den som skapade en instans av , Det finns också InputAction ett skript som genereras av åtgärdskartan för GUI, så implementera det i det som är lätt att göra.