Darbību karšu izmantošana, lai piešķirtu pogas spēļu uzvedībai

Lapa atjaunota :
Lapas izveides datums :

Verifikācijas vide

Windows
  • Operētājsistēmā Windows 11
Vienotības redaktors
  • 2020.3.25f1
Ievades sistēmas pakete
  • 1.2.0

Priekšnoteikumi šim padomam

Tālāk norādītie iestatījumi ir veikti iepriekš kā priekšnoteikums šī padoma aprakstam.

Par darbību kartēm

Lietotāju ievades programmas uz tastatūrām, pelēm un spēļu paliktņiem būtībā norādīja, ka, nospiežot pogu, tika veikta noteikta darbība. Piemēram, darbības kartē varat definēt "lekt" darbību un piešķirt tai kontroliera pogas un tastatūras taustiņus. Tā rezultātā programmai ir jāapraksta process tikai tad, kad tiek veikta konkrēta darbība. Pat ja jūs piešķirat pogu citam kontrolierim kā pārdomas, varat to lietot, nemainot operētājsistēmu.

Rīcības kartes izveide

Šeit es vēlētos izveidot darbības karti un tekstā parādīt lietotāja ievades informāciju. Ir vairāki veidi, kā iegūt lietotāju ievadi, izmantojot darbību kartes.

Ar peles labo pogu noklikšķiniet uz jebkuras projekta mapes, lai izveidotu ievades darbību. Izveidojamās mapes atrašanās vieta ir patvaļīga, taču, lūdzu, pārvaldiet to atbilstoši savam projektam. Faila nosaukums ir arī patvaļīgs, bet šeit InputActionSample tas ir .

Veicot dubultklikšķi uz izveidotā faila, tiks parādīts šāds logs.

Vispirms noklikšķiniet uz pogas + sadaļā Darbību kartes, lai izveidotu rīcības karti. Ja operācijas saturs mainās atkarībā no notikuma vietas, tā kā izveides vienība tiks definēta šajā vienībā. Piemēram, sānu ritināšanas darbības spēles gadījumā operācijas saturs mainās darbības laikā un izvēlnē, tāpēc jūs katram izveidosit darbības karti.

Šeit, piemēram, mēs definējam sānu ritināšanas darbību un nosaucam to par "SideScrollActionMap".

Pēc tam izveidojiet darbības. Tā kā tas ir paraugs, es daudzus no tiem neizveidošu, bet šeit mēs izveidosim "Move" darbības kustībai un "Attack" uzbrukumam. Tā kā viens jau ir izveidots, lūdzu, mainiet nosaukumu vai izveidojiet jaunu, noklikšķiniet uz + pogas augšējā labajā stūrī un ievadiet to.

Vispirms konfigurējiet konfigurāciju Pārvietot. Kontrolieris pieņem, ka izmantojat nūjas, D-pad un tastatūras kursora taustiņus. Sānu ritināšanas darbības gadījumā ir gadījumi, kad tiek izmantots tikai kreisais un labais, bet šeit mēs pieņemam, ka jūs izmantojat četrus virzienus, apsverot lēkšanu ar augšējo taustiņu un griešanos ar lejupvērsto taustiņu.

Atlasot Pārvietot, pa labi tiek atlasīts darbības veids, tāpēc iestatiet to uz "Vērtība".

Tālāk redzēsit vadības veidu, tāpēc atlasiet Vector2. Tas ir tāpēc, ka augšējais un apakšējais ir piešķirts Y, bet kreisais un labais ir piešķirts X.

Pēc tam atlasiet atslēgu, kuru vēlaties piešķirt šim notikumam. Vidū atlasiet Bez saistīšanas un labajā pusē atlasiet Ceļš. Šeit mēs izvēlamies GamePad LeftStick.

Tas saista GamePad kreiso nūju ar kustību.

Lai piesaistītu arī citus kontrolierus, izvēlieties "Pievienot saistīšanu" no pogas + pa labi no Pārvietot.

Tagad, kad ir pievienota opcija Bez saistīšanas, mēs GamePad piešķiram GamePad.

Tādā veidā jūs varat pievienot kontroliera veidu, kuru vēlaties atbalstīt, kā arī atslēgas un nūjas. To ir iespējams iestatīt arī īpaši konkrētai spēļu konsolei.

