Uporaba akcijskih zemljevidov za dodeljevanje gumbov vedenju iger

Stran posodobljena :
Datum ustvarjanja strani :

Okolje za preverjanje

Windows
  • Windows 11
Urejevalnik enotnosti
  • 2020.3.25f1
Paket vhodnega sistema
  • 1.2.0

Predpogoji za to konico

Naslednje nastavitve so bile vnaprej narejene kot predpostavka za opis tega namiga.

O akcijskih zemljevidih

Uporabniški vnosni programi na tipkovnicah, miših in igralnih ploščicah so v bistvu naveli, da je bilo določeno dejanje izvedeno ob pritisku gumba. Na akcijskem zemljevidu lahko na primer določite dejanje »skoka« in mu dodelite gumbe krmilnika in tipke na tipkovnici. Zato mora program opisati postopek šele, ko se izvede določeno dejanje. Tudi če dodelite gumb na drugem krmilnik kot poučiti, ga lahko uporabite, ne da bi spremenili operacijski program.

Ustvarjanje akcijskega zemljevida

Tukaj želim ustvariti akcijski zemljevid in prikazati vnosne podatke uporabnika v besedilo. Z akcijskim zemljevidom je na voljo več načinov za dostop do uporabniškega vnosa.

Z desno tipko miške kliknite katero koli mapo v projektu, da ustvarite vnosno dejanje. Lokacija mape, ki jo želite ustvariti, je samovoljna, vendar jo upravljajte v skladu s projektom. Ime datoteke je tudi samovoljno, ampak tukaj InputActionSample je .

Ko dvokliknete ustvarjeno datoteko, se prikaže to okno.

Najprej kliknite gumb + v akcijskih zemljevidih, da ustvarite akcijski zemljevid. Če se vsebina operacije spremeni glede na prizorišče, bo kot enota za ustvarjanje opredeljena v tej enoti. V primeru stranske akcijske igre se na primer vsebina operacije med dejanjem in v meniju spremeni, tako da boste za vsakega ustvarili akcijski zemljevid.

Tukaj kot primer določimo stransko pomikanje dejanje in ga imenujemo "SideScrollActionMap".

Nato ustvarite Dejanja. Ker gre za vzorec, jih ne bom naredil veliko, tukaj pa bomo ustvarili "Move" akcije za gibanje in "Napad" za napad. Ker je bil eden že ustvarjen, spremenite ime ali ustvarite novo, kliknite gumb + v zgornjem desnem kotu in ga vnesite.

Najprej konfigurirajte konfiguracijo »Premakni«. Krmilnik predpostavi, da uporabljate tipke s palico, D-ploščico in kazalcem tipkovnice. V primeru stranske akcije drsenje, obstajajo primeri, kjer se uporabljajo le levo in desno, vendar tukaj predvidevamo, da uporabljate štiri smeri, ki razmišljajo o skoku z zgornjim ključem in prikrivanje s tipko navzdol.

Ko izberete Premakni, je na desni strani izbrana vrsta dejanja, zato nastavite na »Vrednost«.

Spodaj boste videli vrsto kontrolnika, zato izberite Vektor2. To je zato, ker sta vrh in dno dodeljena Y, levi in desni pa X.

Nato izberite ključ, ki ga želite dodeliti temu dogodku. Na sredini izberite Brez vezave in na desni izberite Pot. Tukaj izberemo GamePad LeftStick.

To za potezo poveže levi gumb GamePada.

Če želite vezati tudi druge krmilnike, izberite »Dodaj vezavo« z gumba + desno od možnosti Premakni.

Zdaj, ko je dodano polje Brez vezave, dodelimo Dpad za GamePad.

Na ta način lahko dodate vrsto krmilnika, ki ga želite podpreti, pa tudi tipke in palice. Prav tako je mogoče nastaviti posebej za določeno igralno konzolo.

