Toimintokarttojen avulla voit määrittää painikkeita pelin toiminnalle

Sivu päivitetty :
Sivun luontipäivämäärä :

Varmennusympäristö

Windows
  • Windows 11
Unity-editori
  • 2020.3.25F1
Syöttöjärjestelmän paketti
  • 1.2.0

Tämän vinkin edellytykset

Seuraavat asetukset on tehty etukäteen tämän vinkin kuvauksen lähtökohtana.

Tietoja toimintokartoista

Käyttäjän syöttöohjelmat näppäimistöillä, hiirillä ja peliohjaimilla totesivat periaatteessa, että tietty toiminto suoritettiin, kun painiketta painettiin. Esimerkiksi toimintakartassa voit määrittää "hyppäämisen" toiminnan ja määrittää sille ohjaimen painikkeet ja näppäimistön näppäimet. Tämän seurauksena ohjelman on kuvattava prosessi vain, kun tietty toiminto suoritetaan. Vaikka määrität painikkeen toiselle ohjaimelle jälkikäteen, voit käyttää sitä muuttamatta käyttöohjelmaa.

Toimintakartan luominen

Tässä haluaisin luoda toimintakartan ja näyttää käyttäjän syöttötiedot tekstissä. Käyttäjän syötteen voi saada useilla tavoilla toimintokarttojen avulla.

Napsauta hiiren kakkospainikkeella mitä tahansa projektin kansiota luodaksesi syöttötoiminnon. Luotavan kansion sijainti on mielivaltainen, mutta hallitse sitä projektisi mukaan. Tiedostonimi on myös mielivaltainen, mutta tässä InputActionSample se on .

Kun kaksoisnapsautat luotua tiedostoa, seuraava ikkuna tulee näkyviin.

Napsauta ensin +-painiketta toimintokartoissa luodaksesi toimintokartan. Jos luontiyksikkönä toiminnon sisältö muuttuu näkymän mukaan, se määritetään kyseisessä yksikössä. Esimerkiksi sivuttain vieritettävän toimintapelin tapauksessa toiminnon sisältö muuttuu toiminnan aikana ja valikossa, joten jokaiselle luodaan toimintakartta.

Tässä esimerkkinä määritämme sivuvieritystoiminnon ja annamme sille nimen "SideScrollActionMap".

Luo seuraavaksi Toiminnot. Koska se on näyte, en tee monia niistä, mutta tässä luomme "Siirrä" -toimintoja liikkumista varten ja "Hyökkäys" hyökkäystä varten. Koska sellainen on jo luotu, vaihda nimi tai luo uusi, napsauta + -painiketta oikeassa yläkulmassa ja kirjoita se.

Määritä ensin Siirrä-kokoonpano. Ohjain olettaa, että käytät sauva-, suuntasuunta- ja näppäimistön kohdistinnäppäimiä. Sivuvieritystoiminnon tapauksessa on tapauksia, joissa käytetään vain vasenta ja oikeaa, mutta tässä oletetaan, että käytät neljää suuntaa harkitsemalla hyppäämistä ylemmällä näppäimellä ja kyyristymistä alas-näppäimellä.

Kun valitset Siirrä, oikealla on toimintotyyppivalinta, joten aseta arvoksi "Arvo".

Näet ohjaustyypin alla, joten valitse Vector2. Tämä johtuu siitä, että ylä- ja alaosa on määritetty Y: lle ja vasen ja oikea X: lle.

Valitse sitten avain, jonka haluat määrittää tälle tapahtumalle. Valitse keskeltä Ei sidontaa ja oikealta Polku. Täällä valitsemme GamePad LeftStickin.

Tämä sitoo peliohjaimen vasemman sauvan liikkeeseen.

Jos haluat sitoa myös muita ohjaimia, valitse "Lisää sidonta" Siirrä-kohdan oikealla puolella olevasta +-painikkeesta.

Nyt kun No Binding on lisätty, määritämme Dpadin peliohjaimelle.

Tällä tavalla voit lisätä ohjaimen tyypin, jota haluat tukea, sekä avaimet ja sauvat. On myös mahdollista asettaa se erityisesti tietylle pelikonsolille.