Sticks un Dpads ir pogas, kas pieņem uz augšu, uz leju, pa kreisi un pa labi, tāpēc tās var pievienot ar šo, bet tastatūru gadījumā tās visas ir viena taustiņa, tāpēc nav definīcijas uz augšu, uz leju, pa kreisi un pa labi. Lai iestatītu tastatūru uz augšu, uz leju, pa kreisi vai pa labi, no pogas + atlasiet Add Up Down Left Right Composite (Pievienot augšupvērstu kreiso labo kompozītu).

Pēc tam tiks pievienots 2D vektors, un jūs varat to piešķirt katram augšup lejup pa kreisi pa labi, kā parādīts zemāk redzamajā attēlā.

Piemēram, ja izmantojat augšupvērsto, tastatūrā iestatiet "Augšupvērsto bultiņu". Starp citu, ja jums ir apgrūtinoši atrast atslēgu, varat to viegli izvēlēties, nospiežot mērķa taustiņu, vienlaikus noklikšķinot uz pogas "Klausīties".

Up tagad ir iestatīts uz Augšupvērstā bultiņa.

Līdzīgi iestatiet Uz leju, Pa kreisi un Pa labi, un esat pabeidzis.

Protams, var iestatīt ne tikai kursora taustiņus, bet arī WASD.

Pēc tam konfigurējiet uzbrukumu. Uzbrukumu ir viegli piešķirt, jo tā ir viena poga. Vispirms atlasiet Uzbrukt un pārliecinieties, vai darbības tips ir poga.

Pēc tam atlasiet Bez saistīšanas un atlasiet pogu, kuru vēlaties piešķirt no ceļa.

Ja vēlaties pievienot vairāk, atlasiet "Pievienot saistīšanu" no pogas +.

Pievienojiet tik daudz, cik nepieciešams. Tā kā tas tiek uzskatīts par pogu, tastatūru var iestatīt tāpat kā spēļu kontrolieri.

Kad visi iestatījumi ir pabeigti, noklikšķiniet uz "Saglabāt aktīvu", lai saglabātu. Jūs varat aizvērt šo logu.

Visbeidzot, ar projekta ievades darbību failu (šajā gadījumā iepriekš izveidoto InputActionSample failu) inspektorā atzīmējiet "Ģenerēt C# klasi". Parametrs tiks pievienots, bet noklikšķiniet uz pogas "Lietot", kā tas ir.

Tas ģenerēs skripta failu ar tādu pašu nosaukumu. Tajā ir klases, kas ir noderīgas, lai izmantotu programmu darbības kartes.

Kā saņemt ievades informāciju

Ir vairāki veidi, kā saņemt ievadi, pamatojoties uz darbības karti. Šis padoms izskaidro trīs modeļus, taču, faktiski veidojot spēli, labāk ir koncentrēties uz vienu no tiem. Ja tos izmantosit atsevišķi, būs apgrūtinoši pārvaldīt.

Turklāt, ja vienā ainā izmantojat vairākas ievades saņemšanas metodes, apstrāde var iekšēji konfliktēt un nedarboties pareizi.

Ievades informācijas saņemšana sadaļā Ziņojumu sūtīšana

Pirmā metode šeit ir tas, kā saņemt ievades informāciju sadaļā "Sūtīt ziņojumus".

Šoreiz es vēlos tekstā parādīt ievadīto informāciju, tāpēc es ievietošu teksta objektu.

Turklāt, tā kā šis padoms mēģinās iegūt vairāku ievades informāciju, mēs izveidosim tukšu objektu, lai komponentu iestatītu atsevišķi. Nosaukums var būt jebkas.

Pēc tam tukšajam objektam pievienojiet atskaņotāja ievades komponentu. Atskaņotāja ievade ir svarīgs komponents darbību karšu un skriptu savienošanai.

Sadaļā "Pievienot komponentu" kategorijā "Ievade" ir "Atskaņotāja ievade", tāpēc pievienojiet to.

Kad atskaņotāja ievades komponents ir pievienots, iestatiet darbību karti, ko izveidojāt sadaļā "Darbības". Nometiet to no projekta vai atlasiet to no ikonas + pa labi.

Pārbaudiet, vai noklusējuma karte ir tā, kuru izveidojāt darbības kartē.

Pārbaudiet, vai darbība ir "Sūtīt ziņojumus".

Pēc tam izveidojiet skriptu. Faila nosaukums var būt jebkas, bet šeit InputSendMessage tas ir .

Skripts izskatās šādi:

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}";
  }
}
  • Objektam ir pievienota atskaņotāja ievade, kas iestata sūtīt ziņojumus
  • Pārmantošana no MonoBehaviour