Palice in Dpads so gumbi, ki predvidevajo gor, dol, levo in desno, tako da jih je mogoče dodati s tem, vendar v primeru tipkovnic, so vse enojne tipke, tako da ni definicije za gor, dol, levo in desno. Če želite nastaviti tipkovnico navzgor, navzdol, levo ali desno, iz gumba + izberite Dodaj navzdol levo desno sestavljeno.

Nato bo dodan 2D vektor in ga lahko dodelite vsakemu gor navzdol levo desno, kot je prikazano na spodnji sliki.

Če na primer uporabljate Gor, nastavite »Puščico navzgor« na tipkovnici. Mimogrede, če ste težavni za iskanje ključa, ga lahko preprosto izberete tako, da pritisnete ciljno tipko, medtem ko kliknete gumb "Poslušaj".

Navzgor je zdaj nastavljeno na Puščico navzgor.

Podobno nastavite navzdol, levo in desno in končali ste.

Seveda je mogoče nastaviti ne le tipke kazalca, temveč tudi WASD.

Nato konfigurirajte Napad. Napad je enostavno dodeliti, ker je en sam gumb. Najprej izberite Napad in se prepričajte, da je vrsta dejanja gumb.

Nato izberite Brez vezave in izberite gumb, ki ga želite dodeliti v poti.

Če želite dodati več, na gumbu + izberite »Dodaj vezavo«.

Dodajte toliko, kolikor jih potrebujete. Ker se obravnava kot gumb, lahko tipkovnico nastavite na enak način kot krmilnik igre.

Ko so vse nastavitve dokončane, kliknite »Shrani sredstvo« za shranjevanje. To okno lahko zaprete.

Nazadnje, z inputactions datoteko projekta (v tem primeru, InputActionSample datoteko, ki ste jo ustvarili prej), preverite "Ustvari C # Razred" v inšpektorju. Parameter bo dodan, vendar kliknite gumb "Uporabi" kot je.

Tako boste ustvarili skriptno datoteko z istim imenom. Vsebuje razrede, ki so uporabni za uporabo akcijskih zemljevidov iz programov.

Prejemanje vhodnih informacij

Vnos je na voljo na več načinov, ki temeljijo na akcijskem zemljevidu. Ta nasvet pojasnjuje tri vzorce, vendar je bolje, da se osredotočite na enega od njih, ko dejansko izdelavo igre. Če jih uporabljate ločeno, bo težavno upravljati.

Če uporabljate več načinov sprejemanja vnosov v enem prizoru, se lahko obdelava interno spopada in ne deluje pravilno.

Prejemanje vhodnih informacij v pošlji sporočila

Prvi način je, kako prejemati vhodne informacije v »Pošlji sporočila«.

Tokrat želim prikazati vnesene podatke v besedilo, zato bom vnesla besedilni predmet.

Ker bo ta namig poskušal dobiti več vhodnih informacij, bomo ustvarili prazen predmet, da nastavite komponento posebej. Ime je lahko karkoli.

Nato dodajte komponento vnosa predvajalnika v prazen predmet. Vnos predvajalnika je pomembna komponenta za povezovanje akcijskih zemljevidov in skriptov.

V »Dodaj komponento« je v kategoriji »Vnos« »Vnos« »Player« »Vhod«, zato ga dodajte.

Ko je komponenta vnosa predvajalnika dodana, nastavite akcijski zemljevid, ki ste ga ustvarili v »Dejanja«. Spustite ga iz projekta ali ga izberite iz ikone + na desno.

Preverite, ali je privzeti zemljevid tisti, ki ste ga ustvarili na akcijskem zemljevidu.

Preverite, ali je vedenje »Pošiljanje sporočil«.

Nato ustvarite skript. Ime datoteke je lahko karkoli, ampak tukaj InputSendMessage je .

Scenarij izgleda takole:

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}";
  }
}
  • Predmet ima priložen vnos predvajalnika, ki določa Pošiljanje sporočil
  • Dedovanje iz MonoBehaviour

