Použitie akčných máp na priradenie tlačidiel k hernému správaniu
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.
Informácie o akčných mapách
Programy na vstup používateľov na klávesniciach, myšiach a gamepadoch v podstate uvádzali, že po stlačení tlačidla bola vykonaná určitá akcia. Napríklad na mape akcií môžete definovať akciu "skákania" a priradiť jej tlačidlá ovládača a klávesy klávesnice. V dôsledku toho program potrebuje opísať proces iba vtedy, keď sa vykoná konkrétna akcia. Aj keď priradíte tlačidlo na inom ovládači ako dodatočný nápad, môžete ho použiť bez zmeny operačného programu.
Vytvorenie mapy akcií
Tu by som chcel vytvoriť akčnú mapu a zobraziť vstupné informácie používateľa v texte. Existuje niekoľko spôsobov, ako získať vstupy používateľov pomocou máp akcií.
Kliknite pravým tlačidlom myši na ľubovoľný priečinok v projekte a vytvorte vstupnú akciu.
Umiestnenie priečinka, ktorý sa má vytvoriť, je ľubovoľné, ale spravujte ho podľa vášho projektu.
Názov súboru je tiež ľubovoľný, ale tu InputActionSample
je .
Keď dvakrát kliknete na vytvorený súbor, zobrazí sa nasledujúce okno.
Najprv kliknite na tlačidlo + v Mapách akcií a vytvorte mapu akcií. Ak sa obsah operácie ako tvorivej jednotky mení v závislosti od scény, bude definovaný v tejto jednotke. Napríklad v prípade akčnej hry s bočným posúvaním sa obsah operácie mení počas akcie a v ponuke, takže pre každú vytvoríte akčnú mapu.
Tu ako príklad definujeme akciu bočného posúvania a pomenujeme ju "SideScrollActionMap".
Potom vytvorte akcie. Keďže ide o ukážku, nebudem ich robiť veľa, ale tu vytvoríme akcie "Move" pre pohyb a "Attack" pre útok. Keďže jeden už bol vytvorený, zmeňte názov alebo vytvorte nový, kliknite na tlačidlo + v pravom hornom rohu a zadajte ho.
Najprv nakonfigurujte konfiguráciu Presunúť. Ovládač predpokladá, že používate páčku, smerový ovládač a kurzorové klávesy klávesnice. V prípade akcie bočného posúvania existujú prípady, keď sa používajú iba doľava a doprava, ale tu predpokladáme, že používate štyri smery, ktoré zvažujú skákanie horným tlačidlom a krčenie klávesom nadol.
Keď vyberiete možnosť Premiestniť, vpravo sa zobrazí výber typu akcie, takže ho nastavte na "Hodnota".
Nižšie uvidíte Typ ovládacieho prvku, preto vyberte možnosť Vector2. Je to preto, že horná a dolná časť sú priradené k Y a ľavá a pravá sú priradené k X.
Potom vyberte kľúč, ktorý chcete priradiť k tejto udalosti. V strede vyberte položku Bez väzby a vpravo vyberte položku Cesta. Tu vyberieme GamePad LeftStick.
To viaže ľavú páčku GamePadu na pohyb.
Ak chcete viazať aj iné ovládače, vyberte možnosť "Pridať väzbu" z tlačidla + napravo od položky Presunúť.
Teraz, keď je pridaná žiadna väzba, priradíme GamePadu Dpad.
Týmto spôsobom môžete pridať typ ovládača, ktorý chcete podporovať, ako aj kľúče a páčky. Je tiež možné ho nastaviť špeciálne pre konkrétnu hernú konzolu.
Páčky a ovládače Dpad sú tlačidlá, ktoré predpokladajú hore, dole, doľava a doprava, takže ich možno pridať s týmto, ale v prípade klávesníc sú to všetky jednotlivé klávesy, takže neexistuje definícia pre hore, dole, doľava a doprava. Ak chcete nastaviť klávesnicu nahor, nadol, doľava alebo doprava, pomocou tlačidla + vyberte položku Pridať nadol, doľava, doprava, zložené.
Potom sa pridá 2D vektor a môžete ho priradiť ku každému hore dole zľava doprava, ako je znázornené na obrázku nižšie.
Ak napríklad používate kláves Nahor, nastavte na klávesnici šípku nahor. Mimochodom, ak máte problémy nájsť kľúč, môžete ho ľahko vybrať stlačením cieľového tlačidla a kliknutím na tlačidlo "Počúvať".
Položka Nahor je teraz nastavená na šípku nahor.
Podobne nastavte Nadol, Vľavo a Vpravo a máte hotovo.
Samozrejme, je možné nastaviť nielen kurzorové klávesy, ale aj kláves WASD.
Potom nakonfigurujte útok. Útok je ľahké priradiť, pretože je to jedno tlačidlo. Najprv vyberte položku Útok a uistite sa, že položka Typ akcie je tlačidlo.
Potom vyberte položku Bez väzby a z cesty vyberte tlačidlo, ktoré chcete priradiť.
Ak chcete pridať ďalšie, vyberte "Pridať väzbu" z tlačidla +.
Pridajte toľko, koľko potrebujete. Keďže sa s klávesnicou zaobchádza ako s tlačidlom, je možné ju nastaviť rovnakým spôsobom ako herný ovládač.
Po dokončení všetkých nastavení uložte kliknutím na tlačidlo "Uložiť aktívum". Toto okno môžete zavrieť.
Nakoniec, so súborom vstupov projektu (v tomto prípade súborom InputActionSample, ktorý ste vytvorili skôr), skontrolujte "Generovať triedu C#" v inšpektorovi. Parameter bude pridaný, ale kliknite na tlačidlo "Použiť" tak, ako je.
Tým sa vygeneruje súbor skriptu s rovnakým názvom. Obsahuje triedy, ktoré sú užitočné na používanie akčných máp z programov.
Ako prijímať vstupné informácie
Existuje niekoľko spôsobov, ako získať vstup na základe mapy akcií. Tento tip vysvetľuje tri vzory, ale pri vytváraní hry je lepšie zamerať sa na jeden z nich. Ak ich použijete samostatne, bude ťažké ich spravovať.
Ak v jednej scéne použijete viacero metód prijímania vstupu, spracovanie môže byť interne v konflikte a nemusí fungovať správne.
Prijímanie vstupných informácií v okne Odosielanie správ
Prvou metódou je, ako prijímať vstupné informácie v časti "Odoslať správy".
Tentokrát chcem zobraziť zadané informácie v texte, takže umiestnim textový objekt.
Keďže sa tento tip pokúsi získať viac vstupných informácií, vytvoríme prázdny objekt na samostatné nastavenie komponentu. Názov môže byť čokoľvek.
Potom pridajte komponent Vstup prehrávača do prázdneho objektu. Player Input je dôležitou súčasťou pre prepojenie akčných máp a skriptov.
V časti "Pridať komponent" sa v kategórii "Vstup" nachádza "Vstup hráča", preto ho pridajte.
Po pridaní súčasti Vstup prehrávača nastavte mapu akcií, ktorú ste vytvorili v časti "Akcie". Presuňte ho z projektu alebo ho vyberte pomocou ikony + vpravo.
Overte, či je predvolená mapa tá, ktorú ste vytvorili v mape akcií.
Overte, či je Správanie "Odoslať správy".
Potom vytvorte skript. Názov súboru môže byť čokoľvek, ale tu InputSendMessage
je .
Skript vyzerá takto:
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public class InputSendMessage : MonoBehaviour
{
<summary>情報を表示させるテキストオブジェクト。</summary>
[SerializeField] private Text TextObject;
<summary>
Move アクションが実行されたときに呼ばれる。
</summary>
<param name="inputValue">入力量。</param>
public void OnMove(InputValue inputValue)
{
var vec = inputValue.Get<Vector2>();
TextObject.text = $"Move:({vec.x:f2}, {vec.y:f2})\n{TextObject.text}";
}
<summary>
Attack アクションが実行されたときに呼ばれる。
</summary>
public void OnAttack(InputValue inputValue)
{
TextObject.text = $"Attack:{inputValue.isPressed}\n{TextObject.text}";
}
}
- Objekt má pripojený vstup prehrávača, ktorý nastavuje funkciu Odosielať správy
- Dedenie z MonoBehaviour
Ak sú splnené podmienky, potom ak definujete metódu s názvom "OnXXXXXXXX", Cieľová metóda sa vyvolá pri vykonaní zadanej akčnej operácie. "XXXXXXXX" je názov akcií vytvorených v mape akcií. Tu sme vytvorili akcie "Move" a "Attack", takže názvy metód sú "OnMove" a "OnAttack".
OnMove
Zadanú sumu môžete získať z argumentu InputValue
.
Keďže Typ ovládacieho prvku je nastavený na "Vektor 2", vstupná hodnota InputValue.Get<Vector2>
bude prijatá v .
OnAttack
InputValue.isPressed
Môžete tiež zistiť, či tlačíte.
Po uložení skript priložte k objektu, ktorý obsahuje súčasť Vstup prehrávača. Nastavte aj textový objekt na zobrazenie.
Spustite hru a pozrite sa. Tentokrát som zahrnul definíciu gamepadu a klávesnice, takže by to malo fungovať bez ohľadu na to, ktorý z nich používate.
Ako vidíte, keď ho presuniete, môžete vidieť, že metóda sa volá iba vtedy, keď dôjde k zmene hodnoty z predchádzajúceho stavu.
Napríklad pri pohybe palice doľava sa nazýva cieľavedome, ale nie doľava (- OnMove
1,0). OnMove
Tlačidlo Útok tiež reaguje iba v okamihu, keď je stlačené, a ak je stlačené a podržané, metóda sa nevolá.
Preto si myslím, že ideálnym použitím nie je vykonávať spracovanie hry, keď sa volá OnXXXXXXXX, ale ponechať iba vstupný obsah a použiť tieto hodnoty pri spracovaní aktualizácie hry.
Mimochodom, v aktuálnom stave sa nevolá, keď je tlačidlo uvoľnené, takže nie je možné určiť, kedy OnAttack
je tlačidlo uvoľnené.
Ak chcete na to reagovať, vyberte akciu útoku, ktorá definuje tlačidlo v nastaveniach mapy akcií a pridajte "Stlačiť" z časti "Interakcie".
Potom nastavte správanie spúšťača pridaného lisu na "Press And Release" a uložte ho.
Po spustení môžete vidieť, že sa volá, aj keď OnAttack
je tlačidlo uvoľnené.
isPressed
false
Keďže sa stáva , je tiež možné určiť, či ide o načasovanie uvoľnenia.
Mimochodom, prosím, vymažte túto interakciu, pretože sa v budúcnosti nebude používať.
Prijímajte vstupy pomocou udalostí Invoke Unity
Druhým spôsobom, ako získať vstup, je Vyvolať udalosti jednoty, takže to skúsime. Ako je uvedené vyššie, používanie viacerých metód vstupu môže spôsobiť konfliktné spracovanie, takže ak je povolené iné spracovanie, vypnite ho.
Najprv umiestnite textový objekt tak, aby sa mohli zobraziť vstupné informácie.
Vyvolať udalosti jednoty vytvorí prázdny objekt, ktorý vykonáva súvisiace operácie.
Pridajte vstup > vstup prehrávača do prázdneho objektu.
Nastavte súbor mapy akcií, ktorý ste vytvorili pre Akcie (v tomto prípade InputActionSample), a nastavte mapu akcií, ktorú ste vytvorili (v tomto prípade SideScrollActionMap), na hodnotu Predvolená mapa. Nastavte správanie na vyvolanie udalostí jednoty.
Vytvorte skript. Názov je ľubovoľný, ale v tomto prípade InputInvokeUnityEvents
je to .
Skript vyzerá takto:
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public class InputInvokeUnityEvents : MonoBehaviour
{
<summary>情報を表示させるテキストオブジェクト。</summary>
[SerializeField] private Text TextObject;
<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}";
}
}
Názov OnMove
OnAttack
metódy, ktorý sa volá, keď s ním používateľ interaguje, je , ako v prípade Odoslať správy.
V časti Vyvolanie udalostí jednoty môžete nastaviť tento názov metódy, ako sa vám páči.
Keď sa každý z nich vyvolá, odovzdá sa ako InputAction.CallbackContext
argument, takže odtiaľ môžete získať stav vstupu.
Ak v akcii nastavíte "hodnotu", môžete ju prijať v metóde a ak nastavíte ReadValue
ReadValueAsButton
"tlačidlo", môžete ju dostať v metóde.
Po uložení skriptu pripojte vstup prehrávača k nastavenému objektu a nastavte objekt zobrazovaného textu.
Potom rozbaľte "Udalosť" a "Názov mapy akcií (SideScrollActionMap)" v Player Input a mali by ste vidieť akcie "Move" a "Attack", ktoré ste vytvorili.
Najprv kliknite na tlačidlo + na Presunúť a pridajte ho.
Objekt v ľavom dolnom rohu je váš vlastný objekt a funkcia je nastavená na metódu, ktorú ste práve vytvorili OnMove
.
Nakonfigurujte aj udalosť útoku.
Spustite hru a zistite, ako funguje.
V zásade sa volá iba vtedy, keď sa zmení rovnaká hodnota ako pri odosielaní správ, ale z nejakého dôvodu môže byť metóda volaná dvakrát súčasne. Nepoznám príčinu, ale myslím si, že je to pravdepodobne preto, že štartovací proces a kontinuálny proces bežia súčasne. Myslím si však, že nie je problém, ak ponecháte iba zadanú hodnotu ako v prípade Odoslať správy a samotné spracovanie hry vykonáte samostatne v procese aktualizácie.
Použitie automaticky generovaného skriptu na prijímanie vstupných informácií
Tretia časť popisuje, ako získať vstupné informácie pomocou skriptu vygenerovaného zo súboru mapy akcií.
Keďže existuje možnosť konfliktu s inými akvizičnými procesmi, vypnite iné akvizičné procesy.
Umiestnite textový objekt na zobrazenie vstupných informácií.
Vytvorte tiež prázdny objekt na načítanie vstupných informácií. Tento článok používa automaticky generovaný skript, takže nemusíte pridávať vstup hráča.
Skript automaticky generovaný z mapy akcií je len knižnica, preto vytvorte samostatný ovládací skript.
Názov je ľubovoľný, ale v tomto prípade InputScript
je to .
Skript vyzerá takto:
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public class InputScript : MonoBehaviour
{
<summary>情報を表示させるテキストオブジェクト。</summary>
[SerializeField] private Text TextObject;
<summary>アクションマップから自動生成されたクラス。</summary>
private InputActionSample _actionMap;
private void Awake()
{
// 各操作を行ったときに呼ばれるイベントを設定する
_actionMap = new InputActionSample();
_actionMap.SideScrollActionMap.Move.performed += context => OnMove(context);
_actionMap.SideScrollActionMap.Attack.performed += context => OnAttack(context);
}
private void OnEnable()
{
// このオブジェクトが有効になったときにアクションマップを有効にする
_actionMap.Enable();
}
private void OnDisable()
{
// このオブジェクトが無効になったときにアクションマップが余計な動作を起こさないように無効にする
_actionMap.Disable();
}
<summary>
Move 操作をした時に呼ばれるメソッドです。
</summary>
<param name="context">コールバックパラメータ。</param>
public void OnMove(InputAction.CallbackContext context)
{
// Move の入力量を取得
var vec = context.ReadValue<Vector2>();
TextObject.text = $"Move:({vec.x:f2}, {vec.y:f2})\n{TextObject.text}";
}
<summary>
Attack 操作をした時に呼ばれるメソッドです。
</summary>
<param name="context">コールバックパラメータ。</param>
public void OnAttack(InputAction.CallbackContext context)
{
// Attack ボタンの状態を取得
var value = context.ReadValueAsButton();
TextObject.text = $"Attack:{value}\n{TextObject.text}";
}
}
Definujte automaticky generovanú triedu InputActionSample
z mapy akcií v poli.
Táto trieda definuje každú množinu akcií v mape akcií a môžete nastaviť udalosti, ktoré sa vyvolajú pri vykonávaní týchto akcií.
Awake
V metóde InputActionSample
sa vytvorí inštancia a nastaví sa udalosť volaná v čase akcie.
Keď OnMove
vykonáte tieto operácie, metóda , OnAttack
sa teraz nazýva.
Keďže tu však nastavujeme iba udalosť, musíme zavolať metódu, keď Enable
je volaná, aby sme OnEnable
povolili akčnú mapu.
Keďže vstupné správanie používateľa sa považuje za globálnu operáciu,
Aby sme zabránili OnDisable
tomu, aby mapa akcií po zrušení platnosti tohto objektu robila niečo navyše, zavoláme metódu v Disable
metóde na jeho zakázanie.
Po uložení skriptu ho pripojte k prázdnemu objektu, ktorý ste vytvorili, a nastavte textový objekt na zobrazenie.
Spustite hru a zistite, ako funguje.
Ako vidíte, metóda sa nevolá, keď OnMove
sa operácia Move stane (0, 0).
Nie som si istý prečo, ale zdá sa, že vykonaná udalosť v skutočnosti trvá iba udalosť s povolenými stlačeniami klávesov.
Mimochodom, ak ste v akčnej mape pre útok nenastavili interakcie, po uvoľnení tlačidla sa nezavolá OnAttack
.
Aby ste to zvládli canceled
, musíte nastaviť udalosť.
Ak nechcete vykonať špeciálne spracovanie pri (0, 0), môžete zavolať metódu tak, ako je OnMove
. To isté platí pre Attack.
private void Awake()
{
// 各操作を行ったときに呼ばれるイベントを設定する
_actionMap = new InputActionSample();
_actionMap.SideScrollActionMap.Move.performed += context => OnMove(context);
_actionMap.SideScrollActionMap.Attack.performed += context => OnAttack(context);
_actionMap.SideScrollActionMap.Move.canceled += context => OnMove(context); // 追加
_actionMap.SideScrollActionMap.Attack.canceled += context => OnAttack(context); // 追加
}
Spustite a overte, či sa zobrazuje hodnota Move:(0, 0) alebo Attack:False.