Ja nosacījumi ir izpildīti, tad, ja definējat metodi ar nosaukumu "OnXXXXXXXX", Mērķa metode tiks izsaukta, kad tiek veikta norādītā darbības darbība. "XXXXXXXX" ir darbības kartē izveidoto darbību nosaukums. Šeit mēs esam izveidojuši darbības "Move" un "Attack", tāpēc metožu nosaukumi ir attiecīgi "OnMove" un "OnAttack".

OnMove Ievadīto summu var iegūt no argumenta InputValue . Tā kā kontroles tips ir iestatīts uz "Vector 2", ievades vērtība InputValue.Get<Vector2> tiks saņemta .

OnAttackInputValue.isPressed Jūs varat saņemt arī to, vai jūs spiežat iekšā.

Pēc skripta saglabāšanas pievienojiet to objektam, kuram ir atskaņotāja ievades komponents. Iestatiet arī teksta objektu parādīšanai.

Palaidiet spēli un paskatieties. Šoreiz esmu iekļāvis spēļu paneļa un tastatūras definīciju, tāpēc tai vajadzētu darboties neatkarīgi no tā, kuru jūs izmantojat.

Kā redzat, pārvietojot to, jūs varat redzēt, ka metode tiek saukta tikai tad, ja vērtība mainās no iepriekšējā stāvokļa. Piemēram, pārvietojot nūju pa kreisi, to sauc par vienpusīgu, bet ne pa kreisi (- OnMove 1,0). OnMove Uzbrukuma poga arī reaģē tikai tad, kad tā tiek nospiesta, un, ja tā tiek nospiesta un turēta, metode netiek izsaukta.

Tāpēc es domāju, ka ideāls lietojums nav veikt spēļu apstrādi, kad tiek izsaukts OnXXXXXXXX, bet gan saglabāt tikai ievades saturu un izmantot šīs vērtības spēles atjauninājumu apstrādē.

Starp citu, pašreizējā stāvoklī tas netiek izsaukts, kad poga tiek atlaista, tāpēc nav iespējams noteikt, kad OnAttack poga tiek atbrīvota. Lai uz to atbildētu, atlasiet darbību Attack, kas definē pogu darbības kartes iestatījumos, un pievienojiet "Press" no "Interactions". Pēc tam iestatiet pievienotās preses sprūda uzvedību uz "Press And Release" un saglabājiet to.

Kad tas tiek izpildīts, jūs varat redzēt, ka tas tiek izsaukts pat OnAttack tad, kad poga tiek atlaista. isPressed false Tā kā tas kļūst , ir iespējams arī noteikt, vai tas ir atbrīvošanas laiks.

Starp citu, lūdzu, izdzēsiet šo mijiedarbību, jo tā turpmāk netiks izmantota.

Saņemiet ieguldījumu, izmantojot Vienotības notikumu piesaukšanu

Otrs veids, kā saņemt ievadi, ir Izsaukt Vienotības notikumus, tāpēc pamēģināsim šo. Kā minēts iepriekš, vairāku ievades metožu izmantošana var izraisīt konfliktējošu apstrādi, tādēļ, ja ir iespējota cita apstrāde, atspējojiet to.

Vispirms novietojiet teksta objektu tā, lai varētu parādīt ievades informāciju.

Vienības notikumu izsaukšana izveido tukšu objektu, kas veic saistītas darbības.

Pievienojiet tukšajam objektam ievadi > atskaņotāja ievadi.

Iestatiet darbībām izveidoto darbību kartes failu (šajā gadījumā InputActionSample) un iestatiet izveidoto darbību karti (šajā gadījumā SideScrollActionMap) uz Noklusējuma karte. Iestatiet uzvedību, lai izsauktu vienotības notikumus.

Izveidojiet skriptu. Nosaukums ir patvaļīgs, bet šajā gadījumā InputInvokeUnityEvents tas ir .

Skripts izskatās šādi:

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

Metodes nosaukumsOnMoveOnAttack, kas tiek izsaukts, kad lietotājs mijiedarbojas ar to, ir , tāpat kā ziņojumu sūtīšanas gadījumā. Sadaļā Vienotības notikumu izsaukšana varat iestatīt šīs metodes nosaukumu, kā vēlaties.