Če so pogoji izpolnjeni, potem če določite metodo imenovano "OnXXXXXXXX", Ciljna metoda bo poklicana, ko se izvede navedena operacija dejanja. »XXXXXXXX« je ime dejanj, ustvarjenih na akcijskem zemljevidu. Tukaj smo ustvarili dejanja »Move« in »Attack«, zato sta imena metod »OnMove« oziroma »OnAttack«.

OnMove Znesek lahko vnesete iz argumenta InputValue . Ker je vrsta kontrolnika nastavljena na "Vektor 2", InputValue.Get<Vector2> bo vhodna vrednost prejeta v .

OnAttackInputValue.isPressed Lahko dobiš tudi, ali pritisneš noter.

Ko skript shranite, ga priložite predmetu, ki ima komponento vnosa predvajalnika. Nastavite tudi besedilni predmet za prikaz.

Zaženi igro in poglej. Tokrat sem vključil definicijo igralne ploščice in tipkovnice, tako da bi morala delovati ne glede na to, kateri delujete.

Kot lahko vidite, ko ga premaknete, lahko vidite, da je metoda poklicana samo takrat, ko pride do spremembe vrednosti iz prejšnjega stanja. Med premikanjem palice na primer na levo se imenuje enoumno, ne pa levo (- OnMove 1,0). OnMove Gumb Attack se odziva tudi samo v trenutku, ko je pritisnjena, in če je pritisnjena in zadržana, metoda ni poklicana.

Zato menim, da idealna uporaba ni izvajanje obdelave igre, ko se imenuje OnXXXXXXXX, ampak obdržati samo vhodne vsebine in uporabiti te vrednosti v obdelavi posodobitev igre.

Mimogrede, v trenutnem stanju se ne kliče, ko je gumb izpuščen, OnAttack zato ni mogoče ugotoviti, kdaj je gumb izpuščen. Če se želite odzvati na to, izberite dejanje Napad, ki definira gumb v nastavitvah akcijskega zemljevida in dodajte »Pritisnite« iz »Interakcije«. Nato nastavite sprožilno vedenje dodanega Pritisnite na "Press And Release" in ga shranite.

Ko se izvrši, lahko vidite, OnAttack da se imenuje tudi, ko je gumb sproščen. isPressed false Odkar postane , je mogoče ugotoviti tudi, ali je to čas sprostitve.

Mimogrede, izbrišite to interakcijo, ker se v prihodnosti ne bo uporabljala.

Prejemanje vnosa z dogodki Invoke Unity

Drugi način za prejemanje vnosa je Invoke Unity Events, zato poskusimo s tem. Kot je navedeno zgoraj, lahko uporaba več načinov vnosa povzroči nasprotujočo se obdelavo, tako da če je omogočena druga obdelava, jo onemogočite.

Najprej postavite besedilni predmet, da se lahko prikažejo vhodni podatki.

Prigovarjanje dogodkov enotnosti ustvari prazen predmet, ki izvaja povezane operacije.

Dodajte vhodni > vnos predvajalnika v prazen predmet.

Nastavite datoteko akcijskega zemljevida, ki ste jo ustvarili za dejanja (v tem primeru InputActionSample) in nastavite akcijski zemljevid, ki ste ga ustvarili (v tem primeru SideScrollActionMap) na Privzeti zemljevid. Nastavite vedenje tako, da se privaja na dogodke enotnosti.

Ustvarite skript. Ime je samovoljno, v tem primeru InputInvokeUnityEvents pa je .

Scenarij izgleda takole:

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

Ime metode, OnMoveOnAttack ki se imenuje, ko uporabnik sodeluje z njim, je , kot v primeru Pošiljanje sporočil. V možnosti Dogodki enotnosti privolite, lahko nastavite to ime metode, kot želite.

Ko je vsaka poklicana, InputAction.CallbackContext se prenese kot argument, tako da lahko od tam dobiš stanje vnosa. Če v dejanju nastavite »vrednost«, jo lahko prejmete v metodi in ReadValue ReadValueAsButton če nastavite »gumb«, jo lahko prejmete v metodi.

