Tegevuskaartide kasutamine mängukäitumisele nuppude määramiseks

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kontrollimise keskkond

Windows
  • Windows 11
Ühtsuse toimetaja
  • 2020.3.25f1
Sisendsüsteemi pakett
  • 1.2.0

Selle näpunäite eeltingimused

Selle vihje kirjeldamise eelduseks on eelnevalt tehtud järgmised sätted.

Teave tegevuskaartide kohta

Klaviatuuride, hiirte ja mängupultide kasutajate sisendprogrammid väitsid põhimõtteliselt, et nupu vajutamisel tehti teatud toiming. Näiteks tegevuskaardil saate määratleda "hüppamise" toimingu ja määrata sellele kontrolleri nupud ja klaviatuuriklahvid. Selle tulemusena peab programm kirjeldama protsessi ainult siis, kui konkreetne toiming tehakse. Isegi kui määrate järelmõttena nupu teisele kontrollerile, saate seda rakendada ilma operatsiooniprogrammi muutmata.

Tegevuskaardi loomine

Siin tahaksin luua tegevuskaardi ja kuvada tekstis kasutaja sisestusteabe. Kasutaja sisendi saamiseks toimingukaartide abil on mitu võimalust.

Sisestustoimingu loomiseks paremklõpsake projekti mis tahes kausta. Loodava kausta asukoht on meelevaldne, kuid palun hallake seda vastavalt oma projektile. Failinimi on samuti meelevaldne, kuid siin InputActionSample see on .

Kui topeltklõpsate loodud failil, kuvatakse järgmine aken.

Esmalt klõpsake tegevuskaardi loomiseks tegevuskaartide nuppu +. Loomisüksusena, kui operatsiooni sisu muutub sõltuvalt stseenist, määratletakse see selles üksuses. Näiteks külgkerimise märulimängu puhul muutub toimingu sisu toimingu ajal ja menüüs, nii et loote igaühe jaoks tegevuskaardi.

Siin määratleme näitena külgkerimise toimingu ja nimetame selle "SideScrollActionMap".

Seejärel looge toimingud. Kuna see on näidis, ei tee ma paljusid neist, kuid siin loome "Move" tegevused liikumiseks ja "Attack" rünnakuks. Kuna see on juba loodud, muutke palun nime või looge uus, klõpsake paremas ülanurgas nuppu + ja sisestage see.

Esmalt konfigureerige teisaldamise konfiguratsioon. Kontroller eeldab, et kasutate pulga, D-padi ja klaviatuuri kursoriklahve. Külgmise kerimise toimingu korral on juhtumeid, kus kasutatakse ainult vasakule ja paremale, kuid siin eeldame, et kasutate nelja suunda, mis kaaluvad ülemise klahviga hüppamist ja allaklahviga kõverdamist.

Kui valite käsu Teisalda, on paremal valik Toimingu tüüp, seega määrake selle väärtuseks "Väärtus".

Näete allpool olevat juhtimistüüpi, seega valige Vector2. Seda seetõttu, et ülemine ja alumine osa on määratud Y-le ning vasak ja parem on määratud X-le.

Seejärel valige võti, mille soovite sellele sündmusele määrata. Valige keskelt Sidumiseta ja paremalt Tee. Siin valime GamePad LeftStick.

See seob GamePadi vasaku pulga käiguga.

Ka teiste kontrollerite sidumiseks valige teisaldamisest paremal asuvast + nupust "Lisa sidumine".

Nüüd, kui pole sidumist lisatud, määrame GamePadile Dpadi.

Sel viisil saate lisada kontrolleri tüübi, mida soovite toetada, samuti võtmed ja pulgad. Samuti on võimalik seda spetsiaalselt konkreetse mängukonsooli jaoks seadistada.

