Dynamické nastavení mapy akcí
Ověřovací prostředí
- Windows
-
- Systém Windows 11
- Editor jednoty
-
- 2020.3.25f1
- Vstupní systémový balíček
-
- 1.2.0
Předpoklady pro tento tip
Následující nastavení byla provedena předem jako předpoklad pro popis tohoto tipu.
Měli byste se také seznámit s následujícími tipy:
O konfiguraci dynamické mapy akcí
Je běžné přidávat a nastavovat mapy akcí do projektu předem, V tomto případě je přiřazení tlačítek ovladače pevně stanoveno během provádění hry a uživatel je nemůže během hry volně měnit. To se očekává hlavně u her, které vyžadují klíčovou konfiguraci.
Tento tip popisuje, jak libovolně změnit přiřazení kláves mapy akcí ve skriptu.
Dynamické zpracování změn mapy akcí
Tentokrát je počáteční akční mapa také nastavena skriptem a změna mapy akcí uprostřed je také provedena ve skriptu. Myslím, že tato metoda se používá při načítání a nastavování konfigurace klíče uložené při spuštění hry.
Obsahem ukázky je změna přiřazení kláves mapy akcí při stisknutí tlačítka a zobrazení provozovaného obsahu jako textu. Umístění tlačítek a text zobrazení jsou uspořádány tak, jak je znázorněno na obrázku, ale nejsou příliš důležité, proto je prosím umístěte volně.
Proces počáteční konfigurace mapy akcí
Vytvořte skript. Název je libovolný, ale v tomto případě InputActionMap
je .
Tentokrát zde budou popsány všechny procesy, ale ve skutečné výrobě je prosím rozdělte podle vzniku projektu.
Skript vypadá takto: Nejprve při spuštění vytvořte výchozí mapu akcí.
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}";
}
}
Nejprve definujte tolik akcí ve třídě, kolik InputAction
chcete implementovat v poli.
Zde připravíme pole pro "Pohyb" a "Útok", která byla také použita v předchozím vysvětlení akční mapy.
Pokud se počet akcí zvýší, musíte toto číslo deklarovat, ale pokud je List
Dictionary
jich mnoho, můžete je spravovat pomocí , atd.
Nepoužívá se zde, ale pokud máte vlastní InputActionMap
třídu, můžete ji spravovat tam.
Jsou provedeny instance a přiřazení AddBinding
klíčů v metodě InputAction
volané Awake
při inicializaci.
To, co děláte, si můžete představit jako program, který přidá vazbu na obrazovku nastavení mapy akcí.
AddBinding
Řetězec zadaný pro Method, atd. je stejný jako řetězec zobrazený v Path na obrazovce nastavení mapy akcí.
Chcete-li zobrazit řetězec znaků, stiskněte tlačítko "T" vpravo.
Zpracování událostí volané při ovládání tlačítka je stejné jako zpracování skriptované verze normální mapy akcí. Proces zpětného volání je také odkloněn tak, jak je.
// 操作時のイベントを設定
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}";
}
Povolit, Zakázat je InputAction
jednotka, takže popište tolik akcí, kolik chcete.
Pokud je to nepříjemné, můžete to List
zvládnout s atd.
private void OnEnable()
{
// オブジェクトが有効になったときにアクションマップを有効にする
MoveAction.Enable();
AttackAction.Enable();
}
Po EventSystem
uložení skriptu jej připojte k textovému objektu a nakonfigurujte jej pro zobrazení.
Spusťte hru a zjistěte, zda se zobrazí vstupní informace. Výsledek by měl být stejný jako skriptovaná verze statického procesu mapy akcí.
Dynamické zpracování změn mapy akcí
Vzhledem k tomu, že dynamická změna mapy akcí se provádí při stisknutí tlačítka, definujte metodu, která bude volána při stisknutí tlačítka.
OnClickButton
Prozatím to necháme jako .
// 省略
public class InputActionMap : MonoBehaviour
{
// 省略
<summary>
ボタンをクリックしたときに呼ばれる。
</summary>
public void OnClickButton()
{
}
}
Nastaví událost kliknutí pro tlačítko.
Proces přepsání mapy akcí je následující:
<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" });
}
Vzhledem k tomu, že pro každou akci je k dispozici ApplyBindingOverride
metoda, cesta path
klávesy nebo tlačítka, které byly inicializovány na ,
overridePath
Napište cestu ke klíči nebo tlačítku, které chcete přepsat.
Mimochodem, je to jen nastavení přepsání cesty, takže původní cesta zůstane tak, jak je. Například v akci útoku změňte klávesu z na mezerník. Dále, pokud chcete změnit z mezery na klávesu x, popis bude přepsán pro klávesu z namísto založené na prostoru, a to následujícím způsobem.
AttackAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/z", overridePath = "<Keyboard>/x" });
Po uložení spusťte hru a kliknutím na tlačítko zjistěte, zda se klávesy nebo tlačítka, se kterými pracujete, změní.
InputAction
Tentokrát měníme mapu akcí pro tu, která vytvořila instanci ,
K dispozici je také InputAction
skript generovaný nastavením mapy akcí GUI, takže jej prosím implementujte do toho, který je snadný.