Gombok hozzárendelése a játékviselkedéshez művelettérképek használatával

Oldal frissítve :
Oldal létrehozásának dátuma :

Ellenőrzési környezet

Windows
  • Windows 11 esetén
Unity-szerkesztő
  • 2020.3.25f1
Bemeneti rendszercsomag
  • 1.2.0

A tipp előfeltételei

A következő beállításokat előre elvégeztük a tipp leírásának előfeltételeként.

Az Action Maps bemutatása

A billentyűzetek, egerek és játékvezérlők felhasználói beviteli programjai alapvetően azt állították, hogy egy bizonyos műveletet hajtottak végre egy gomb megnyomásakor. A művelettérképen például meghatározhatja az "ugrás" műveletét, és vezérlőgombokat és billentyűzetbillentyűket rendelhet hozzá. Ennek eredményeként a programnak csak akkor kell leírnia a folyamatot, ha egy adott műveletet hajtanak végre. Még akkor is, ha utólag hozzárendel egy gombot egy másik vezérlőhöz, alkalmazhatja azt az operációs program megváltoztatása nélkül.

Művelettérkép létrehozása

Itt szeretnék létrehozni egy akciótérképet, és megjeleníteni a felhasználó beviteli információit a szövegben. A felhasználói bevitelt többféleképpen is lekérheti az Action Maps használatával.

Kattintson a jobb gombbal a projekt bármely mappájára egy beviteli művelet létrehozásához. A létrehozandó mappa helye tetszőleges, de kérjük, kezelje azt a projektnek megfelelően. A fájlnév is önkényes, de itt InputActionSample van .

Ha duplán kattint a létrehozott fájlra, a következő ablak jelenik meg.

Először kattintson a + gombra az Action Maps alkalmazásban egy művelettérkép létrehozásához. Létrehozási egységként, ha a művelet tartalma a jelenettől függően változik, akkor abban az egységben lesz definiálva. Például egy oldalnézetes akciójáték esetében a művelet tartalma megváltozik az akció során és a menüben, így mindegyikhez létrehoz egy akciótérképet.

Itt példaként definiálunk egy oldalirányú görgetési műveletet, és elnevezzük "SideScrollActionMap" -nek.

Ezután hozzon létre műveleteket. Mivel ez egy minta, nem fogok sokat készíteni, de itt "Move" műveleteket hozunk létre a mozgáshoz és a "Támadás" támadáshoz. Mivel már létrehoztak egyet, kérjük, változtassa meg a nevet, vagy hozzon létre egy újat, kattintson a + gombra a jobb felső sarokban, és írja be.

Először konfigurálja az áthelyezési konfigurációt. A vezérlő feltételezi, hogy a kar, az I-választó és a billentyűzet kurzorbillentyűit használja. Oldalirányú görgetés esetén vannak olyan esetek, amikor csak balra és jobbra van használva, de itt feltételezzük, hogy négy irányt használ, figyelembe véve a felső gombbal való ugrást és a lefelé gombnyomással való guggolást.

Ha az Áthelyezés lehetőséget választja, a jobb oldalon van egy művelettípus kiválasztása, ezért állítsa ezt "Érték" értékre.

Az alábbiakban látni fogja a vezérlés típusát, ezért válassza a Vector2 lehetőséget. Ez azért van, mert a felső és az alsó Y-hoz, a bal és a jobb pedig X-hez van rendelve.

Ezután válassza ki az eseményhez hozzárendelni kívánt kulcsot. Válassza a Nincs kötés lehetőséget középen, majd válassza az Elérési út lehetőséget a jobb oldalon. Itt kiválasztjuk a GamePad LeftStick-et.

Ez a GamePad LeftStick-jét a mozgáshoz köti.

Más vezérlők kötéséhez válassza az "Add Binding" lehetőséget a Move (Áthelyezés) jobb oldalán található + gombon.

Most, hogy hozzáadta a No Binding funkciót, hozzárendelünk egy Dpad-et a GamePad-hez.

Ily módon hozzáadhatja a támogatni kívánt vezérlő típusát, valamint a kulcsokat és a karokat. Lehetőség van arra is, hogy kifejezetten egy adott játékkonzolhoz állítsa be.

