ゲームコントローラー(Unity6)

開発Tips

キーボードでいろいろやっていくのが大変になったのでコントローラーの入力を実装していく。

Window -> Package Manager
からUnity Registryにある「Input System」を確認、インストール済み(Installed)でした。

もしインストールされていなかったらインストールを行う。

PlayerのInspectorから「Add Component」Input -> Player Input
を選択する。

Unityがコントローラーを認識しているかは
Window -> Analysis -> Input Debugger
で確認できます。

Player Inputのプロパティ

詳しくはUnityのドキュメントを確認してください。

Input System | Input System | 1.11.2

作成されたInputSystemがAssetsの中に入っているので見てみます。

デフォルトである程度キーがマッピングされています。

画像ではMoveを選択しています。Action Typeは以下の3つ

  • Value ・・・ 入力は値で取得、スティックなどは傾きで細かい値が取得できるのでこれを使うとよい
  • Button ・・・ ボタンを押したか押されたかを判定する、0と1でした判定しない。
  • Pass Through ・・・ Valueと同様に値を取得します。ただし、Valueと違い複数デバイスの時に曖昧さの解消をしません。キーボードでD(右移動)ゲームパッドで左を同時に入力した場合、アクションは2回発生します。煩雑になるのでValueをオススメします。

細かい説明は以下

Enum InputActionType | Input System | 1.11.2

Control Typeは、入力されるタイプを指定しますが、基本は特殊なゲームパッドでない限りVector2でよいと思います。

入力キーの取得

Player InputのInspectorを見てみます。そうするとBehaviorにSend Messageがデフォルトで設定されています。

Behaviorとはふるまいを意味していて入力があったとき、何をする?ということです。初期値は「Send Message(メッセージを送ります)」となっています。

Player Inputに何かしらの入力があるとBehaviorの下にあるOn~が呼び出されるということです。例えばAttackに割り当てられているボタンを押すとOnAttack関数を呼びますよ。ってことです。

  • Send Message ・・・ ゲームオブジェクトにアタッチされているすべての MonoBehaviour にある メソッドを呼び出します。
  • Broadcast Message ・・・ ゲームオブジェクトまたは子オブジェクトにあるすべての MonoBehaviour を継承したクラスにあるメソッドを呼び出します。
  • Invoke Unity Events ・・・ 自分で各入力に対し、関数を割り当てます。
  • Invoke C Sharp Events ・・・ C#のデリゲートにて処理します。

ここでは、Send Messageでやっていきたいと思います。

移動を実装してみる(OnMove)

PlayerInputと同じオブジェクトのinspector上にMonoBehaviourを継承したクラスを作成します。
そのクラスにOnMoveのイベント関数を記載するだけです。

private void OnMove(InputValue value)
{
    // Moveの入力値を取得
    var axis = value.Get<Vector2>();

    //走るスピードを最大値とする
    movementX = axis.x * run_speed;        
}

void Update()
{
    MovePlayer(movementX);
}

private void MovePlayer(float speed)
{

    //キャラクターの移動
    transform.position +=  transform.right * Time.deltaTime * speed;

    //移動方向を向く
    if (speed < 0)
    {
        character.transform.rotation = Quaternion.Euler(0, -90, 0);  //左を向く
    } else {
        character.transform.rotation = Quaternion.Euler(0, 90, 0);  //右を向く
    }

    //animatorにパラメータをセットする
    animator.SetFloat("move", Mathf.Abs(speed));                                   
}

ゲームパッドの左スティックを動かすとこの関数が呼び出されます。左スティックの値が変わるたびに呼ばれます。

ちなみに、横スクロールアクションを作っているので、横の移動分しかとっていません。
updateでmovementX 移動するという処理を行っています。

※ 説明とは関係のないところは、表示していないので注意してください。

攻撃を実装してみる(OnAttack)

Action TypeがButtonの場合もみていきます。

interactionsの設定をしていなければ取得する値はありませんので引数はなしで大丈夫です。
interactionsの設定をして押した(Press)、離した、押している(Hold)を取得したい場合は、パラメータが必要です。

private void OnAttack()
{
    animator.SetTrigger("attack");
}

※ 説明とは関係のないところは、表示していないので注意してください。

こんな感じになりました。まあ動画だと入力が見えないので何とも言えないですが・・・左スティックの傾きで移動量を調整しています。

コメント

タイトルとURLをコピーしました