Művelettérkép dinamikus beállítása

Oldal frissítve :
Oldal létrehozásának dátuma :

Ellenőrzési környezet

Windows
  • Windows 11 esetén
Unity-szerkesztő
  • 2020.3.25f1
Bemeneti rendszercsomag
  • 1.2.0

A tipp előfeltételei

A következő beállításokat előre elvégeztük a tipp leírásának előfeltételeként.

Ismernie kell a következő tippeket is:

A dinamikus művelettérkép konfigurálása

Gyakori, hogy előre hozzáadnak és beállítanak cselekvési térképeket a projekthez, Ebben az esetben a vezérlő gombjainak hozzárendelése a játék végrehajtása során rögzül, és a felhasználó nem változtathatja meg szabadon a játék során. Ez elsősorban olyan játékoknál várható, amelyek kulcskonfigurációt igényelnek.

Ez a tipp azt ismerteti, hogyan módosíthatja önkényesen egy művelettérkép kulcs-hozzárendeléseit egy parancsfájlban.

Dinamikus művelettérkép-módosítások kezelése

Ezúttal a kezdeti művelettérképet is a szkript állítja be, és a középső művelettérkép-módosítás is a szkriptben történik. Azt hiszem, ezt a módszert használják a játék indításakor mentett kulcskonfiguráció betöltésekor és beállításakor.

A minta tartalma a művelettérkép billentyű-hozzárendelésének módosítása a gomb megnyomásakor, valamint a működtetett tartalom szövegként való megjelenítése. A gombok elhelyezése és a megjelenített szöveg az ábrán látható módon van elrendezve, de nem túl fontosak, ezért kérjük, szabadon helyezze el őket.

Műveleti térkép kezdeti konfigurációs folyamata

Hozzon létre egy szkriptet. A név önkényes, de ebben az esetben InputActionMap . Ezúttal az összes folyamatot itt ismertetjük, de a tényleges termelésben kérjük, ossza meg őket a projekt létrehozása szerint.

A szkript így néz ki: Először hozzon létre egy alapértelmezett művelettérképet indításkor.

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

Először határozzon InputAction meg annyi műveletet az osztályban, amennyit a mezőben végre szeretne hajtani. Itt előkészítjük a mezőket a "Move" és a "Attack" számára, amelyeket az előző akciótérkép-magyarázatban is használtunk. Ha a műveletek száma növekszik, deklarálnia kell ezt a számot, de ha sok van List Dictionary , akkor a , stb. Itt nem használják, de ha van saját InputActionMap osztálya, akkor ott kezelheti.

A rendszer végrehajtja a példányosítást és a kulcshozzárendelést AddBinding az InputAction inicializáláskor hívott Awake metódusban. Gondolhat arra, amit csinál, mint egy programra, amely kötést ad hozzá a művelettérkép beállítási képernyőjéhez. AddBinding A Metódus stb. mezőben megadott karakterlánc megegyezik a művelettérkép beállítási képernyőjén az Elérési út mezőben megjelenő karakterlánccal. A karakterlánc megjelenítéséhez nyomja meg a jobb oldalon található "T" gombot.

A gomb működtetésekor meghívott eseménykezelés megegyezik a normál művelettérkép parancsfájllal ellátott verziójának feldolgozásával. A visszahívási folyamat is el van irányítva.

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

Az engedélyezés, a InputAction letiltás egy egység, ezért írjon le annyi műveletet, amennyit csak akar. Ha zavaró, akkor kezelheti List stb.

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

A parancsfájl mentése után EventSystem csatolja és konfigurálja a megjelenítendő szöveges objektumot.

Futtassa a játékot, és nézze meg, hogy megjelennek-e a bemeneti információk. Az eredménynek meg kell egyeznie a művelettérkép statikus folyamatának parancsfájlos verziójával.

Műveleti térkép dinamikus változásfeldolgozása

Mivel a művelettérkép dinamikus váltása a gomb megnyomásakor történik, határozza meg azt a módszert, amelyet a gomb megnyomásakor hív meg. OnClickButton Egyelőre hagyjuk .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Beállítja a gomb kattintási eseményét.

A művelettérkép átírási folyamata a következő:

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

Mivel minden művelethez ApplyBindingOverride meg van adva egy metódus, a path következőre inicializált billentyű vagy gomb elérési útja: , overridePath Írja be a felülbírálni kívánt kulcs vagy gomb elérési útját.

Egyébként ez csak a felülírási útvonal beállítása, így az eredeti elérési út változatlan marad. Például egy Támadás műveletben módosítsa a z billentyűt a szóközre. Továbbá, ha szóközről x kulcsra szeretne váltani, a leírás felülíródik a z billentyűre a szóköz helyett, az alábbiak szerint.

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

A mentés után futtassa a játékot, és kattintson a gombra, hogy megnézze, változnak-e azok a billentyűk vagy gombok, amelyekkel interakcióba lép.

InputAction Ezúttal annak a művelettérképét módosítjuk, amely létrehozta a példányát, Van egy szkript isInputAction, amelyet a grafikus felhasználói felület művelettérkép-beállítása generál, ezért kérjük, implementálja azt abban, ami könnyen elvégezhető.