A botok és a DPADS olyan gombok, amelyek fel, le, balra és jobbra vannak, így ezzel hozzáadhatók, de a billentyűzetek esetében mindegyik egyetlen billentyű, így nincs definíció a fel, le, bal és jobb számára. A billentyűzet felfelé, lefelé, balra vagy jobbra történő beállításához válassza az Add Up Down Left Right Composite lehetőséget a + gombon.

Ezután hozzáadódik egy 2D vektor, amelyet hozzárendelhet mindegyikhez Fel, le, balra, jobbra, az alábbi ábrán látható módon.

Ha például az Up lehetőséget használja, állítsa be a "Fel nyíl" beállítást a billentyűzeten. Egyébként, ha nehezen talál egy kulcsot, könnyen kiválaszthatja azt a célgomb megnyomásával, miközben rákattint a "Hallgatás" gombra.

A Fel most felfelé mutató nyílra van állítva.

Hasonlóképpen állítsa be a Le, a Bal és a Jobb beállítást, és kész.

Természetesen nem csak a kurzorbillentyűk, hanem a WASD is beállítható.

Ezután konfigurálja a támadást. A támadást könnyű hozzárendelni, mert egyetlen gomb. Először válassza a Támadás lehetőséget, és győződjön meg arról, hogy a Művelet típusa gomb.

Ezután válassza a Nincs kötés lehetőséget, és válassza ki a hozzárendelni kívánt gombot az elérési útból.

Ha többet szeretne hozzáadni, válassza a "Kötés hozzáadása" lehetőséget a + gombtól.

Adjon hozzá annyit, amennyire szüksége van. Mivel gombként kezelik, a billentyűzet ugyanúgy állítható be, mint egy játékvezérlő.

Ha az összes beállítás befejeződött, kattintson az "Eszköz mentése" gombra a mentéshez. Ezt az ablakot bezárhatja.

Végül a projekt inputactions fájljával (ebben az esetben a korábban létrehozott InputActionSample fájllal) jelölje be a "C#-osztály létrehozása" jelölőnégyzetet a vizsgálóban. A paraméter hozzáadásra kerül, de kattintson az "Alkalmaz" gombra.

Ez létrehoz egy azonos nevű parancsfájlt. Olyan osztályokat tartalmaz, amelyek hasznosak a programokból származó művelettérképek használatához.

A bemeneti információk fogadásának módja

A művelettérkép alapján többféleképpen is fogadhatja a bemenetet. Ez a tipp három mintát magyaráz el, de jobb, ha az egyikre összpontosít, amikor ténylegesen játékot készít. Ha külön használja őket, nehéz lesz kezelni.

Továbbá, ha több bemeneti fogadási módszert használ egyetlen jelenetben, a feldolgozás belsőleg ütközhet, és nem működik megfelelően.

Beviteli információk fogadása az Üzenetek küldése modulban

Az első módszer itt az, hogy hogyan lehet bemeneti információkat fogadni az "Üzenetek küldése" részben.

Ezúttal szeretném megjeleníteni a bevitt információkat a szövegben, ezért elhelyezek egy szöveges objektumot.

Továbbá, mivel ez a tipp több bemeneti információt próbál megszerezni, létrehozunk egy üres objektumot az összetevő külön beállításához. A név bármi lehet.

Ezután adjon hozzá egy Player Input összetevőt az üres objektumhoz. A játékosbevitel fontos összetevője az akciótérképek és szkriptek összekapcsolásának.

Az "Összetevő hozzáadása" részben a "Játékos bemenet" található a "Bemenet" kategóriában, ezért adja hozzá.

A Player Input összetevő hozzáadása után állítsa be a "Műveletek" részben létrehozott művelettérképet. Dobja ki a projektből, vagy válassza ki a jobb oldali + ikonról.

Ellenőrizze, hogy az alapértelmezett térkép az-e, amelyet a művelettérképen hozott létre.

Ellenőrizze, hogy a viselkedés "Üzenetek küldése".

Ezután hozzon létre egy szkriptet. A fájlnév bármi lehet, de itt InputSendMessage van .

A szkript így néz ki:

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}";
  }
}
  • Az objektumhoz tartozik egy lejátszóbemenet, amely beállítja az Üzenetek küldése beállítást
  • Öröklődés: MonoBehaviour