Sauvat ja Dpads ovat painikkeita, jotka olettavat ylös, alas, vasemmalle ja oikealle, joten ne voidaan lisätä tämän kanssa, mutta näppäimistöjen tapauksessa ne ovat kaikki yksittäisiä näppäimiä, joten ylös, alas, vasemmalle ja oikealle ei ole määritelmää. Jos haluat asettaa näppäimistön ylös, alas, vasemmalle tai oikealle, valitse +-painikkeesta Lisää ylös alas vasen oikea komposiitti.

Sitten lisätään 2D-vektori, ja voit määrittää sen jokaiselle ylös alas vasemmalle oikealle, kuten alla olevassa kuvassa näkyy.

Jos esimerkiksi käytät Ylös-painiketta, aseta näppäimistöön "Nuoli ylös". Muuten, jos olet hankala löytää avainta, voit valita sen helposti painamalla kohdenäppäintä napsauttamalla "Kuuntele" -painiketta.

Ylös-asetuksena on nyt Nuoli ylös.

Samoin aseta Alas, Vasen ja Oikea ja olet valmis.

Tietenkin kohdistinnäppäinten lisäksi myös WASD voidaan asettaa.

Määritä seuraavaksi hyökkäys. Hyökkäys on helppo määrittää, koska se on yksi painike. Valitse ensin Hyökkäys ja varmista, että toimintotyyppi on painike.

Valitse sitten Ei sidontaa ja valitse painike, jonka haluat määrittää polusta.

Jos haluat lisätä lisää, valitse + -painikkeesta "Lisää sidonta".

Lisää niin monta kuin tarvitset. Koska sitä käsitellään painikkeena, näppäimistö voidaan asettaa samalla tavalla kuin peliohjain.

Kun kaikki asetukset ovat valmiit, tallenna napsauttamalla "Tallenna omaisuus". Voit sulkea tämän ikkunan.

Lopuksi, projektin inputactions-tiedostossa (tässä tapauksessa aiemmin luomassasi InputActionSample-tiedostossa), valitse inspektorissa "Luo C # Class". Parametri lisätään, mutta napsauta "Käytä" -painiketta sellaisenaan.

Tämä luo samannimisen komentosarjatiedoston. Se sisältää luokkia, jotka ovat hyödyllisiä ohjelmien toimintokarttojen käyttämisessä.

Syöttötietojen vastaanottaminen

On olemassa useita tapoja vastaanottaa palautetta toimintakartan perusteella. Tämä vinkki selittää kolme mallia, mutta on parempi keskittyä yhteen niistä, kun todella teet peliä. Jos käytät niitä erikseen, sitä on hankala hallita.

Jos käytät useita syötteiden vastaanottotapoja yhdessä kohtauksessa, käsittely voi olla ristiriidassa sisäisesti eikä toimi oikein.

Syötetietojen vastaanottaminen Lähetä viestejä -sovelluksessa

Ensimmäinen menetelmä tässä on, miten syöttötiedot vastaanotetaan "Lähetä viestejä" -kohdassa.

Tällä kertaa haluan näyttää syötetyt tiedot tekstissä, joten sijoitan tekstiobjektin.

Koska tämä vinkki yrittää saada useita syöttötietoja, luomme tyhjän objektin komponentin asettamiseksi erikseen. Nimi voi olla mikä tahansa.

Lisää seuraavaksi Player Input -komponentti tyhjään objektiin. Playerin syöttö on tärkeä komponentti toimintokarttojen ja komentosarjojen yhdistämisessä.

"Lisää komponentti" -kohdassa on "Player Input" "Input" -luokassa, joten lisää se.

Kun Player Input -komponentti on lisätty, aseta toimintokartta, jonka loit kohdassa "Toiminnot". Pudota se projektista tai valitse se oikealla olevasta +-kuvakkeesta.

Varmista, että oletuskartta on se, jonka loit toimintokartassa.

Varmista, että toiminta on Lähetä viestejä.

Luo seuraavaksi komentosarja. Tiedostonimi voi olla mikä tahansa, mutta tässä InputSendMessage se on .

Skripti näyttää tältä:

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}";
  }
}
  • Objektiin on liitetty Player-syöte, joka määrittää Lähetä viestejä
  • MonoBehaviorista periytyminen