Pulgad ja Dpadid on nupud, mis eeldavad üles, alla, vasakule ja paremale, nii et neid saab sellega lisada, kuid klaviatuuride puhul on need kõik üksikud klahvid, seega pole üles, alla, vasakule ja paremale määratlust. Klaviatuuri üles, alla, vasakule või paremale seadmiseks valige nupust + käsk Lisa üles vasakule paremale komposiit.

Seejärel lisatakse 2D-vektor ja saate selle määrata igale üles vasakule paremale, nagu on näidatud alloleval joonisel.

Näiteks kui kasutate nuppu Üles, seadistage klaviatuuril "Ülesnool". Muide, kui teil on võtme leidmine tülikas, saate selle hõlpsalt valida, vajutades sihtklahvi, klõpsates samal ajal nuppu "Kuula".

Üles on nüüd seadistatud väärtusele Ülesnool.

Samamoodi seadke maha, vasakule ja paremale ning oletegi valmis.

Loomulikult saab seadistada mitte ainult kursoriklahve, vaid ka WASD-d.

Seejärel konfigureerige Attack. Rünnakut on lihtne määrata, kuna see on üks nupp. Esmalt valige Rünnak ja veenduge, et toimingu tüüp oleks nupp.

Seejärel valige No Binding (Sidumiskeeld) ja valige nupp, mille soovite teelt määrata.

Kui soovite rohkem lisada, valige nupust + "Lisa sidumine".

Lisage nii palju kui vaja. Kuna seda käsitletakse nupuna, saab klaviatuuri seadistada samamoodi nagu mängukontrollerit.

Kui kõik seaded on lõpule jõudnud, klõpsake salvestamiseks nuppu "Salvesta vara". Selle akna saate sulgeda.

Lõpuks kontrollige projekti inputactions failiga (antud juhul varem loodud InputActionSample failiga) inspektoris "Generate C# Class". Parameeter lisatakse, kuid klõpsake nuppu "Rakenda", nagu see on.

See genereerib sama nimega skriptifaili. See sisaldab klasse, mis on kasulikud programmide tegevuskaartide kasutamiseks.

Kuidas sisendteavet vastu võtta?

Tegevuskaardi põhjal sisendi saamiseks on mitu võimalust. See näpunäide selgitab kolme mustrit, kuid mängu tegemisel on parem keskenduda ühele neist. Kui kasutate neid eraldi, on see tülikas hallata.

Samuti, kui kasutate ühes stseenis mitut sisendi vastuvõtmise meetodit, võib töötlemine olla sisemiselt vastuolus ja ei tööta korralikult.

Sisendteabe vastuvõtmine jaotises Sõnumite saatmine

Esimene meetod on siin sisendteabe vastuvõtmine "Saada sõnumeid".

Seekord tahan sisestatud teavet tekstis kuvada, nii et asetan tekstiobjekti.

Samuti, kuna see näpunäide püüab saada mitu sisendteavet, loome komponendi eraldi seadistamiseks tühja objekti. Nimi võib olla midagi.

Seejärel lisage tühjale objektile mängija sisendkomponent. Mängija sisend on oluline komponent toimingukaartide ja skriptide ühendamiseks.

Jaotises "Lisa komponent" on kategoorias "Sisend" "Mängija sisend", nii et lisage see.

Kui mängija sisendi komponent on lisatud, määrake jaotises "Toimingud" loodud tegevuskaart. Kukutage see projektist või valige see paremal asuvast + ikoonist.

Veenduge, et vaikekaart oleks see, mille tegevuskaardil lootsite.

Veenduge, et käitumine oleks "Saada sõnumeid".

Seejärel looge skript. Faili nimi võib olla ükskõik milline, kuid siin InputSendMessage see on .

Skript näeb välja selline:

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}";
  }
}
  • Objektile on lisatud mängija sisend, mis määrab Saada sõnumeid
  • Pärimine MonoBehavior'ist

