Dynamiczne konfigurowanie mapy działania
Środowisko weryfikacji
- Windows
-
- Okna 11
- Edytor Unity
-
- 2020.3.25f1
- Pakiet systemu wejściowego
-
- 1.2.0
Wymagania wstępne dotyczące tej porady
Poniższe ustawienia zostały wcześniej wprowadzone jako przesłanka do opisu tej wskazówki.
Powinieneś również zapoznać się z następującymi wskazówkami:
Informacje o konfiguracji dynamicznej mapy działań
Powszechne jest dodawanie i ustawianie map działań do projektu z wyprzedzeniem, W takim przypadku przypisania przycisków kontrolera są ustalane podczas wykonywania gry i nie mogą być dowolnie zmieniane przez użytkownika podczas gry. Jest to oczekiwane głównie w przypadku gier, które wymagają konfiguracji klucza.
W tej poradze opisano, jak dowolnie zmieniać przypisania mapy akcji w skrypcie.
Obsługa zmian na dynamicznej mapie działania
Tym razem początkowa mapa akcji jest również ustawiana przez skrypt, a zmiana mapy akcji w środku jest również wykonywana w skrypcie. Myślę, że ta metoda jest używana podczas ładowania i ustawiania konfiguracji klucza zapisanej podczas uruchamiania gry.
Zawartość przykładu ma na celu zmianę przypisania mapy akcji po naciśnięciu przycisku i wyświetlenie obsługiwanej zawartości jako tekstu. Rozmieszczenie przycisków i wyświetlany tekst są ułożone tak, jak pokazano na rysunku, ale nie są one bardzo ważne, więc prosimy o ich swobodne umieszczanie.
Proces wstępnej konfiguracji mapy działania
Utwórz skrypt. Nazwa jest arbitralna, ale w tym przypadku InputActionMap
jest .
Tym razem wszystkie procesy zostaną opisane tutaj, ale w rzeczywistej produkcji podziel je według stworzenia projektu.
Skrypt wygląda tak: Najpierw utwórz domyślną mapę akcji podczas uruchamiania.
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}";
}
}
Najpierw zdefiniuj tyle akcji w klasie, ile chcesz InputAction
zaimplementować w polu.
Tutaj przygotujemy pola dla "Move" i "Attack", które zostały również wykorzystane w poprzednim wyjaśnieniu mapy akcji.
Jeśli liczba akcji wzrośnie, musisz zadeklarować tę liczbę, ale jeśli jest List
Dictionary
ich wiele, możesz nimi zarządzać za pomocą , , itp.
Nie jest tutaj używany, ale jeśli masz własną InputActionMap
klasę, możesz nią zarządzać.
Wykonywane są wystąpienia i przypisywanie AddBinding
kluczy w metodzie wywoływanej Awake
InputAction
podczas inicjalizacji.
Możesz myśleć o tym, co robisz, jako o programie, który dodaje powiązanie na ekranie ustawień mapy akcji.
AddBinding
Ciąg określony dla metody itp. jest taki sam jak ciąg wyświetlany w polu Ścieżka na ekranie ustawień mapy akcji.
Aby wyświetlić ciąg znaków, naciśnij przycisk "T" po prawej stronie.
Obsługa zdarzeń wywoływana podczas działania przycisku jest taka sama jak przetwarzanie skryptowej wersji normalnej mapy akcji. Proces wywołania zwrotnego jest również przekierowywany w obecnej postaci.
// 操作時のイベントを設定
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}";
}
Włącz, Wyłącz jest InputAction
jednostką, więc opisz tyle akcji, ile chcesz.
Jeśli jest to kłopotliwe, możesz sobie z tym List
poradzić itp.
private void OnEnable()
{
// オブジェクトが有効になったときにアクションマップを有効にする
MoveAction.Enable();
AttackAction.Enable();
}
Po EventSystem
zapisaniu skryptu dołącz go do obiektu tekstowego i skonfiguruj go do wyświetlania.
Uruchom grę i sprawdź, czy pojawią się informacje wejściowe. Wynik powinien być taki sam, jak w wersji skryptowej statycznego procesu mapy akcji.
Dynamiczne przetwarzanie zmian na mapie akcji
Ponieważ dynamiczna zmiana mapy akcji odbywa się po naciśnięciu przycisku, zdefiniuj metodę, która zostanie wywołana po naciśnięciu przycisku.
OnClickButton
Na razie zostawimy to jako .
// 省略
public class InputActionMap : MonoBehaviour
{
// 省略
<summary>
ボタンをクリックしたときに呼ばれる。
</summary>
public void OnClickButton()
{
}
}
Ustawia zdarzenie click dla przycisku.
Proces przepisywania mapy działania jest następujący:
<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" });
}
Ponieważ dla ApplyBindingOverride
każdej akcji jest dostępna metoda, ścieżka klucza lub przycisku, który został zainicjowany do , path
overridePath
Napisz ścieżkę lub przycisku, który chcesz zastąpić.
Nawiasem mówiąc, jest to tylko ustawienie ścieżki nadpisywania, więc oryginalna ścieżka pozostaje taka, jaka jest. Na przykład w akcji Atak zmień z na spację. Ponadto, jeśli chcesz zmienić spację na x, opis zostanie nadpisany dla z zamiast na podstawie spacji, w następujący sposób.
AttackAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/z", overridePath = "<Keyboard>/x" });
Po zapisaniu uruchom grę i kliknij przycisk, aby sprawdzić, czy lub przyciski, z którymi wchodzisz w interakcję, zmieniają się.
InputAction
Tym razem zmieniamy mapę działania dla tej, która utworzyła instancję ,
Istnieje również InputAction
skrypt generowany przez ustawienie mapy działania GUI, więc zaimplementuj go w tym, który jest łatwy do zrobienia.