Ha a feltételek teljesülnek, akkor ha definiál egy "OnXXXXXXXX" nevű metódust, A célmetódus a megadott művelet végrehajtásakor kerül meghívásra. Az "XXXXXXXX" a művelettérképen létrehozott műveletek neve. Itt létrehoztuk az "Áthelyezés" és a "Támadás" műveleteket, így a metódusok neve "OnMove" és "OnAttack".

OnMove A megadott összeget a InputValue argumentumából kaphatja meg. Mivel a Vezérlés típusa "Vektor 2" értékre van állítva, a bemeneti érték InputValue.Get<Vector2> .

OnAttackInputValue.isPressed Megkaphatja, hogy benyomja-e is.

A parancsfájl mentése után csatolja azt egy olyan objektumhoz, amely rendelkezik Player Input összetevővel. Állítsa be a szöveges objektumot is megjelenítésre.

Futtassa a játékot, és nézze meg. Ezúttal belefoglaltam a játékvezérlő és a billentyűzet meghatározását, így működnie kell, függetlenül attól, hogy melyiket használja.

Amint láthatja, amikor mozgatja, láthatja, hogy a módszer csak akkor kerül meghívásra, ha az előző állapothoz képest változás következik be. Például, miközben a botot balra mozgatja, együgyűnek nevezik, de nem balra (- OnMove 1,0). OnMove A Támadás gomb szintén csak a megnyomásának pillanatában reagál, és ha megnyomja és lenyomva tartja, a metódus nem kerül meghívásra.

Ezért úgy gondolom, hogy az ideális használat nem az, ha az OnXXXXXXXX meghívásakor játékfeldolgozást hajtunk végre, hanem csak a bemeneti tartalmat tartjuk meg, és ezeket az értékeket használjuk a játék frissítésfeldolgozásában.

By the way, a jelenlegi állapotban nem hívják meg, amikor a gombot elengedik, így nem lehet meghatározni, hogy mikor OnAttack engedik fel a gombot. Erre reagálva válassza ki a Támadás műveletet, amely meghatározza a gombot az akciótérkép beállításaiban, és adja hozzá a "Nyomás" lehetőséget az "Interakciók" közül. Ezután állítsa a hozzáadott sajtó trigger viselkedését "Press And Release" értékre, és mentse el.

Végrehajtáskor láthatja, hogy a rendszer akkor is OnAttack meghívja, ha a gombot felengedi. isPressed false Mivel ez lesz , meg lehet határozni, hogy ez a kiadás időzítése.

Egyébként kérjük, törölje ezt az interakciót, mert a jövőben nem fogják használni.

Bemenet fogadása Unity-események meghívásával

A bemenet fogadásának második módja a Unity-események meghívása, ezért próbáljuk ki ezt. Ahogy fentebb említettük, több beviteli módszer használata ütköző feldolgozást okozhat, ezért ha más feldolgozás engedélyezve van, tiltsa le.

Először helyezze el a szöveges objektumot úgy, hogy a bemeneti információk megjeleníthetők legyenek.

Unity-események meghívása létrehoz egy üres objektumot, amely kapcsolódó műveleteket hajt végre.

Adja hozzá a bemenetet > a lejátszó bemenetét az üres objektumhoz.

Állítsa be a műveletekhez létrehozott művelettérképfájlt (ebben az esetben az InputActionSample), és állítsa a létrehozott művelettérképet (ebben az esetben a SideScrollActionMap alapértelmezett térképre). Viselkedés beállítása Unity-események meghívásához.

Hozzon létre egy szkriptet. A név önkényes, de ebben az esetben InputInvokeUnityEvents .

A szkript így néz ki:

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

A metódus neveOnMoveOnAttack, amelyet a rendszer akkor hív meg, amikor a felhasználó interakcióba lép vele, mint az Üzenetek küldése esetében. A Unity-események meghívása területen tetszés szerint állíthatja be ezt a metódusnevet.

Az egyes hívásokor a rendszer argumentumként InputAction.CallbackContext adja át, így onnan kaphatja meg a bemeneti állapotot. Ha beállít egy "értéket" a műveletben, akkor azt a metódusban fogadhatja, és ha ReadValue beállít ReadValueAsButton egy "gombot", akkor megkaphatja a metódusban.