Kui tingimused on täidetud, siis kui määratlete meetodi nimega "OnXXXXXXXX", Sihtmeetod kutsutakse määratud toimingu teostamisel. "XXXXXXXX" on tegevuskaardil loodud toimingute nimi. Siin oleme loonud toimingud "Move" ja "Attack", nii et meetodite nimed on vastavalt "OnMove" ja "OnAttack".

OnMove Sisestatud summa saate argumendist InputValue . Kuna juhtelemendi tüübiks on seatud "Vector 2", võetakse sisendväärtus InputValue.Get<Vector2> vastu .

OnAttackInputValue.isPressed Saate ka selle, kas vajutate sisse.

Pärast skripti salvestamist manustage see objektile, millel on mängija sisendi komponent. Seadke kuvatav tekstiobjekt.

Käivitage mäng ja vaadake. Seekord olen lisanud mängupuldi ja klaviatuuri määratluse, nii et see peaks töötama olenemata sellest, millist neist kasutate.

Nagu näete, kui seda liigutate, näete, et meetodit nimetatakse ainult siis, kui eelmise oleku väärtus muutub. Näiteks keppi vasakule liigutades nimetatakse seda üksmeelselt, kuid mitte vasakule (- OnMove 1,0). OnMove Nupp Attack reageerib ka ainult siis, kui seda vajutatakse, ja kui seda vajutatakse ja hoitakse all, siis meetodit ei kutsuta.

Seetõttu arvan, et ideaalne kasutusviis ei ole mängu töötlemine, kui OnXXXXXXXX kutsutakse, vaid ainult sisendsisu säilitamine ja nende väärtuste kasutamine mängu värskenduste töötlemisel.

Muide, praeguses olekus ei kutsuta seda nupu vabastamisel, seega ei ole võimalik kindlaks teha, millal OnAttack nupp vabastatakse. Sellele reageerimiseks valige rünnakutoiming, mis määratleb toimingukaardi seadetes nupu, ja lisage "Interaktsioonid" jaotisest "Vajuta". Pärast seda määrake lisatud pressi käivituskäitumine väärtuseks "Press And Release" ja salvestage see.

Käivitamisel näete, et seda nimetatakse isegi OnAttack nupu vabastamisel. isPressed false Kuna see muutub , on võimalik ka kindlaks teha, kas see on vabastamise ajastus.

Muide, palun kustutage see suhtlus, sest seda ei kasutata tulevikus.

Saage sisendit Invoke Unity Eventsiga

Teine võimalus sisendi saamiseks on Invoke Unity Events, nii et proovime seda. Nagu eespool mainitud, võib mitme sisestusmeetodi kasutamine põhjustada vastuolulist töötlemist, nii et kui muu töötlemine on lubatud, keelake see.

Esmalt asetage tekstiobjekt nii, et sisendteavet saaks kuvada.

Ühtsuse sündmuste käivitamine loob tühja objekti, mis teostab seotud toiminguid.

Lisage sisend > mängija sisend tühjale objektile.

Seadke toimingute jaoks loodud toimingukaardifail (antud juhul InputActionSample) ja seadke loodud toimingukaart (antud juhul SideScrollActionMap) vaikekaardiks. Määrake käitumine, et kutsuda esile ühtsuse sündmusi.

Skripti loomine. Nimi on meelevaldne, kuid sel juhul InputInvokeUnityEvents on see .

Skript näeb välja selline:

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

Meetodi nimiOnMoveOnAttack, mida nimetatakse, kui kasutaja sellega suhtleb, on , nagu sõnumite saatmise puhul. Jaotises Kutsu ühtsuse sündmused saate määrata selle meetodi nime vastavalt oma soovile.

Kui igaüks neist on kutsutud, edastatakse see argumendina InputAction.CallbackContext , nii et saate sealt sisendi oleku. Kui määrate toimingus "väärtuse", saate selle meetodis vastu võtta ja kui määrate ReadValue ReadValueAsButton "nupu", saate selle meetodis vastu võtta.