Jos ehdot täyttyvät, niin jos määrität menetelmän nimeltä "OnXXXXXXXX", Kohdemenetelmää kutsutaan, kun määritetty toimintatoiminto suoritetaan. XXXXXXXX on toimintokartassa luotujen toimintojen nimi. Täällä olemme luoneet "Siirrä" ja "Hyökkäys" -toiminnot, joten menetelmien nimet ovat "OnMove" ja "OnAttack".

OnMove Saat syötetyn summan argumentista InputValue . Koska ohjaustyypiksi on määritetty "Vector 2", syötearvo InputValue.Get<Vector2> vastaanotetaan .

OnAttackInputValue.isPressed Voit myös selvittää, painatko sisään.

Kun olet tallentanut komentosarjan, liitä se objektiin, jossa on Playerin syöttökomponentti. Aseta myös tekstiobjekti näytettäväksi.

Suorita peli ja katso. Tällä kertaa olen sisällyttänyt peliohjaimen ja näppäimistön määritelmän, joten sen pitäisi toimia riippumatta siitä, mitä käytät.

Kuten näette, kun siirrät sitä, näet, että menetelmää kutsutaan vain, kun arvo muuttuu edellisestä tilasta. Esimerkiksi siirrettäessä tikkua vasemmalle sitä kutsutaan määrätietoisesti, mutta ei vasemmalle (- OnMove 1,0). OnMove Hyökkäyspainike reagoi myös vain silloin, kun sitä painetaan, ja jos sitä painetaan ja pidetään, menetelmää ei kutsuta.

Siksi mielestäni ihanteellinen käyttö ei ole suorittaa pelin käsittelyä, kun OnXXXXXXXX kutsutaan, vaan säilyttää vain syötetty sisältö ja käyttää näitä arvoja pelin päivityskäsittelyssä.

Muuten, nykyisessä tilassa sitä ei kutsuta, kun painike vapautetaan, joten ei ole mahdollista määrittää, milloin OnAttack painike vapautetaan. Voit vastata tähän valitsemalla Hyökkäys-toiminnon, joka määrittää painikkeen toimintakartan asetuksissa, ja lisäämällä "Paina" kohdasta "Vuorovaikutukset". Aseta sen jälkeen lisätyn lehdistön laukaisukäyttäytyminen kohtaan "Press And Release" ja tallenna se.

Kun suoritat, näet, että sitä kutsutaan, vaikka OnAttack painike vapautetaan. isPressed false Koska siitä tulee , on myös mahdollista määrittää, onko se vapauttamisen ajoitus.

Muuten, poista tämä vuorovaikutus, koska sitä ei käytetä tulevaisuudessa.

Syötteiden vastaanottaminen Invoke Unity -tapahtumien avulla

Toinen tapa vastaanottaa palautetta on Invoke Unity Events, joten kokeillaan tätä. Kuten edellä mainittiin, useiden syöttömenetelmien käyttäminen voi aiheuttaa ristiriitaista käsittelyä, joten jos muu käsittely on käytössä, poista se käytöstä.

Aseta ensin tekstiobjekti niin, että syöttötiedot voidaan näyttää.

Kutsu yhtenäisyystapahtumat luo tyhjän objektin, joka suorittaa toisiinsa liittyviä toimintoja.

Lisää syöte > pelaajan syöte tyhjään objektiin.

Määritä toiminnoille luomasi toimintokarttatiedosto (tässä tapauksessa InputActionSample) ja määritä luomasi toimintokartan (tässä tapauksessa SideScrollActionMap) arvoksi Oletusmääritys. Määritä toiminta käynnistämään yhtenäisyystapahtumia.

Luo komentosarja. Nimi on mielivaltainen, mutta tässä tapauksessa InputInvokeUnityEvents se on .

Skripti näyttää tältä:

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

Menetelmän nimiOnMoveOnAttack, jota kutsutaan, kun käyttäjä on vuorovaikutuksessa sen kanssa, on , kuten Lähetä viestejä. Käynnistä yhtenäisyystapahtumat -kohdassa voit määrittää tämän menetelmän nimen haluamallasi tavalla.

Kun kutakin kutsutaan, se välitetään argumenttina InputAction.CallbackContext , joten saat syötteen tilan sieltä. Jos asetat toiminnossa "arvon", voit vastaanottaa sen menetelmässä, ja jos asetat ReadValue ReadValueAsButton "painikkeen", voit vastaanottaa sen menetelmässä.

