Dynamické nastavenie mapy akcií
Prostredie overovania
- Windows
-
- Windows 11
- Editor jednoty
-
- 2020.3.25f1
- Vstupný systémový balík
-
- 1.2.0
Predpoklady pre tento tip
Nasledujúce nastavenia boli vykonané vopred ako predpoklad pre popis tohto tipu.
Mali by ste byť tiež oboznámení s nasledujúcimi tipmi:
Konfigurácia dynamickej mapy akcií
Je bežné vopred pridávať a nastavovať akčné mapy do projektu, V tomto prípade sú priradenia tlačidiel ovládača pevne stanovené počas vykonávania hry a používateľ ich nemôže počas hry voľne meniť. Očakáva sa to hlavne pri hrách, ktoré vyžadujú konfiguráciu kľúča.
Tento tip popisuje, ako ľubovoľne zmeniť kľúčové priradenia mapy akcií v skripte.
Manipulácia so zmenami dynamickej akčnej mapy
Tentoraz je počiatočná akčná mapa tiež nastavená skriptom a zmena mapy akcií v strede sa tiež vykonáva v skripte. Myslím, že táto metóda sa používa pri načítaní a nastavení konfigurácie kľúča uloženej pri spustení hry.
Obsahom ukážky je zmena priradenia klávesov mapy akcií po stlačení tlačidla a zobrazenie ovládaného obsahu ako textu. Umiestnenie tlačidiel a zobrazený text sú usporiadané tak, ako je to znázornené na obrázku, ale nie sú veľmi dôležité, preto ich voľne umiestňujte.
Proces počiatočnej konfigurácie mapy akcií
Vytvorte skript. Názov je ľubovoľný, ale v tomto prípade InputActionMap
je to .
Tentokrát tu budú popísané všetky procesy, ale v samotnej výrobe ich prosím rozdeľte podľa tvorby projektu.
Skript vyzerá takto: Najprv pri spustení vytvorte predvolenú mapu akcií.
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}";
}
}
Najprv definujte toľko akcií v triede, koľko InputAction
chcete implementovať v teréne.
Tu pripravíme polia pre "Move" a "Attack", ktoré boli použité aj vo vysvetlení predchádzajúcej akčnej mapy.
Ak sa počet akcií zvýši, musíte tento počet deklarovať, ale ak ich je List
Dictionary
veľa, môžete ich spravovať pomocou , , atď.
Nepoužíva sa tu, ale ak máte vlastnú InputActionMap
triedu, môžete ju tam spravovať.
Vykoná sa inštancia a priradenie AddBinding
kľúča metódou nazývanou InputAction
Awake
pri inicializácii.
To, čo robíte, si môžete predstaviť ako program, ktorý pridáva väzbu na obrazovku nastavenia mapy akcií.
AddBinding
Reťazec zadaný pre metódu atď. je rovnaký ako reťazec zobrazený v časti Cesta na obrazovke nastavenia mapy akcií.
Ak chcete zobraziť reťazec znakov, stlačte tlačidlo "T" vpravo.
Spracovanie udalostí vyvolaných pri stlačení tlačidla je rovnaké ako spracovanie skriptovanej verzie normálnej akčnej mapy. Proces spätného volania je tiež odklonený tak, ako 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}";
}
Povoliť, Zakázať je InputAction
jednotka, takže popíšte toľko akcií, koľko chcete.
Ak je to nepríjemné, môžete to List
zvládnuť s atď.
private void OnEnable()
{
// オブジェクトが有効になったときにアクションマップを有効にする
MoveAction.Enable();
AttackAction.Enable();
}
Po EventSystem
uložení skriptu ho priložte a nakonfigurujte textový objekt na zobrazenie.
Spustite hru a skontrolujte, či sa zobrazia vstupné informácie. Výsledok by mal byť rovnaký ako skriptovaná verzia statického procesu mapy akcií.
Spracovanie dynamických zmien mapy akcií
Keďže dynamická zmena mapy akcií sa vykonáva po stlačení tlačidla, definujte metódu, ktorá sa vyvolá po stlačení tlačidla.
OnClickButton
Zatiaľ to necháme ako .
// 省略
public class InputActionMap : MonoBehaviour
{
// 省略
<summary>
ボタンをクリックしたときに呼ばれる。
</summary>
public void OnClickButton()
{
}
}
Nastaví udalosť kliknutia na tlačidlo.
Proces prepisovania akčnej mapy je nasledujúci:
<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" });
}
Keďže pre ApplyBindingOverride
každú akciu je k dispozícii metóda, cesta path
klávesu alebo tlačidla, ktoré bolo inicializované na ,
overridePath
Napíšte cestu ku klávesu alebo tlačidlu, ktoré chcete prepísať.
Mimochodom, toto je len nastavenie cesty prepísania, takže pôvodná cesta zostáva taká, aká je. Napríklad v akcii Útok zmeňte kláves z na medzerník. Okrem toho, ak chcete zmeniť medzeru na x kľúč, popis bude prepísaný pre kláves z namiesto medzery nasledovne.
AttackAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/z", overridePath = "<Keyboard>/x" });
Po uložení spustite hru a kliknutím na tlačidlo skontrolujte, či sa klávesy alebo tlačidlá, s ktorými pracujete, zmenia.
InputAction
Tentokrát meníme akčnú mapu pre tú, ktorá vytvorila inštanciu ,
K dispozícii je tiež InputAction
skript generovaný nastavením akčnej mapy grafického používateľského rozhrania, takže ho implementujte do toho, ktorý je ľahko vykonateľný.