Δυναμική ρύθμιση χάρτη ενεργειών

Σελίδα ενημέρωση :
Ημερομηνία δημιουργίας σελίδας :

Περιβάλλον επαλήθευσης

παράθυρα
  • Παράθυρα 11
Επεξεργαστής ενότητας
  • 2020.3.25στ1
Πακέτο συστήματος εισόδου
  • 1.2.0

Προϋποθέσεις για αυτήν τη συμβουλή

Οι ακόλουθες ρυθμίσεις έχουν γίνει εκ των προτέρων ως προϋπόθεση για την περιγραφή αυτής της συμβουλής.

Θα πρέπει επίσης να είστε εξοικειωμένοι με τις παρακάτω συμβουλές:

Πληροφορίες για τη διαμόρφωση του χάρτη δυναμικής δράσης

Είναι σύνηθες να προσθέτετε και να ορίζετε χάρτες δράσης στο έργο εκ των προτέρων, Σε αυτήν την περίπτωση, οι αντιστοιχίσεις των κουμπιών του χειριστηρίου καθορίζονται κατά την εκτέλεση του παιχνιδιού και δεν μπορούν να αλλάξουν ελεύθερα από τον χρήστη κατά τη διάρκεια του παιχνιδιού. Αυτό αναμένεται κυρίως για παιχνίδια που απαιτούν διαμόρφωση κλειδιού.

Αυτή η συμβουλή περιγράφει τον τρόπο αυθαίρετης αλλαγής των εκχωρήσεων κλειδιών ενός χάρτη ενεργειών σε μια δέσμη ενεργειών.

Δυναμικός χειρισμός αλλαγών χάρτη ενεργειών

Αυτή τη φορά, ο αρχικός χάρτης δράσης ορίζεται επίσης από το σενάριο και η αλλαγή του χάρτη δράσης στη μέση γίνεται επίσης στο σενάριο. Νομίζω ότι αυτή η μέθοδος χρησιμοποιείται κατά τη φόρτωση και τη ρύθμιση της διαμόρφωσης κλειδιού που αποθηκεύεται κατά την εκκίνηση του παιχνιδιού.

Τα περιεχόμενα του δείγματος είναι για να αλλάξετε την αντιστοίχιση πλήκτρων του χάρτη ενεργειών όταν πατάτε το κουμπί και για να εμφανίσετε το λειτουργικό περιεχόμενο ως κείμενο. Η τοποθέτηση των κουμπιών και το κείμενο εμφάνισης είναι διατεταγμένα όπως φαίνεται στο σχήμα, αλλά δεν είναι πολύ σημαντικά, οπότε τοποθετήστε τα ελεύθερα.

Διαδικασία αρχικής διαμόρφωσης χάρτη δράσης

Δημιουργήστε ένα σενάριο. Το όνομα είναι αυθαίρετο, αλλά στην περίπτωση InputActionMap αυτή είναι . Αυτή τη φορά, όλες οι διαδικασίες θα περιγραφούν εδώ, αλλά στην πραγματική παραγωγή, παρακαλούμε να τις διαιρέσετε ανάλογα με τη δημιουργία του έργου.

Το σενάριο μοιάζει με αυτό: Αρχικά, δημιουργήστε έναν προεπιλεγμένο χάρτη ενεργειών κατά την εκκίνηση.

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

Αρχικά, ορίστε όσες ενέργειες στην κλάση InputAction θέλετε να εφαρμόσετε στο πεδίο. Εδώ, θα προετοιμάσουμε τα πεδία για "Μετακίνηση" και "Επίθεση", τα οποία χρησιμοποιήθηκαν επίσης στην προηγούμενη εξήγηση χάρτη δράσης. Εάν ο αριθμός των ενεργειών αυξάνεται, πρέπει να δηλώσετε αυτόν τον αριθμό, αλλά εάν υπάρχουν List Dictionary πολλές, μπορείτε να τις διαχειριστείτε με , , κ.λπ. Δεν χρησιμοποιείται εδώ, αλλά αν έχετε τη δική σας τάξη, μπορείτε να τη InputActionMap διαχειριστείτε εκεί.