Kad katrs tiek izsaukts, tas tiek nodots InputAction.CallbackContext kā arguments, lai jūs varētu iegūt ievades statusu no turienes. Ja darbībā iestatāt "vērtību", varat to saņemt metodē, un, ja iestatāt ReadValue ReadValueAsButton "pogu", varat to saņemt metodē.

Pēc skripta saglabāšanas iestatiet iestatītā objekta atskaņotāja ievadi un iestatiet displeja teksta objektu.

Pēc tam izvērsiet "Notikums" un "Darbības kartes nosaukums (SideScrollActionMap)" atskaņotāja ievadē, un jums vajadzētu redzēt izveidotās darbības "Pārvietot" un "Uzbrukt".

Vispirms noklikšķiniet uz pogas + uz Pārvietot, lai to pievienotu.

Objekts apakšējā kreisajā stūrī ir jūsu objekts, un funkcija ir iestatīta uz tikko izveidoto OnMove metodi .

Konfigurējiet arī uzbrukuma notikumu.

Palaidiet spēli, lai redzētu, kā tā darbojas.

Būtībā to sauc tikai tad, ja mainās tāda pati vērtība kā Sūtīt ziņojumus, bet kāda iemesla dēļ metodi var saukt divas reizes vienlaicīgi. Es nezinu cēloni, bet es domāju, ka tas, iespējams, ir tāpēc, ka sākuma process un nepārtrauktais process darbojas vienlaikus. Tomēr es domāju, ka nav problēmu, ja saglabājat tikai ievadīto vērtību, kā tas ir sūtīt ziņojumus, un atjaunināšanas procesā veicat faktisko spēles apstrādi atsevišķi.

Automātiski ģenerēta skripta izmantošana ievades informācijas saņemšanai

Trešajā sadaļā aprakstīts, kā iegūt ievades informāciju, izmantojot skriptu, kas ģenerēts no darbības kartes faila.

Tā kā pastāv iespēja konfliktēt ar citiem iegūšanas procesiem, lūdzu, atspējojiet citus iegūšanas procesus.

Novietojiet teksta objektu, lai parādītu ievades informāciju.

Izveidojiet arī tukšu objektu ievades informācijas izgūšanai. Šajā rakstā tiek izmantots automātiski ģenerēts skripts, tāpēc atskaņotāja ievade nav jāpievieno.

Skripts, kas automātiski ģenerēts no darbības kartes, ir tikai bibliotēka, tāpēc izveidojiet atsevišķu vadības skriptu. Nosaukums ir patvaļīgs, bet šajā gadījumā InputScript tas ir .

Skripts izskatās šādi:

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

Definējiet automātiski ģenerētu klasi InputActionSample no darbības kartes laukā. Šī klase definē katru darbību kopu darbību kartē, un jūs varat iestatīt notikumus, kas tiek izsaukti, kad šīs darbības tiek veiktas.

Awake Metodē tiek izveidots gadījums un tiek iestatīts notikums, InputActionSample kas izsaukts darbības laikā. Veicot OnMovešīs darbības, tagad tiek izsaukta metode , OnAttack .

Tomēr, tā kā mēs šeit tikai iestatām notikumu, mums OnEnable ir jāizsauc metode, kad Enable tā tiek izsaukta, lai iespējotu rīcības karti.

Turklāt, tā kā lietotāja ievades uzvedība tiek uzskatīta par globālu darbību, Lai novērstu OnDisable to, ka darbības karte tiek veikta papildus pēc tam, kad šis objekts ir nederīgs, mēs aicinām Disable metodi metodē, lai to atspējotu.

Pēc skripta saglabāšanas pievienojiet to tukšajam izveidotajam objektam un iestatiet teksta objektu parādīšanai.

Palaidiet spēli, lai redzētu, kā tā darbojas.

Kā redzat, metode netiek izsaukta, kad OnMove operācija Move kļūst (0, 0). Es nezinu, kāpēc, bet šķiet, ka izpildītais notikums faktiski aizņem tikai to, kuram ir iespējoti taustiņsitieni.

Starp citu, ja uzbrukuma darbības kartē neesat iestatījis mijiedarbību, tas netiks izsaukts, kad OnAttack atlaidīsit pogu.

Lai to apstrādātu canceled , jums jāiestata notikums. Ja nevēlaties veikt īpašu apstrādi pie (0, 0), varat izsaukt metodi, kā tas ir OnMove . Tas pats attiecas uz 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);   // 追加
}

Palaidiet un pārbaudiet, vai tiek parādīts Move:(0, 0) vai Attack:False.