Dinamik olarak eylem haritası ayarlama

Sayfa güncel :
Sayfa oluşturma tarihi :

Doğrulama ortamı

Windows
  • Pencereler 11
Birlik Editörü
  • 2020.3.25f1
Giriş Sistemi Paketi
  • 1.2.0

Bu ipucu için önkoşullar

Aşağıdaki ayarlar, bu ipucunun açıklaması için bir öncül olarak önceden yapılmıştır.

Aşağıdaki ipuçlarına da aşina olmalısınız:

Dinamik eylem haritası yapılandırması hakkında

Projeye önceden eylem haritaları eklemek ve ayarlamak yaygındır, Bu durumda, oyun kumandası düğmesi atamaları oyunun yürütülmesi sırasında sabitlenir ve oyun sırasında kullanıcı tarafından serbestçe değiştirilemez. Bu, esas olarak anahtar yapılandırması gerektiren oyunlar için beklenir.

Bu ipucunda, bir komut dosyasındaki eylem haritasının anahtar atamalarının rasgele nasıl değiştirileceği açıklanmaktadır.

Dinamik eylem haritası değişiklik işleme

Bu sefer ilk aksiyon haritası da senaryo tarafından ayarlanır ve ortadaki aksiyon haritası değişikliği de senaryoda yapılır. Oyun başlangıcında kaydedilen anahtar yapılandırmasını yüklerken ve ayarlarken bu yöntemin kullanıldığını düşünüyorum.

Örneğin içeriği, düğmeye bastığınızda eylem haritasının tuş atamasını değiştirmek ve çalıştırılan içeriği metin olarak görüntülemektir. Düğme yerleşimi ve ekran metni şekilde gösterildiği gibi düzenlenmiştir, ancak çok önemli değildir, bu yüzden lütfen bunları serbestçe yerleştirin.

Eylem Haritası İlk Yapılandırma İşlemi

Bir komut dosyası oluşturun. Adı keyfidir, ancak bu durumda InputActionMap . Bu kez, tüm süreçler burada açıklanacak, ancak gerçek üretimde, lütfen bunları projenin oluşturulmasına göre bölün.

Komut dosyası şöyle görünür: İlk olarak, başlangıçta varsayılan bir eylem haritası oluşturun.

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

İlk olarak, sınıfta alanda uygulamak istediğiniz kadar eylem tanımlayın InputAction . Burada, önceki eylem haritası açıklamasında da kullanılan "Move" ve "Attack" alanlarını hazırlayacağız. Eylemlerin sayısı artarsa, bu sayıyı bildirmeniz gerekir, ancak çok sayıda List Dictionary varsa, bunları , vb. İle yönetebilirsiniz. Burada kullanılmaz, ancak kendi InputActionMap sınıfınız varsa, orada yönetebilirsiniz.

Başlatma sırasında çağrılan Awake yöntemde InputAction örnek oluşturma ve anahtar ataması AddBinding gerçekleştirilir. Yaptıklarınızı, eylem haritası ayar ekranına bağlama ekleyen bir program olarak düşünebilirsiniz. AddBinding Yöntem vb. için belirtilen dize, eylem haritası ayarı ekranındaki Yol'da görüntülenen dizeyle aynıdır. Bir karakter dizesi görüntülemek için sağdaki "T" düğmesine basın.

Bir düğme çalıştırıldığında çağrılan olay işleme, normal bir eylem haritasının komut dosyası sürümünün işlenmesiyle aynıdır. Geri arama işlemi de olduğu gibi yönlendirilir.

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

Etkinleştir, Devre Dışı Bırak bir birimdir InputAction , bu nedenle istediğiniz kadar eylem açıklayın. Zahmetli ise, vb. İle yönetebilirsiniz List .

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

Komut dosyasını kaydettikten sonra EventSystem , görüntülenmek üzere bir metin nesnesine ekleyin ve yapılandırın.

Oyunu çalıştırın ve giriş bilgilerinin görünüp görünmediğine bakın. Sonuç, eylem haritası statik işleminin komut dosyası sürümüyle aynı olmalıdır.

Eylem Haritası Dinamik Değişim İşleme

Eylem haritasının dinamik değişimi düğmeye basıldığında yapıldığından, düğmeye basıldığında çağrılacak yöntemi tanımlayın. OnClickButton Şimdilik, olarak bırakacağız .

// 省略

public class InputActionMap : MonoBehaviour
{
  // 省略

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

Düğme için click olayını ayarlar.

Eylem haritası yeniden yazma işlemi aşağıdaki gibidir:

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

Her eylem için ApplyBindingOverride bir yöntem sağlandığından, başlatılan tuş veya düğmenin yolu , path overridePath Geçersiz kılmak istediğiniz tuşun veya düğmenin yolunu yazın.

Bu arada, bu sadece üzerine yazma yolunu ayarlıyor, böylece orijinal yol olduğu gibi kalıyor. Örneğin, bir Saldırı eyleminde, z tuşunu boşluk çubuğuna değiştirin. Ayrıca, boşluktan x tuşuna geçmek isterseniz, açıklama aşağıdaki gibi boşluk yerine z tuşu için üzerine yazılacaktır.

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

Kaydettikten sonra, oyunu çalıştırın ve etkileşimde bulunduğunuz tuşların veya düğmelerin değişip değişmediğini görmek için düğmeye tıklayın.

InputAction Bu kez, , örneğini oluşturan kişinin eylem haritasını değiştiriyoruz. GUI'nin eylem haritası ayarı tarafından oluşturulan bir komut dosyası da InputAction vardır, bu nedenle lütfen bunu yapması kolay olana uygulayın.