Η δημιουργία και η εκχώρηση AddBinding κλειδιού στη μέθοδο που ονομάζεται Awake κατά την InputAction αρχικοποίηση εκτελούνται. Μπορείτε να σκεφτείτε αυτό που κάνετε ως ένα πρόγραμμα που προσθέτει μια δέσμευση στην οθόνη ρυθμίσεων χάρτη δράσης. AddBinding Η συμβολοσειρά που καθορίζεται για Μέθοδος κ.λπ. είναι η ίδια με τη συμβολοσειρά που εμφανίζεται στο Διαδρομή στην οθόνη ρύθμισης χάρτη δράσης. Για να εμφανίσετε μια συμβολοσειρά χαρακτήρων, πατήστε το κουμπί "T" στα δεξιά.

Ο χειρισμός συμβάντων που καλείται όταν λειτουργεί ένα κουμπί είναι ο ίδιος με την επεξεργασία της έκδοσης δέσμης ενεργειών ενός κανονικού χάρτη ενεργειών. Η διαδικασία επανάκλησης εκτρέπεται επίσης ως έχει.

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

Ενεργοποίηση, Απενεργοποίηση είναι InputAction μια μονάδα, οπότε περιγράψτε όσες ενέργειες θέλετε. Εάν είναι ενοχλητικό, μπορείτε να το List διαχειριστείτε με κ.λπ.

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

Αφού EventSystem αποθηκεύσετε τη δέσμη ενεργειών, επισυνάψτε την και ρυθμίστε τις παραμέτρους ενός αντικειμένου κειμένου για εμφάνιση.

Εκτελέστε το παιχνίδι και δείτε εάν εμφανίζονται οι πληροφορίες εισόδου. Το αποτέλεσμα πρέπει να είναι το ίδιο με την έκδοση δέσμης ενεργειών της στατικής διαδικασίας χάρτη ενεργειών.

Επεξεργασία δυναμικής αλλαγής χάρτη δράσης

Δεδομένου ότι η δυναμική αλλαγή του χάρτη δράσης γίνεται όταν πατηθεί το κουμπί, ορίστε τη μέθοδο που θα κληθεί όταν πατηθεί το κουμπί. OnClickButton Προς το παρόν, θα το αφήσουμε ως .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Ορίζει το συμβάν κλικ για το κουμπί.

Η διαδικασία επανεγγραφής του χάρτη ενεργειών έχει ως εξής:

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

Δεδομένου ότι παρέχεται μια μέθοδος για ApplyBindingOverride κάθε ενέργεια, η path διαδρομή του πλήκτρου ή του κουμπιού που αρχικοποιήθηκε στο , overridePath Γράψτε τη διαδρομή του πλήκτρου ή του κουμπιού που θέλετε να παρακάμψετε.

Παρεμπιπτόντως, αυτό απλώς ρυθμίζει τη διαδρομή αντικατάστασης, οπότε η αρχική διαδρομή παραμένει ως έχει. Για παράδειγμα, σε μια ενέργεια επίθεσης, αλλάξτε το πλήκτρο z στο πλήκτρο διαστήματος. Επιπλέον, εάν θέλετε να αλλάξετε από το διάστημα στο πλήκτρο x, η περιγραφή θα αντικατασταθεί για το πλήκτρο z αντί να βασίζεται στο διάστημα, ως εξής.

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

Αφού αποθηκευτεί, εκτελέστε το παιχνίδι και κάντε κλικ στο κουμπί για να δείτε εάν αλλάζουν τα πλήκτρα ή τα κουμπιά με τα οποία αλληλεπιδράτε.

InputAction Αυτή τη φορά, αλλάζουμε τον χάρτη δράσης για αυτόν που δημιούργησε μια παρουσία του , Υπάρχει επίσης InputAction ένα σενάριο που δημιουργείται από τη ρύθμιση χάρτη δράσης του GUI, οπότε εφαρμόστε το σε αυτό που είναι εύκολο να κάνετε.