Művelettérkép dinamikus beállítása
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.
Ismernie kell a következő tippeket is:
A dinamikus művelettérkép konfigurálása
Gyakori, hogy előre hozzáadnak és beállítanak cselekvési térképeket a projekthez, Ebben az esetben a vezérlő gombjainak hozzárendelése a játék végrehajtása során rögzül, és a felhasználó nem változtathatja meg szabadon a játék során. Ez elsősorban olyan játékoknál várható, amelyek kulcskonfigurációt igényelnek.
Ez a tipp azt ismerteti, hogyan módosíthatja önkényesen egy művelettérkép kulcs-hozzárendeléseit egy parancsfájlban.
Dinamikus művelettérkép-módosítások kezelése
Ezúttal a kezdeti művelettérképet is a szkript állítja be, és a középső művelettérkép-módosítás is a szkriptben történik. Azt hiszem, ezt a módszert használják a játék indításakor mentett kulcskonfiguráció betöltésekor és beállításakor.
A minta tartalma a művelettérkép billentyű-hozzárendelésének módosítása a gomb megnyomásakor, valamint a működtetett tartalom szövegként való megjelenítése. A gombok elhelyezése és a megjelenített szöveg az ábrán látható módon van elrendezve, de nem túl fontosak, ezért kérjük, szabadon helyezze el őket.
Műveleti térkép kezdeti konfigurációs folyamata
Hozzon létre egy szkriptet. A név önkényes, de ebben az esetben InputActionMap
.
Ezúttal az összes folyamatot itt ismertetjük, de a tényleges termelésben kérjük, ossza meg őket a projekt létrehozása szerint.
A szkript így néz ki: Először hozzon létre egy alapértelmezett művelettérképet indításkor.
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public class InputActionMap : MonoBehaviour
{
<summary>情報を表示させるテキストオブジェクト。</summary>
[SerializeField] private Text TextObject;
<summary>Move アクション用の定義。</summary>
public InputAction MoveAction { get; set; }
<summary>Attack アクション用の定義。</summary>
public InputAction AttackAction { get; set; }
private void Awake()
{
// Move アクションの作成
MoveAction = new InputAction("Move");
// バインド(キー割り当て)の追加
// 設定する文字列の形式はアクションマップ設定画面の Path に表示される文字列となる
MoveAction.AddBinding("<Gamepad>/leftStick");
// キーボードに上下左右を割り当てるにはコンポジットの 2DVector を設定する
MoveAction.AddCompositeBinding("2DVector")
.With("Up", "<Keyboard>/upArrow")
.With("Down", "<Keyboard>/downArrow")
.With("Left", "<Keyboard>/leftArrow")
.With("Right", "<Keyboard>/rightArrow");
// Attack アクションの作成
AttackAction = new InputAction("Attack");
// バインド(キー割り当て)の追加
AttackAction.AddBinding("<Gamepad>/buttonSouth");
AttackAction.AddBinding("<Keyboard>/z");
// 操作時のイベントを設定
MoveAction.performed += context => OnMove(context);
MoveAction.canceled += context => OnMove(context);
AttackAction.performed += context => OnAttack(context);
AttackAction.canceled += context => OnAttack(context);
}
private void OnEnable()
{
// オブジェクトが有効になったときにアクションマップを有効にする
MoveAction.Enable();
AttackAction.Enable();
}
private void OnDisable()
{
// アクションマップが誤動作しないようにオブジェクト終了時に無効にする
MoveAction.Disable();
AttackAction.Disable();
}
<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}";
}
}
Először határozzon InputAction
meg annyi műveletet az osztályban, amennyit a mezőben végre szeretne hajtani.
Itt előkészítjük a mezőket a "Move" és a "Attack" számára, amelyeket az előző akciótérkép-magyarázatban is használtunk.
Ha a műveletek száma növekszik, deklarálnia kell ezt a számot, de ha sok van List
Dictionary
, akkor a , stb.
Itt nem használják, de ha van saját InputActionMap
osztálya, akkor ott kezelheti.
A rendszer végrehajtja a példányosítást és a kulcshozzárendelést AddBinding
az InputAction
inicializáláskor hívott Awake
metódusban.
Gondolhat arra, amit csinál, mint egy programra, amely kötést ad hozzá a művelettérkép beállítási képernyőjéhez.
AddBinding
A Metódus stb. mezőben megadott karakterlánc megegyezik a művelettérkép beállítási képernyőjén az Elérési út mezőben megjelenő karakterlánccal.
A karakterlánc megjelenítéséhez nyomja meg a jobb oldalon található "T" gombot.
A gomb működtetésekor meghívott eseménykezelés megegyezik a normál művelettérkép parancsfájllal ellátott verziójának feldolgozásával. A visszahívási folyamat is el van irányítva.
// 操作時のイベントを設定
MoveAction.performed += context => OnMove(context);
MoveAction.canceled += context => OnMove(context);
AttackAction.performed += context => OnAttack(context);
AttackAction.canceled += context => OnAttack(context);
<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}";
}
Az engedélyezés, a InputAction
letiltás egy egység, ezért írjon le annyi műveletet, amennyit csak akar.
Ha zavaró, akkor kezelheti List
stb.
private void OnEnable()
{
// オブジェクトが有効になったときにアクションマップを有効にする
MoveAction.Enable();
AttackAction.Enable();
}
A parancsfájl mentése után EventSystem
csatolja és konfigurálja a megjelenítendő szöveges objektumot.
Futtassa a játékot, és nézze meg, hogy megjelennek-e a bemeneti információk. Az eredménynek meg kell egyeznie a művelettérkép statikus folyamatának parancsfájlos verziójával.
Műveleti térkép dinamikus változásfeldolgozása
Mivel a művelettérkép dinamikus váltása a gomb megnyomásakor történik, határozza meg azt a módszert, amelyet a gomb megnyomásakor hív meg.
OnClickButton
Egyelőre hagyjuk .
// 省略
public class InputActionMap : MonoBehaviour
{
// 省略
<summary>
ボタンをクリックしたときに呼ばれる。
</summary>
public void OnClickButton()
{
}
}
Beállítja a gomb kattintási eseményét.
A művelettérkép átírási folyamata a következő:
<summary>
ボタンをクリックしたときに呼ばれる。
</summary>
public void OnClickButton()
{
TextObject.text = "アクションマップを変更しました。";
// Move アクションのキーを置き換える
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Gamepad>/leftStick", overridePath = "<Gamepad>/dpad" } );
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/upArrow", overridePath = "<Keyboard>/w" });
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/downArrow", overridePath = "<Keyboard>/s" });
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/leftArrow", overridePath = "<Keyboard>/a" });
MoveAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/rightArrow", overridePath = "<Keyboard>/d" });
// Attack アクションのキーを置き換える
AttackAction.ApplyBindingOverride(new InputBinding { path = "<Gamepad>/buttonSouth", overridePath = "<Gamepad>/buttonEast" });
AttackAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/z", overridePath = "<Keyboard>/space" });
}
Mivel minden művelethez ApplyBindingOverride
meg van adva egy metódus, a path
következőre inicializált billentyű vagy gomb elérési útja: ,
overridePath
Írja be a felülbírálni kívánt kulcs vagy gomb elérési útját.
Egyébként ez csak a felülírási útvonal beállítása, így az eredeti elérési út változatlan marad. Például egy Támadás műveletben módosítsa a z billentyűt a szóközre. Továbbá, ha szóközről x kulcsra szeretne váltani, a leírás felülíródik a z billentyűre a szóköz helyett, az alábbiak szerint.
AttackAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/z", overridePath = "<Keyboard>/x" });
A mentés után futtassa a játékot, és kattintson a gombra, hogy megnézze, változnak-e azok a billentyűk vagy gombok, amelyekkel interakcióba lép.
InputAction
Ezúttal annak a művelettérképét módosítjuk, amely létrehozta a példányát,
Van egy szkript isInputAction
, amelyet a grafikus felhasználói felület művelettérkép-beállítása generál, ezért kérjük, implementálja azt abban, ami könnyen elvégezhető.