Thiết lập bản đồ hành động động

Trang Cập Nhật :
Ngày tạo trang :

Môi trường xác minh

Windows
  • cửa sổ 11
Biên tập viên Unity
  • 2020.3.25f1
Gói hệ thống đầu vào
  • 1.2.0

Điều kiện tiên quyết cho mẹo này

Các cài đặt sau đây đã được thực hiện trước làm tiền đề cho mô tả về mẹo này.

Bạn cũng nên làm quen với các mẹo sau:

Giới thiệu về cấu hình sơ đồ hành động động động

Người ta thường thêm và đặt bản đồ hành động cho dự án trước, Trong trường hợp này, việc gán nút điều khiển được cố định trong quá trình thực hiện trò chơi và người dùng không thể tự do thay đổi trong trò chơi. Điều này chủ yếu được mong đợi cho các trò chơi yêu cầu cấu hình chính.

Mẹo này mô tả cách tùy ý thay đổi các nhiệm vụ chính của bản đồ hành động trong tập lệnh.

Xử lý thay đổi bản đồ hành động động

Lần này, bản đồ hành động ban đầu cũng được thiết lập bởi kịch bản và thay đổi bản đồ hành động ở giữa cũng được thực hiện trong kịch bản. Tôi nghĩ rằng phương pháp này được sử dụng khi tải và thiết lập cấu hình khóa được lưu khi khởi động trò chơi.

Nội dung của mẫu là thay đổi nhiệm vụ chính của bản đồ hành động khi bạn nhấn nút và hiển thị nội dung được vận hành dưới dạng văn bản. Vị trí nút và văn bản hiển thị được sắp xếp như trong hình, nhưng chúng không quan trọng lắm, vì vậy hãy đặt chúng một cách tự do.

Quy trình cấu hình ban đầu của bản đồ hành động

Tạo tập lệnh. Tên là tùy ý, nhưng trong trường hợp InputActionMap này là . Lần này, tất cả các quy trình sẽ được mô tả ở đây, nhưng trong sản xuất thực tế, vui lòng chia chúng theo việc tạo dự án.

Kịch bản trông như thế này: Đầu tiên, tạo một bản đồ hành động mặc định khi khởi động.

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

Đầu tiên, xác định bao nhiêu hành động trong lớp như bạn InputAction muốn thực hiện trong lĩnh vực này. Ở đây, chúng tôi sẽ chuẩn bị các trường cho "Di chuyển" và "Tấn công", cũng được sử dụng trong phần giải thích bản đồ hành động trước đó. Nếu số lượng hành động tăng lên, bạn cần khai báo số đó, nhưng nếu có nhiều, bạn có List Dictionary thể quản lý chúng bằng , , v.v. Nó không được sử dụng ở đây, nhưng nếu bạn có lớp học của riêng InputActionMap mình, bạn có thể quản lý nó ở đó.

Khởi tạo và gán AddBinding khóa trong InputAction phương thức được gọi là khởi tạo được Awake thực hiện. Bạn có thể nghĩ về những gì bạn đang làm như một chương trình thêm ràng buộc trên màn hình cài đặt bản đồ hành động. AddBinding Chuỗi được chỉ định cho Phương pháp, v.v. giống với chuỗi được hiển thị trong Đường dẫn trên màn hình cài đặt bản đồ hành động. Để hiển thị chuỗi ký tự, nhấn nút "T" ở bên phải.

Việc xử lý sự kiện được gọi khi một nút được vận hành giống như việc xử lý phiên bản kịch bản của bản đồ hành động thông thường. Quá trình callback cũng được chuyển hướng như hiện tại.

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

Bật, Vô hiệu hóa là InputAction một đơn vị, vì vậy hãy mô tả bao nhiêu hành động tùy thích. Nếu nó gây rắc rối, bạn có thể quản lý nó List với, v.v.

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

Sau khi EventSystem bạn lưu tập lệnh, đính kèm nó vào và cấu hình một đối tượng văn bản để hiển thị.

Chạy trò chơi và xem thông tin đầu vào có xuất hiện không. Kết quả sẽ giống như phiên bản kịch bản của quy trình tĩnh bản đồ hành động.

Xử lý thay đổi động của bản đồ hành động

Vì thay đổi động của bản đồ hành động được thực hiện khi nhấn nút, hãy xác định phương thức sẽ được gọi khi nhấn nút. OnClickButton Bây giờ, chúng tôi sẽ để nó là .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Đặt sự kiện nhấp chuột cho nút.

Quá trình viết lại bản đồ hành động như sau:

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

Vì một phương thức được cung cấp cho ApplyBindingOverride mỗi hành động, đường dẫn của phím hoặc nút được khởi tạo thành , path overridePath Viết đường dẫn của phím hoặc nút bạn muốn ghi đè.

Nhân tiện, đây chỉ là đặt đường dẫn ghi đè, vì vậy đường dẫn ban đầu vẫn như cũ. Ví dụ: trong hành động Tấn công, hãy thay đổi phím z thành phím cách. Hơn nữa, nếu bạn muốn thay đổi từ phím space sang phím x, mô tả sẽ được ghi đè cho khóa z thay vì dựa trên khoảng trắng, như sau.

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

Sau khi lưu, hãy chạy trò chơi và nhấp vào nút để xem các phím hoặc nút bạn tương tác có thay đổi hay không.

InputAction Lần này, chúng tôi đang thay đổi bản đồ hành động cho bản đồ đã tạo ra một thể hiện của , Ngoài ra còn InputAction có một tập lệnh được tạo bởi cài đặt bản đồ hành động của GUI, vì vậy hãy triển khai nó trong tập lệnh dễ thực hiện.