Po shranjevanju skripta priložite vnos predvajalnika predmetu, ki ga nastavljate, in nastavite predmet besedila zaslona.

Nato razširite »Dogodek« in »Ime zemljevida dejanj (SideScrollActionMap)« v vnosu predvajalnika in videti morate dejanja »Premakni« in »Napad« , ki ste jih ustvarili.

Najprej kliknite gumb + na Premakni, da ga dodate.

Predmet v spodnjem levem kotu je vaš predmet, funkcija pa je nastavljena na način, ki ste ga pravkar ustvarili OnMove .

Konfigurirajte tudi dogodek Napad.

Zaženite igro, da vidite, kako deluje.

V bistvu se imenuje samo takrat, ko se spremeni ista vrednost kot Pošiljanje sporočil, vendar se lahko iz nekega razloga metoda imenuje dvakrat hkrati. Vzroka ne poznam, ampak mislim, da je verjetno zato, ker se začetni proces in neprekinjeni proces izvajata hkrati. Vendar pa mislim, da ni nobenih težav, če obdržiš samo vneseno vrednost kot v primeru pošiljanja sporočil in izvajaš dejansko obdelavo igre ločeno v postopku posodobitve.

Uporaba samodejnega generiranega skripta za prejemanje vhodnih informacij

V tretjem razdelku je opisano, kako pridobiti vhodne informacije s skriptom, ustvarjenim iz datoteke zemljevida dejanj.

Ker obstaja možnost navzkrižja z drugimi postopki prevzema, onemogočite druge postopke pridobivanja.

Postavite besedilni predmet, da prikažete vhodne informacije.

Ustvarite tudi prazen predmet za pridobivanje vhodnih informacij. Ta članek uporablja samodejni skript, zato vam ni treba dodajati vnosa predvajalnika.

Skript, ki je samodejno ustvarjen iz akcijskega zemljevida, je le knjižnica, zato ustvarite ločen kontrolni skript. Ime je samovoljno, v tem primeru InputScript pa je .

Scenarij izgleda takole:

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

Določite samodejni generirani razred InputActionSample iz akcijskega zemljevida v polju. Ta razred določa vsako dejanje, ki je nastavljeno na zemljevidu dejanj, in lahko nastavite dogodke, ki se imenujejo, ko se ta dejanja izvajajo.

Awake V metodi se InputActionSample ustvari primerek in se nastavi dogodek, ki se imenuje ob dejanju. Ko izvedete OnMovete operacije, se zdaj imenuje metoda – OnAttack .

Ker pa smo dogodek nastavili samo tukaj, OnEnable Enable moramo poklicati metodo, ko je poklicana, da omogočimo akcijski zemljevid.

Ker se vedenje uporabnikovega vnosa obravnava kot globalna operacija, Če želite preprečiti OnDisable , da bi akcijska karta naredila dodatno, potem ko je ta predmet neveljaven, Disable pokličemo metodo v metodi, da jo onemogočimo.

Po shranjevanju skripta ga priložite praznemu predmetu, ki ste ga ustvarili, in nastavite besedilni predmet za prikaz.

Zaženite igro, da vidite, kako deluje.

Kot vidite, metoda ni poklicana, OnMove ko se operacija Premakne (0, 0). Nisem prepričan, zakaj, vendar se zdi, da izvedeni dogodek samo dejansko vzame tisti z omogočenimi pritiski na tipke.

Mimogrede, če na akcijski zemljevid za Napad niste nastavili interakcij, OnAttack se ne bo klical, ko spustite gumb.

Če želite canceled to rešiti, morate nastaviti dogodek. Če ne želite izvesti posebne obdelave na (0, 0), lahko pokličete metodo, kot je OnMove . Enako velja za Napad.

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

Zaženite in preverite, ali se prikaže Move:(0, 0) ali Attack:False.