Kun olet tallentanut komentosarjan, liitä Playerin syöte asetettavaan objektiin ja aseta näyttötekstiobjekti.

Laajenna seuraavaksi "Tapahtuma" ja "Toimintakartan nimi (SideScrollActionMap)" Player-syötteessä ja sinun pitäisi nähdä luomasi toiminnot "Siirrä" ja "Hyökkää".

Napsauta ensin + -painiketta Liikkua lisätäksesi sen.

Vasemmassa alakulmassa oleva objekti on oma objektisi, ja funktioksi on määritetty juuri luomasi OnMove menetelmä.

Määritä myös Attack-tapahtuma.

Suorita peli nähdäksesi, miten se toimii.

Periaatteessa sitä kutsutaan vain, kun sama arvo kuin Lähetä viestejä muuttuu, mutta jostain syystä menetelmää voidaan kutsua kahdesti samanaikaisesti. En tiedä syytä, mutta luulen, että se johtuu todennäköisesti siitä, että käynnistysprosessi ja jatkuva prosessi ovat käynnissä samanaikaisesti. Mielestäni ei kuitenkaan ole mitään ongelmaa, jos säilytät vain syötetyn arvon, kuten Lähetä viestejä -tapauksessa, ja suoritat varsinaisen pelin käsittelyn erikseen päivitysprosessissa.

Käytä automaattisesti luotua komentosarjaa syötetietojen vastaanottamiseen

Kolmannessa osassa kuvataan, miten syötetiedot hankitaan toimintokarttatiedostosta luodun komentosarjan avulla.

Koska muiden hankintaprosessien kanssa voi olla ristiriitoja, poista muut hankintaprosessit käytöstä.

Aseta tekstiobjekti syötetietojen näyttämistä varten.

Luo myös tyhjä objekti syöttötietojen hakemista varten. Tässä artikkelissa käytetään automaattisesti luotua komentosarjaa, joten sinun ei tarvitse lisätä Player-syötettä.

Toimintakartasta automaattisesti luotu komentosarja on vain kirjasto, joten luo erillinen ohjauskomentosarja. Nimi on mielivaltainen, mutta tässä tapauksessa InputScript se on .

Skripti näyttää tältä:

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

Määritä automaattisesti luotu luokka InputActionSample kentän toimintokartasta. Tämä luokka määrittää kunkin toimintojoukon toimintokartassa, ja voit määrittää tapahtumat, joita kutsutaan, kun kyseiset toiminnot suoritetaan.

Awake Menetelmässä InputActionSample luodaan esiintymä ja asetetaan tapahtuma, jota kutsutaan toiminnon aikana. Kun OnMovesuoritat nämä toiminnot, - OnAttack menetelmää kutsutaan nyt.

Koska asetamme tapahtuman kuitenkin vain tähän, meidän OnEnable on kutsuttava menetelmää, kun Enable sitä kutsutaan, jotta toimintakartta voidaan ottaa käyttöön.

Koska käyttäjän syötekäyttäytymistä käsitellään globaalina toimintona, Jotta OnDisable toimintakartta ei tekisi ylimääräistä objektin mitätöinnin jälkeen, kutsumme menetelmän menetelmää Disable sen poistamiseksi käytöstä.

Kun olet tallentanut komentosarjan, liitä se tyhjään objektiin, jonka olet luonut, ja aseta tekstiobjekti näytettäväksi.

Suorita peli nähdäksesi, miten se toimii.

Kuten näette, menetelmää ei kutsuta, kun OnMove Siirrä-toiminto tulee (0, 0). En ole varma miksi, mutta näyttää siltä, että suoritettu tapahtuma vie itse asiassa vain sen, jossa näppäinpainallukset ovat käytössä.

Muuten, jos et ole asettanut vuorovaikutusta hyökkäyksen toimintakartassa, sitä ei kutsuta, kun OnAttack vapautat painikkeen.

Tämän käsittelemiseksi canceled sinun on määritettävä tapahtuma. Jos et halua suorittaa erikoiskäsittelyä (0, 0), voit kutsua menetelmää sellaisenaan OnMove . Sama pätee Attackiin.

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

Suorita ja varmista, että Siirrä:(0, 0) tai Attack:False tulee näkyviin.