Unity]InputアクションでIsPressed()とstartedイベントを使用


Unityの代わりにInput Actionクラスを使用するInputクラス
現在使用されているリズムゲームリソースでは、
入力イベントは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つの入力を同時に受け入れる

リファレンス

  • Unity: Class Input Action