Dinamiškas veiksmų žemėlapio nustatymas
Tikrinimo aplinka
- Windows
-
- Langai 11
- "Unity" redaktorius
-
- 2020.3.25f1
- Įvesties sistemos paketas
-
- 1.2.0
Būtinos šio patarimo sąlygos
Šie nustatymai buvo atlikti iš anksto kaip šio patarimo aprašymo prielaida.
Taip pat turėtumėte būti susipažinę su šiais patarimais:
Apie dinaminių veiksmų žemėlapio konfigūraciją
Įprasta iš anksto pridėti ir nustatyti projekto veiksmų žemėlapius, Tokiu atveju valdiklio mygtukų priskyrimai yra fiksuoti žaidimo vykdymo metu ir vartotojas negali jų laisvai keisti žaidimo metu. To daugiausia tikimasi žaidimams, kuriems reikalinga rakto konfigūracija.
Šiame patarime aprašoma, kaip savavališkai pakeisti pagrindinius veiksmų schemos priskyrimus scenarijuje.
Dinaminis veiksmų žemėlapio keitimų valdymas
Šį kartą pradinis veiksmų žemėlapis taip pat nustatomas pagal scenarijų, o veiksmų žemėlapio pakeitimas viduryje taip pat atliekamas scenarijuje. Manau, kad šis metodas naudojamas įkeliant ir nustatant pagrindinę konfigūraciją, išsaugotą žaidimo paleidimo metu.
Pavyzdžio turinys turi pakeisti veiksmų schemos klavišų priskyrimą, kai paspaudžiate mygtuką, ir rodyti valdomą turinį kaip tekstą. Mygtukų išdėstymas ir rodymo tekstas yra išdėstyti taip, kaip parodyta paveikslėlyje, tačiau jie nėra labai svarbūs, todėl padėkite juos laisvai.
Veiksmų žemėlapio pradinis konfigūravimo procesas
Sukurkite scenarijų. Pavadinimas yra savavališkas, tačiau šiuo atveju InputActionMap
jis yra .
Šį kartą visi procesai bus aprašyti čia, tačiau faktinėje gamyboje prašome juos padalyti pagal projekto sukūrimą.
Scenarijus atrodo taip: Pirmiausia paleidžiant sukurkite numatytąjį veiksmų žemėlapį.
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}";
}
}
Pirmiausia klasėje apibrėžkite tiek veiksmų, kiek InputAction
norite įgyvendinti lauke.
Čia mes paruošime laukus "Perkelti" ir "Ataka", kurie taip pat buvo naudojami ankstesniame veiksmų žemėlapio paaiškinime.
Jei veiksmų skaičius didėja, turite deklaruoti tą skaičių, bet jei jų yra List
Dictionary
daug, galite juos valdyti naudodami , ir pan.
Čia jis nenaudojamas, bet jei turite savo InputActionMap
klasę, galite ją valdyti ten.
Atliekamas momentinis ir raktų priskyrimas AddBinding
metodu, InputAction
vadinamu Awake
inicijavimu.
Galite galvoti apie tai, ką darote, kaip apie programą, kuri veiksmų žemėlapio nustatymų ekrane prideda įrišimą.
AddBinding
Eilutė, nurodyta metodui ir kt., yra tokia pati kaip eilutė, rodoma Kelias veiksmų žemėlapio nustatymų ekrane.
Norėdami rodyti simbolių eilutę, paspauskite dešinėje esantį mygtuką "T".
Įvykių tvarkymas, vadinamas mygtuko įjungimu, yra toks pat, kaip įprasto veiksmų žemėlapio scenarijaus versijos apdorojimas. Atgalinio skambinimo procesas taip pat nukreipiamas taip, kaip yra.
// 操作時のイベントを設定
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}";
}
Įjungti, išjungti yra InputAction
vienetas, todėl aprašykite tiek veiksmų, kiek norite.
Jei tai vargina, galite tai List
valdyti naudodami ir pan.
private void OnEnable()
{
// オブジェクトが有効になったときにアクションマップを有効にする
MoveAction.Enable();
AttackAction.Enable();
}
Įrašę EventSystem
scenarijų, pridėkite jį prie teksto objekto ir sukonfigūruokite jį rodyti.
Paleiskite žaidimą ir pažiūrėkite, ar rodoma įvesties informacija. Rezultatas turėtų būti toks pat, kaip ir veiksmų schemos statinio proceso scenarijaus versija.
Veiksmų žemėlapio dinaminis keitimų apdorojimas
Kadangi dinaminis veiksmų žemėlapio keitimas atliekamas paspaudus mygtuką, apibrėžkite metodą, kuris bus iškviestas paspaudus mygtuką.
OnClickButton
Kol kas paliksime jį kaip .
// 省略
public class InputActionMap : MonoBehaviour
{
// 省略
<summary>
ボタンをクリックしたときに呼ばれる。
</summary>
public void OnClickButton()
{
}
}
Nustato mygtuko paspaudimo įvykį.
Veiksmų schemos perrašymo procesas yra toks:
<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" });
}
Kadangi kiekvienam veiksmui ApplyBindingOverride
yra numatytas metodas, rakto arba mygtuko, kuris buvo inicijuotas į , path
kelias
overridePath
Parašykite rakto ar mygtuko, kurį norite nepaisyti, kelią.
Beje, tai tik perrašymo kelio nustatymas, todėl pradinis kelias lieka toks, koks yra. Pavyzdžiui, atlikdami veiksmą "Attack", pakeiskite klavišą z į tarpo klavišą. Be to, jei norite pakeisti tarpą į x klavišą, aprašymas bus perrašytas z klavišui, o ne pagal tarpą, kaip nurodyta toliau.
AttackAction.ApplyBindingOverride(new InputBinding { path = "<Keyboard>/z", overridePath = "<Keyboard>/x" });
Išsaugoję paleiskite žaidimą ir spustelėkite mygtuką, kad pamatytumėte, ar klavišai ar mygtukai, su kuriais bendraujate, pasikeičia.
InputAction
Šį kartą keičiame veiksmų žemėlapį tam, kuris sukūrė egzempliorių ,
Taip pat InputAction
yra scenarijus, sugeneruotas pagal GUI veiksmų žemėlapio nustatymą, todėl įdiekite jį tame, kurį lengva padaryti.