ตั้งค่าแผนที่การดําเนินการแบบไดนามิก

ปรับปรุงหน้า :
วันที่สร้างเพจ :

สภาพแวดล้อมการตรวจสอบ

หน้าต่าง
  • หน้าต่าง 11
บรรณาธิการ Unity
  • ปี 2020.3.25f1
แพ็คเกจระบบอินพุต
  • 1.2.0

ข้อกําหนดเบื้องต้นสําหรับเคล็ดลับนี้

การตั้งค่าต่อไปนี้ได้ทําไว้ล่วงหน้าเพื่อเป็นหลักฐานสําหรับคําอธิบายของเคล็ดลับนี้

คุณควรทําความคุ้นเคยกับเคล็ดลับต่อไปนี้:

เกี่ยวกับการกําหนดค่าแผนที่การดําเนินการแบบไดนามิก

เป็นเรื่องปกติที่จะเพิ่มและตั้งค่าแผนที่การดําเนินการให้กับโครงการล่วงหน้า ในกรณีนี้การกําหนดปุ่มคอนโทรลเลอร์จะได้รับการแก้ไขระหว่างการดําเนินการเกมและผู้ใช้ไม่สามารถเปลี่ยนแปลงได้อย่างอิสระในระหว่างเกม สิ่งนี้คาดหวังเป็นหลักสําหรับเกมที่ต้องการการกําหนดค่าหลัก

เคล็ดลับนี้อธิบายวิธีการเปลี่ยนการกําหนดที่สําคัญของแผนที่การดําเนินการในสคริปต์โดยพลการ

การจัดการการเปลี่ยนแปลงแผนที่การดําเนินการแบบไดนามิก

คราวนี้แผนที่การกระทําเริ่มต้นจะถูกกําหนดโดยสคริปต์และการเปลี่ยนแปลงแผนที่การกระทําตรงกลางจะทําในสคริปต์ด้วย ฉันคิดว่าวิธีนี้ใช้เมื่อโหลดและตั้งค่าการกําหนดค่าคีย์ที่บันทึกไว้เมื่อเริ่มต้นเกม

เนื้อหาของตัวอย่างคือการเปลี่ยนการกําหนดคีย์ของแผนที่การดําเนินการเมื่อคุณกดปุ่มและเพื่อแสดงเนื้อหาที่ดําเนินการเป็นข้อความ ตําแหน่งปุ่มและข้อความแสดงถูกจัดเรียงตามที่แสดงในรูป แต่ไม่สําคัญมากดังนั้นโปรดวางไว้อย่างอิสระ

กระบวนการกําหนดค่าเริ่มต้นของ Action Map

สร้างสคริปต์ ชื่อเป็นโดยพลการ แต่ในกรณีนี้ 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นําไปใช้ในฟิลด์ ที่นี่เราจะเตรียมฟิลด์สําหรับ "ย้าย" และ "โจมตี" ซึ่งใช้ในคําอธิบายแผนที่การกระทําก่อนหน้านี้ หากจํานวนการกระทําเพิ่มขึ้นคุณต้องประกาศจํานวนนั้น แต่ถ้ามีListDictionaryจํานวนมากคุณสามารถจัดการได้ด้วย , ฯลฯ ไม่ได้ใช้ที่นี่ แต่ถ้าคุณมีชั้นเรียนของคุณเองInputActionMapคุณสามารถจัดการได้ที่นั่น

การสร้างอินสแตนซ์และการกําหนดAddBindingคีย์ในInputActionวิธีการที่เรียกว่าAwakeเมื่อเริ่มต้นจะดําเนินการ คุณสามารถนึกถึงสิ่งที่คุณกําลังทําเป็นโปรแกรมที่เพิ่มการผูกบนหน้าจอการตั้งค่าแผนที่การกระทํา AddBindingสตริงที่ระบุสําหรับ Method ฯลฯ จะเหมือนกับสตริงที่แสดงใน Path บนหน้าจอการตั้งค่า action map หากต้องการแสดงสตริงอักขระ ให้กดปุ่ม "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 บันทึกสคริปต์แล้ว ให้แนบสคริปต์นั้นและกําหนดค่าวัตถุข้อความสําหรับการแสดงผล

เรียกใช้เกมและดูว่าข้อมูลอินพุตปรากฏขึ้นหรือไม่ ผลลัพธ์ควรเหมือนกับเวอร์ชันสคริปต์ของกระบวนการคงที่ของแผนที่การกระทํา

การประมวลผลการเปลี่ยนแปลงแบบไดนามิกของ Action Map

เนื่องจากการเปลี่ยนแปลงแบบไดนามิกของแผนที่การกระทําเสร็จสิ้นเมื่อกดปุ่มให้กําหนดวิธีการที่จะเรียกเมื่อกดปุ่ม 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 เป็น spacebar นอกจากนี้หากคุณต้องการเปลี่ยนจากช่องว่างเป็นคีย์ x คําอธิบายจะถูกเขียนทับสําหรับคีย์ z แทนที่จะใช้ช่องว่างดังนี้

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

เมื่อบันทึกแล้วให้เรียกใช้เกมและคลิกปุ่มเพื่อดูว่าปุ่มหรือปุ่มที่คุณโต้ตอบกับการเปลี่ยนแปลงหรือไม่

InputActionคราวนี้เรากําลังเปลี่ยนแผนที่การดําเนินการสําหรับแผนที่ที่สร้างอินสแตนซ์ของ , นอกจากนี้ยังมีInputActionสคริปต์ที่สร้างขึ้นโดยการตั้งค่าแผนที่การกระทําของ GUI ดังนั้นโปรดนําไปใช้ในสิ่งที่ทําได้ง่าย