A parancsfájl mentése után csatolja a Player bemenetet a beállított objektumhoz, és állítsa be a megjelenített szöveg objektumot.

Ezután bontsa ki az "Esemény" és az "Akciótérkép neve (SideScrollActionMap)" elemet a Játékosbevitelben, és látnia kell a létrehozott "Áthelyezés" és "Támadás" műveleteket.

Először kattintson a + gombra az Áthelyezés gombra a hozzáadásához.

A bal alsó sarokban lévő objektum a saját objektuma, és a függvény az imént létrehozott OnMove metódusra van beállítva.

Konfigurálja a támadási eseményt is.

Futtassa a játékot, hogy megtudja, hogyan működik.

Alapvetően csak akkor hívják meg, ha ugyanaz az érték változik, mint az Üzenetek küldése, de valamilyen oknál fogva a módszer egyszerre kétszer hívható. Nem tudom az okát, de azt hiszem, valószínűleg azért, mert az indítási folyamat és a folyamatos folyamat egyszerre fut. Úgy gondolom azonban, hogy nincs probléma, ha csak a megadott értéket tartja meg, mint az Üzenetek küldése esetében, és a tényleges játékfeldolgozást külön végzi el a frissítési folyamatban.

Automatikusan létrehozott parancsfájl használata a bemeneti információk fogadásához

A harmadik szakasz azt ismerteti, hogyan szerezhet be bemeneti információkat egy művelettérképfájlból létrehozott parancsfájl használatával.

Mivel fennáll az ütközés lehetősége más akvizíciós folyamatokkal, kérjük, tiltsa le az egyéb akvizíciós folyamatokat.

Helyezzen el egy szöveges objektumot a bemeneti információk megjelenítéséhez.

Emellett hozzon létre egy üres objektumot a bemeneti információk lekéréséhez. Ez a cikk automatikusan létrehozott szkriptet használ, így nem kell hozzáadnia a lejátszóbemenetet.

A művelettérképből automatikusan létrehozott szkript csak egy kódtár, ezért hozzon létre egy külön vezérlőszkriptet. A név önkényes, de ebben az esetben InputScript .

A szkript így néz ki:

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

Definiáljon egy automatikusan generált osztályt InputActionSample a mezőben található művelettérképből. Ez az osztály határozza meg a művelettérkép minden műveletkészletét, és beállíthatja a műveletek végrehajtásakor meghívott eseményeket.

AwakeA metódusban létrejön az példánya, InputActionSample és be van állítva a művelet időpontjában meghívott esemény. A műveletek végrehajtásakor OnMovea rendszer meghívja a metódust. OnAttack

Mivel azonban csak itt állítjuk be az eseményt, meg kell hívnunk OnEnable a metódust, amikor Enable meg van hívva a művelettérkép engedélyezéséhez.

Továbbá, mivel a felhasználó beviteli viselkedését a rendszer globális műveletként kezeli, Annak megakadályozása OnDisable érdekében, hogy a művelettérkép az objektum érvénytelenítése után további műveleteket hajtson végre, meghívjuk a metódust a metódusban Disable a letiltáshoz.

A szkript mentése után csatolja azt a létrehozott üres objektumhoz, és állítsa be megjelenítésre a szöveges objektumot.

Futtassa a játékot, hogy megtudja, hogyan működik.

Mint látható, a módszer nem kerül meghívásra, amikor OnMove az Áthelyezés művelet lesz (0, 0). Nem tudom, miért, de úgy tűnik, hogy a végrehajtott esemény valójában csak azt veszi igénybe, amelynél engedélyezve vannak a billentyűleütések.

Egyébként, ha nem állította be az interakciókat az akciótérképen a támadáshoz, akkor a gomb felengedésekor nem kerül meghívásra OnAttack .

Ennek canceled kezeléséhez be kell állítania egy eseményt. Ha nem akar speciális feldolgozást végrehajtani (0, 0), akkor hívhatja a módszert OnMove . Ugyanez igaz az Attackre is.

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

Futtassa és ellenőrizze, hogy megjelenik-e a Move:(0, 0) vagy a Attack:False érték.