Pärast skripti salvestamist lisage Playeri sisend seadistatavale objektile ja määrake kuvatav tekstiobjekt.

Järgmisena laiendage mängija sisendis jaotisi "Sündmus" ja "Tegevuskaardi nimi (SideScrollActionMap)" ning peaksite nägema loodud toiminguid "Teisalda" ja "Rünnak".

Selle lisamiseks klõpsake esmalt nupul + nupul Teisalda.

Vasakus alanurgas olev objekt on teie enda objekt ja funktsioon on seatud teie loodud OnMove meetodile .

Konfigureerige ka ründesündmus.

Käivitage mäng, et näha, kuidas see töötab.

Põhimõtteliselt nimetatakse seda ainult siis, kui muutub sama väärtus nagu Saada sõnumeid, kuid mingil põhjusel võib meetodit kutsuda kaks korda korraga. Ma ei tea põhjust, kuid arvan, et see on ilmselt sellepärast, et algusprotsess ja pidev protsess töötavad samal ajal. Kuid ma arvan, et ei ole mingit probleemi, kui hoiate ainult sisestatud väärtust, nagu sõnumite saatmise puhul, ja teostate tegeliku mängu töötlemise eraldi värskendusprotsessis.

Automaatselt loodud skripti kasutamine sisendteabe vastuvõtmiseks

Kolmandas osas kirjeldatakse, kuidas hankida sisendteavet toimingukaardifailist loodud skripti abil.

Kuna on olemas konfliktide võimalus teiste omandamisprotsessidega, keelake muud omandamisprotsessid.

Sisestage sisendteabe kuvamiseks tekstiobjekt.

Samuti looge sisendteabe toomiseks tühi objekt. Selles artiklis kasutatakse automaatselt loodud skripti, nii et te ei pea mängija sisendit lisama.

Tegevuskaardilt automaatselt genereeritud skript on lihtsalt teek, seega looge eraldi juhtskript. Nimi on meelevaldne, kuid sel juhul InputScript on see .

Skript näeb välja selline:

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ääratlege väljal olevast tegevuskaardist automaatselt loodud klass InputActionSample . See tund määratleb iga toimingukaardil oleva toimingukomplekti ja saate määrata sündmused, mida nende toimingute tegemisel kutsutakse.

Awake Meetodis InputActionSample luuakse eksemplar ja määratakse toimingu ajal kutsutud sündmus. Nende toimingute tegemisel OnMovenimetatakse nüüd meetodit , OnAttack .

Kuna aga määrame sündmuse ainult siin, peame OnEnable tegevuskaardi lubamiseks helistama meetodile, millal Enable seda kutsutakse.

Samuti, kuna kasutaja sisendkäitumist käsitletakse globaalse toiminguna, Selleks, et tegevuskaart ei OnDisable saaks pärast selle objekti kehtetuks tunnistamist ekstra teha, kutsume meetodi meetodit Disable selle keelamiseks.

Pärast skripti salvestamist lisage see loodud tühjale objektile ja seadke tekstiobjekt kuvamiseks.

Käivitage mäng, et näha, kuidas see töötab.

Nagu näete, ei kutsuta meetodit, kui OnMove teisaldamistoiming muutub (0, 0). Ma pole kindel, miks, kuid tundub, et sooritatud sündmus võtab tegelikult ainult selle, kus klahvivajutused on lubatud.

Muide, kui te pole rünnaku tegevuskaardil interaktsioone määranud, siis nupu vabastamisel OnAttack seda ei kutsuta.

Selle käsitlemiseks canceled peate seadistama sündmuse. Kui te ei soovi spetsiaalset töötlemist teha (0, 0), võite seda meetodit nimetada nii, nagu see on OnMove . Sama kehtib ka Attacki kohta.

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

Käivitage ja veenduge, et kuvatakse Move:(0, 0) või Attack:False.