Unity]InputアクションでIsPressed()とstartedイベントを使用
Unityの代わりにInput Actionクラスを使用するInputクラス
現在使用されているリズムゲームリソースでは、
入力イベントはInput ActionAssetでマッピングされます.
私のプレーヤーは処理コードを入力してUnityのInputクラスを書きました.
その結果、リソースにマッピングされたキーを変更するたびにコードを変更する必要があるという問題が発生します.
最初に、イベントを入力する条件は、次のコードに示すように、Input ActionクラスでサポートされているIsPressed()です.
IsPressed()はしばらく押していましたが、しばらくはtrueだったようで、
私のコードは押した時に一度しかコールバックされないので、別の方法を探してみました.
入力の開始、実行、キャンセルポイントでイベントを登録する方法を知りました
Inputアクションを開始/実行/キャンセルします.CalbackContext
https://docs.unity3d.com/Packages/[email protected]/api/UnityEngine.InputSystem.InputAction.html
次にunityの例を示します
(*参考まで:リズムゲームリソースでサポートされているInput ActionList)
Input ActionAssetは確かに既存のInput Classよりも面倒で、よく知られていません.
現在のゲームで使用されているInputを管理すると良いかもしれません
特にダイヤルバックを登録することができ、あるキーを押すと何が起こるかをよりよく把握することができます.
また,以前にInput Classを用いた場合,2つの鍵を同時に入力することは困難であった.
Input ActionAssetを使用すると、よりきれいになります
実際、人間は1つのフレーム内で同時に2つのキーを正確に押すことは難しい.
GetKey()とGetKeyDown()を使うにはまだ足りません
もっと汚くするためにはelseifをしなければなりません
コード自体はもっと長いと思われるかもしれませんが、if-elseifはif文に減少します.
ComboAttack()も一度だけ呼び出すだけで、実際のコードもきれいに見えます
minjujuu.log:[Unity]2つの入力を同時に受け入れる Unity: Class Input Action
現在使用されているリズムゲームリソースでは、
入力イベントはInput ActionAssetでマッピングされます.
私のプレーヤーは処理コードを入力してUnityのInputクラスを書きました.
その結果、リソースにマッピングされたキーを変更するたびにコードを変更する必要があるという問題が発生します.
Input Action : IsPressed()
最初に、イベントを入力する条件は、次のコードに示すように、Input ActionクラスでサポートされているIsPressed()です.
// 유니티 예제 코드
var up = playerInput.actions["up"];
if (up.IsPressed())
transform.Translate(0, 10 * Time.deltaTime, 0);
以前使用したInput.GetKeyDown()は、更新時に一度コールバックされます.IsPressed()はしばらく押していましたが、しばらくはtrueだったようで、
私のコードは押した時に一度しかコールバックされないので、別の方法を探してみました.
入力の開始、実行、キャンセルポイントでイベントを登録する方法を知りました
Input Action : started
Inputアクションを開始/実行/キャンセルします.CalbackContext
https://docs.unity3d.com/Packages/[email protected]/api/UnityEngine.InputSystem.InputAction.html
次にunityの例を示します
action.started += context => Debug.Log($"{context.action} started");
action.performed += context => Debug.Log($"{context.action} performed");
action.canceled += context => Debug.Log($"{context.action} canceled");
上と同じですが、私はこのように使っています.private InputAction inputAction_track1;
void Start()
{
inputAction_track1 = inputHandlerInTrack.keyMapping[0].action; // 리듬게임 에셋에서 InputAction 받아옴
inputAction_track1.started += context => { Attack(); }; // 콜백 이벤트 등록
}
(*参考まで:リズムゲームリソースでサポートされているInput ActionList)
Input ActionAssetは確かに既存のInput Classよりも面倒で、よく知られていません.
現在のゲームで使用されているInputを管理すると良いかもしれません
特にダイヤルバックを登録することができ、あるキーを押すと何が起こるかをよりよく把握することができます.
また,以前にInput Classを用いた場合,2つの鍵を同時に入力することは困難であった.
Input ActionAssetを使用すると、よりきれいになります
同時に2つの入力を受信
Input Classバージョン
実際、人間は1つのフレーム内で同時に2つのキーを正確に押すことは難しい.
GetKey()とGetKeyDown()を使うにはまだ足りません
もっと汚くするためにはelseifをしなければなりません
void Update()
{
if(Input.GetKey(KeyCode.LeftArrow) && Input.GetKeyDown(KeyCode.RightArrow))
{
ComboAttack();
}
else if(Input.GetKeyDown(KeyCode.LeftArrow) && Input.GetKey(KeyCode.RightArrow))
{
ComboAttack();
}
}
Input Action Assetバージョン
コード自体はもっと長いと思われるかもしれませんが、if-elseifはif文に減少します.
ComboAttack()も一度だけ呼び出すだけで、実際のコードもきれいに見えます
private bool isPressed_Track1 = false;
private bool isPressed_Track2 = false;
void Start()
{
inputAction_track1.started += context => { isPressed_Track1 = true; };
inputAction_track2.started += context => { isPressed_Track2 = true; };
};
void Update()
{
// Track 1 & 2
if (isPressed_Track1 && isPressed_Track2)
{
isPressed_Track1 = false;
isPressed_Track2 = false;
ComboAttack();
}
};
次の記事には、Input Classを使用したコードの詳細が記載されています.minjujuu.log:[Unity]2つの入力を同時に受け入れる
リファレンス
Reference
この問題について(Unity]InputアクションでIsPressed()とstartedイベントを使用), 我々は、より多くの情報をここで見つけました https://velog.io/@minjujuu/Unity-Input-Action에서-IsPressed와-started-이벤트-사용하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol